Compare commits

...

3399 Commits

Author SHA1 Message Date
Harald Bamberger cb7a0f7669 Merge branch 'feature-70376/Lohnguide' 2026-05-13 11:53:14 +02:00
Harald Bamberger 68d97a5e97 handle case where old value or new value and not both are null explicitly in markDirty Method 2026-05-13 11:42:25 +02:00
Harald Bamberger d27071528f revert change to comparision in markDirty Method 2026-05-13 11:16:18 +02:00
Harald Bamberger 17772c3738 Merge branch 'master' into feature-70376/Lohnguide 2026-05-13 11:15:07 +02:00
Harald Bamberger bbb4f8a01c Merge branch 'bug-76146/studvw_karteireiter_dokumente_akzeptiert_eintraege_ohne_vorhandenes_dokument' 2026-05-06 16:13:50 +02:00
Harald Bamberger fdbb93a5c5 bugfix download booking receipt failed. only fetch oehbeitrag from bis.tbl_oehbeitrag if a user is logged in 2026-05-05 14:36:07 +02:00
Harald Bamberger b7e48633ab Merge branch 'master' into bug-76146/studvw_karteireiter_dokumente_akzeptiert_eintraege_ohne_vorhandenes_dokument 2026-05-05 13:33:38 +02:00
Harald Bamberger 04dc1eb07b Merge branch 'bug-76519/StudVW_Messages_Table_column_Stati' 2026-05-05 13:04:58 +02:00
Harald Bamberger 50b229090b prefetch phrases and then render filter component instead of redrawing the table 2026-05-05 13:04:11 +02:00
Harald Bamberger 2d27a998c4 Merge branch 'bug-76109/VVW_Details_und_Status_not_Loading' 2026-05-05 11:17:49 +02:00
Harald Bamberger 090e535466 add header filters, increase height of tables, use correct category for phrase lehreinheit_id 2026-05-05 11:04:48 +02:00
Harald Bamberger c4d35181db Merge branch 'master' into bug-76109/VVW_Details_und_Status_not_Loading 2026-05-05 09:01:49 +02:00
Harald Bamberger 0ac6ef4599 Merge branch 'feature-62607/konto_oh_beitrag_betrag_aus_eigener_tabelle' 2026-05-05 08:46:22 +02:00
Werner Masik 7f13c128f1 allow null value for vordienstzeit; changed comparison in markDirty to !== (because of 0 vs. null issue) 2026-05-04 20:35:51 +02:00
Harald Bamberger cb60ddcc94 Merge branch 'master' into feature-62607/konto_oh_beitrag_betrag_aus_eigener_tabelle 2026-05-04 15:41:52 +02:00
Harald Bamberger bd4ced9559 bugfix: comma as decimal separator prevents saving booking, bugfix messages tinymce not resizeable 2026-05-04 14:39:19 +02:00
Andreas Österreicher a04d2acb86 Fixed Blank on Phrase for Abgabetool 2026-05-04 10:49:33 +02:00
Harald Bamberger de2aabf00b readd dokument preview link to api response 2026-05-04 09:30:16 +02:00
ma0068 685fc69e5d update css and add provisional height 2026-04-30 18:02:38 +02:00
Werner Masik 58a921b500 changed lohnguide kommentar data type to text 2026-04-30 09:47:12 +02:00
Andreas Österreicher 552faefa51 Merge branch 'feature-76108/microdegree_abschlussurkunde' 2026-04-27 08:55:08 +02:00
Harald Bamberger 954397f028 Merge branch 'feature-70376/Lohnguide' 2026-04-22 18:52:51 +02:00
Harald Bamberger 80faa61c91 Merge branch 'master' into feature-70376/Lohnguide 2026-04-22 18:46:57 +02:00
Werner Masik 961ede66a9 lohnguide db update changed 2026-04-22 18:40:22 +02:00
Andreas Österreicher 6fec8382b5 Merge branch 'feature-76554/Personalmeldung_alt_bei_Lehre_nicht_melderelevant_rausfiltern' 2026-04-22 09:15:23 +02:00
Andreas Österreicher 4eb076d115 Fixed Saving of Entwicklungsteam 2026-04-21 17:34:36 +02:00
Harald Bamberger 7427aa87ea Merge branch 'feature-76545/findAbgabenNewOrUpdatedSinceByAbgabedatumFixTimestampDateComparison' 2026-04-21 17:01:04 +02:00
Johann Hoffmann 85043e57db added missing parenthesis 2026-04-21 17:00:07 +02:00
Johann Hoffmann 5beddbccb4 changed the where clause to a simpler = CURRENT_DATE comparison -> works the same if the job runs daily and fetches updates of one day/date; has to be changed back in case we want to find updates in a range larger than 1 day in an interval larger than 1 day; 2026-04-21 14:18:45 +02:00
kindlm e2ae9b88c8 Merge remote-tracking branch 'origin/master' 2026-04-21 12:56:30 +02:00
kindlm ca3abf9154 Small Style-Fix in Testtool
To make headings stand out more clearly from the buttons
2026-04-21 12:56:02 +02:00
Alexei Karpenko f863c6d728 personalmeldung legacy system: melderelevant is checked for lehre, bugfix: lehre is correctly added if studiengang already has sws 2026-04-20 18:24:30 +02:00
Harald Bamberger 92a2053b42 Merge branch 'feature-40870/BUG_Studstatus_unpause_order_should_be_DESC' 2026-04-20 17:30:14 +02:00
kindlm 70602be54e SaveSort und Filter-Reset in RaumÜbersicht 2026-04-20 11:30:17 +02:00
kindlm dac71f597a Spalte Anmeldedatum in RT-Übersicht
Spalte Frage_ID in RT-Administration
JQuery und Tabelsorter aus Include in Service_Uebersicht
2026-04-20 11:24:59 +02:00
Johann Hoffmann 3a646ffe77 adapt AbgabeJob relevant queries so they compare with the pgsql date function CURRENT_DATE instead of NOW() to avoid the cutoff from uploads the happened "yesterday but more than 24 hours ago"; also added another "abgabedatum < CURRENT_DATE" condition, to avoid sending this exact case as updates 2 days in a row; 2026-04-20 11:06:06 +02:00
ma0068 26db4a5e7a adding redraw tabulator and fallback to avoid empty column 2026-04-20 09:31:52 +02:00
Harald Bamberger 98a10a2f55 Merge branch 'feature-69389/AbmeldungSTGL_Anzeige_mit_Studiengangskuerzel' 2026-04-17 12:37:49 +02:00
Harald Bamberger e48b94b858 studiengangskuerzel statt kurzbzlang 2026-04-17 12:35:55 +02:00
Andreas Österreicher 0ff29ba6af Merge branch 'epic-56039/LV-Evaluierung' 2026-04-16 13:22:40 +02:00
Harald Bamberger ba543448ae Merge branch 'bug-76260/StudVW_Messages_TinyMCE_Cursor_Jumping_TextInput' 2026-04-16 11:26:32 +02:00
Harald Bamberger f121f9b5a2 deactivate pagination - since potentially msg threads are not shown completely 2026-04-16 11:23:57 +02:00
Harald Bamberger 88b22f5490 revert to v-if to not render element when not necessary and use Vue.nextTick for dependent code 2026-04-15 17:02:58 +02:00
Harald Bamberger 4b7ee9abe1 Merge branch 'feature-70376/Lohnguide' 2026-04-15 15:52:12 +02:00
Cristina d499619cf3 Added phrase endedatumMussInZukunftLiegen 2026-04-15 13:39:06 +02:00
Cristina f489153ff3 Merge branch 'master' into epic-56039/LV-Evaluierung 2026-04-15 12:25:05 +02:00
Cristina 9b79a07fa2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-04-15 12:24:44 +02:00
Harald Bamberger 6ce14a25d7 Merge branch 'master' into feature-70376/Lohnguide 2026-04-15 11:49:26 +02:00
Werner Masik c701d92779 fix db_update 2026-04-15 11:15:10 +02:00
Werner Masik 73e03ba901 Gehaltstyp Überstundenpauschale und Sachbezug PKW 2026-04-15 10:44:03 +02:00
ma0068 95a7797ae9 delete unused apicall for mode modal
add editor.setContent to function getReplyData
readd loadReplyData and use v-show for visibleDiv for mode inSamePage
2026-04-14 15:46:34 +02:00
ma0048 3ce3eff022 fehlendes mapping hinzugefuegt 2026-04-14 09:30:45 +02:00
ma0048 21d80905a2 akzeptierte dokumente anzeigen, auch wenn kein dokument vorhanden ist 2026-04-13 13:04:46 +02:00
Andreas Österreicher 3a91b12f31 Merge branch 'epic-56039/LV-Evaluierung' 2026-04-13 10:39:00 +02:00
ma0048 ea0a249612 micro degree abschlussdokumente hinzugefuegt 2026-04-13 09:14:27 +02:00
ma0068 843894405e changes for NewDiv
remove Watcher for formData Fields
add predefault settings for tabulator fields
add setContent for Editor
change text for closing window/tab
show alertSuccess for sending Message just in case of inSamePage
2026-04-10 13:03:24 +02:00
ma0068 8fddbc3a32 delete watcher for formData fields, add setContent for loading Vorlage 2026-04-10 09:15:34 +02:00
Harald Bamberger b2538075ee use STV_TAGS_ENABLED config when preparing sql statement for students list to query tags only if enabled 2026-04-07 10:35:06 +02:00
Werner Masik 5c463c0866 add vordienstzeit to lohnguide 2026-04-06 22:25:13 +02:00
Werner Masik 423bbd95a6 add vordienstzeit to lohnguide 2026-04-06 22:25:12 +02:00
Cristina 386cc779bf Merge branch 'master' into epic-56039/LV-Evaluierung 2026-04-02 15:49:20 +02:00
Cristina 08c6d58a50 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-04-02 14:24:39 +02:00
Cristina 3f53c5feba Added: method getKFLByUID to get Kompetenzfeldleitung by UID 2026-04-02 14:23:59 +02:00
ma0068 298dbbf400 use context vm for tabulator event, refactor function toggleRowClick, delete unused commented sections 2026-04-02 10:58:49 +02:00
Andreas Österreicher 2c057aad58 Updated Startup Dump to Final 3.3 Version 2026-04-01 13:00:50 +02:00
kindlm c2ce831bca Merge remote-tracking branch 'origin/master' 2026-03-26 11:43:59 +01:00
kindlm 21c1f13b28 Spalte "faktiv" (Foebis-Aktiv) im FAS 2026-03-26 11:43:20 +01:00
Andreas Österreicher e0079bb812 Merge branch 'feature-71665/mc4_vorlage' 2026-03-26 09:27:00 +01:00
Andreas Österreicher 966d1d10f6 Merge branch 'feature-71566/Studienordnung_Anpassungen_fuer_Programme_und_Lehrgaenge' 2026-03-26 09:05:31 +01:00
Andreas Österreicher 76936ad74f Merge branch 'feature-75703/BIS_Personalmeldung_Lehrgaenge' 2026-03-26 08:31:13 +01:00
Harald Bamberger 6fbb09eb6e group or clause 2026-03-25 16:32:43 +01:00
Harald Bamberger cfe1307018 Merge branch 'feature-68530/Dashboard_Cleanup_Admin' 2026-03-25 15:37:34 +01:00
Harald Bamberger 5139c3e44e use array_replace_recursive instead of array_merge_recursive to prevent two scalar values being merged to an array 2026-03-25 15:15:05 +01:00
Harald Bamberger 627a52e3d1 Merge branch 'master' into feature-70376/Lohnguide 2026-03-25 09:36:27 +01:00
chfhtw 1951cd6fa8 split/rename dashboard api factories 2026-03-24 16:08:02 +01:00
chfhtw e3093bdf3f get magic funktionen (Mitarbeiter, Student) as dashboard presets 2026-03-24 15:15:36 +01:00
chfhtw b11d8d056a get access rights from permissionlib 2026-03-24 15:15:12 +01:00
chfhtw 3a4015eced dashboard useroverwrite: remove doubles in other funktionen 2026-03-24 15:15:04 +01:00
chfhtw aeb5d40840 rename api endpoints 2026-03-24 15:14:39 +01:00
Alexei Karpenko 49c712a5b6 Personalmeldung sws: rounding to 2 decimals 2026-03-24 13:57:23 +01:00
Harald Bamberger 46817b846a fix e.g. long lines of underscores in cms content 2026-03-24 13:29:20 +01:00
Harald Bamberger 8c75608eaf add menu entry for Dashboard Admin 2026-03-24 13:21:50 +01:00
chfhtw 2720ed9ffb timezone from global object 2026-03-24 11:00:09 +01:00
chfhtw 2fc392c084 refactor dashboards Preset->addWidgets to (single) Preset->addWidget 2026-03-23 16:05:22 +01:00
chfhtw ca630e94ae remove debug line 2026-03-23 15:46:13 +01:00
chfhtw 9cff50fa3b extract preset logic from dashboard admin api 2026-03-23 15:44:42 +01:00
chfhtw 3d7a6b1ad3 dashboard user api: empty -> check for false/null 2026-03-23 15:42:28 +01:00
chfhtw f15fd40636 dashboardlib bug: array <=> stdclass 2026-03-23 15:41:32 +01:00
chfhtw 054cf2f258 correct form validation & typo in api dashboard widget 2026-03-23 15:06:25 +01:00
chfhtw dc067a619b make widgets resizeable in dashboard admin 2026-03-23 14:07:31 +01:00
chfhtw 2a762fa4ab add renderers & timezone to dashboard admin for calendar widget 2026-03-23 13:22:30 +01:00
chfhtw ccade6ae0e rename dashboard admin controller and views 2026-03-23 11:47:28 +01:00
chfhtw 6971aed030 parsing happens in backend not frontend 2026-03-23 11:46:45 +01:00
chfhtw 60e556b2a8 wrong case 2026-03-23 11:33:45 +01:00
chfhtw 42fbbc5257 remove unused file 2026-03-23 11:28:31 +01:00
chfhtw d01dedb79c remove unused file 2026-03-23 11:23:01 +01:00
chfhtw 1972b461e7 replace controllers/dashboard/Config.php with controllers/api/frontend/v1/dashboard/User.php & controllers/api/frontend/v1/dashboard/DashboardAdmin.php 2026-03-23 11:21:15 +01:00
chfhtw e957926a4d replace controllers/dashboard/Widget.php with controllers/api/frontend/v1/dashboard/Widget.php 2026-03-23 10:57:43 +01:00
chfhtw bac2c13da3 viewData is mandatory so we dont need to load it if its not set 2026-03-23 10:44:39 +01:00
ma0068 b90c26412a DB update: new Organisationseinheittyp Programm 2026-03-20 13:06:16 +01:00
chfhtw 65c7ad2aac use correct error handling in FhcApi in case of success 2026-03-20 12:29:01 +01:00
chfhtw 126a2d3b7b add deepToRaw function to helpers/ObjectUtils 2026-03-20 11:23:35 +01:00
Harald Bamberger 60734f708e Merge branch 'master' into feature-68530/Dashboard_Cleanup_Admin 2026-03-19 16:20:06 +01:00
Harald Bamberger 9e6c15a10d Merge branch 'bug-76010/StudVW_Archivieren_Ausbildungsvertrag_Aufgenommene' 2026-03-19 15:41:44 +01:00
Harald Bamberger 14a8e2f001 Funktionen fett schreiben, die schon presets hinterlegt haben, demo aus views und Controller namen entfernen, preview hinzufuegen 2026-03-18 15:48:57 +01:00
ma0068 7603f8f12b Bugfix: use null instead of empty string, provide kuerzel 2026-03-18 14:32:09 +01:00
Harald Bamberger 059b13938e Merge branch 'master' into feature-70376/Lohnguide 2026-03-18 11:46:27 +01:00
Harald Bamberger a4f2502fe6 dashboard admin: funktionen sortieren, allgemein/general wieder hinzufuegen 2026-03-18 10:58:05 +01:00
Harald Bamberger 7c1762d467 Merge branch 'master' into feature-68530/Dashboard_Cleanup_Admin 2026-03-18 09:20:53 +01:00
Andreas Österreicher 96745525f1 Merge branch 'feature-71530/Error_beim_Archivieren_von_Diplomasupplement_STUDVW_Neu' 2026-03-16 11:28:56 +01:00
Andreas Österreicher 8d6e04ea77 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-03-16 11:09:52 +01:00
Andreas Österreicher d9e5acb52c Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-03-16 11:08:44 +01:00
Johann Hoffmann 6ec32b0ca3 update tabulator persistence id 2026-03-16 11:05:48 +01:00
Johann Hoffmann 4778bb82c3 assistenz action buttons lefthand alignment & lower minwidth 2026-03-16 10:56:51 +01:00
Andreas Österreicher e20ff52f5b Merge branch 'feature-75417/pep_finetuning' 2026-03-16 09:08:10 +01:00
Andreas Österreicher df05af98d2 FHB - Markierung von Outgoing ohne Endedatum 2026-03-16 09:01:33 +01:00
Harald Bamberger 0764a597af do not allow foto editing in contract management 2026-03-12 15:18:26 +01:00
Harald Bamberger 8c36fe585a filter component add missing this 2026-03-12 15:09:46 +01:00
Johann Hoffmann 5ef1dccfc9 added missing phrase c4noZuordnungBetreuerStudent 2026-03-12 14:58:35 +01:00
Harald Bamberger d4b81da437 fix filter component also consider tabulator 6 selectableRows option to determine if tabulator has selector 2026-03-12 14:34:42 +01:00
Harald Bamberger b91efb6189 stv notizperson fix permission check to be able to add notes to prestudents that do not have an uid 2026-03-12 13:56:03 +01:00
Johann Hoffmann 6d28b8986d Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektbetreuer.js
2026-03-12 09:47:54 +01:00
kindlm 40757322e7 Spalte "FGM" (Förder-Guthaben-Monate) bei Prestudentstatus einblendbar 2026-03-11 17:52:31 +01:00
Johann Hoffmann b43f1ec920 AbgabetoolAssistenz download latest uploaded file action button; UX changes Projektarbeit Tab Stv; fix stv form input bug after invalidation for selects; 2026-03-11 17:00:56 +01:00
Harald Bamberger 6cd4aebe8d stv projektarbeit projektbetreuer use correct ref 2026-03-11 14:54:06 +01:00
Andreas Österreicher 2b527bccd2 Merge branch 'feature-75873/Noteneingabe-Punkte' 2026-03-11 13:42:17 +01:00
Andreas Österreicher 41271711ec Merge branch 'bugfix-55630/Falsche-Nachpruefungsdaten-auf-Notenliste-bei-Wiederholern' into feature-75873/Noteneingabe-Punkte 2026-03-11 13:26:46 +01:00
Harald Bamberger 6287b6aef8 Merge branch 'feature-68296/Vue_Router_via_Extensions_erweitern_ma0080' 2026-03-11 13:19:02 +01:00
Harald Bamberger 3e9d960781 Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-03-11 12:52:18 +01:00
Alexei Karpenko c3d20bb181 Personalmeldung Lehrgaenge: distributed sws among Lehrgang types (Zertifikat, Master etc...) 2026-03-11 12:37:28 +01:00
Harald Bamberger 5ce0232890 fix bug in archiv tab 2026-03-11 11:50:09 +01:00
Harald Bamberger cf4ec12c00 Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-03-10 17:08:03 +01:00
Andreas Österreicher d35eca919f Merge branch 'hotfix-69228/DOCSBOX' 2026-03-10 13:53:58 +01:00
Harald Bamberger 61d133b2fd Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-03-10 12:14:35 +01:00
Andreas Österreicher 7cd438d188 Wenn Punkteeingabe aktiviert ist werden auch Punkte in der Excel Notenliste exportiert damit es beim Import von Spezialnoten (zb 18) nicht zu Problemen kommt 2026-03-10 11:47:24 +01:00
Harald Bamberger a733d9a861 Merge branch 'vv_und_studvw_2026_02_rc4_ma0080' 2026-03-10 11:37:34 +01:00
Harald Bamberger 33252de895 use ma0646 tabulator scroll fix on students/prestudents list 2026-03-10 11:11:40 +01:00
Harald Bamberger fb388346bf Merge branch 'master' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-10 08:41:56 +01:00
Harald Bamberger 32a2e7708f remove bg color in stv and lvvw Tabs, detailsheader ajust foto buttons 2026-03-09 12:10:22 +01:00
Werner Masik 6b816def31 add lohnguide to vertragsbestandteil SQL 2026-03-05 15:34:51 +01:00
Werner Masik 5fbcf588ed fix vertragsbestandteil lohnguide 2026-03-05 14:29:56 +01:00
Harald Bamberger c40fdb2c4f getMessagesForTable laststatus only for filteredmessages 2026-03-05 11:35:57 +01:00
Harald Bamberger 47b5eecb9b Merge branch 'master' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-04 18:57:13 +01:00
Harald Bamberger b7fd7e4298 Merge branch 'vv_und_studvw_2026_02_rc4' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-04 17:53:53 +01:00
Harald Bamberger 1af334989e Merge branch 'feature-71601/drag_drop_aus_tabulator_heraus_ohne_vorheriges_selektieren' into vv_und_studvw_2026_02_rc4 2026-03-04 17:53:19 +01:00
Harald Bamberger 4f541495ad Merge branch 'feature-71610/verbandsbaum_togglen_ohne_select' into vv_und_studvw_2026_02_rc4 2026-03-04 17:25:32 +01:00
Harald Bamberger 35d83942c0 use primevue tabs in LVVerwaltung 2026-03-04 16:03:51 +01:00
Alexei Karpenko fc4e79c1f5 Personalmeldung: include Lehrgaenge in Lehre in legacy script 2026-03-04 11:12:58 +01:00
Werner Masik 41b2a6d1d4 added db migration for lohnguide 2026-03-04 10:53:30 +01:00
Harald Bamberger 1810bd40bd fix bug introduced in commit 043b1bcf11 send intern also using private email addresses 2026-03-04 09:39:58 +01:00
Harald Bamberger 5347cb1d63 add config STV_TAGS_ENABLED and use it to enable or disable tags in StudVw 2026-03-03 17:15:23 +01:00
Harald Bamberger 77731ed559 Merge branch 'feature-68767/FHC4_Studierendenverwaltung_Details_4spaltig_ma0080' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-03 13:46:29 +01:00
Harald Bamberger 0283c6ca43 bg-color in details, padding-y tabs, messages align table and preview area 2026-03-03 12:24:34 +01:00
Werner Masik e054f1222b basic model and factory for lohnguide 2026-03-03 11:50:45 +01:00
Andreas Österreicher 8abb38123a Merge branch 'feature-70440/Change_var_dump_to_error_log_to_show_the_referring_script' 2026-03-03 11:41:16 +01:00
Andreas Österreicher d1928d4151 Merge branch 'bug-56209/is_valid_date_vs_isValidDate' 2026-03-03 11:29:29 +01:00
Andreas Österreicher bcd8f11f35 Fixed Merge Problem 2026-03-03 11:26:18 +01:00
Andreas Österreicher 5949527ee2 Merge branch 'master' into bug-56209/is_valid_date_vs_isValidDate 2026-03-03 11:07:18 +01:00
Johann Hoffmann 56a6aa993e getMitarbeiterProjektarbeiten safeguard in case a person without any assigned betreuungen opens the page for some reason to avoid nasty confusing sql error messages from querying with empty parameters 2026-03-03 10:52:12 +01:00
Andreas Österreicher ea19ba099e Merge branch 'bug-70950/Coodle_ICS_Organizer_falsch' 2026-03-03 10:44:55 +01:00
Johann Hoffmann db75cd2f62 also skip email loop/relevant abgaben loop when every occurance is filtered out to avoid empty notification emails; 2026-03-03 10:42:47 +01:00
Cristina c57eb1b8de Adapted method getLvLeitung: filter Dummy and allow only active Benutzer/Person 2026-03-02 11:00:05 +01:00
Harald Bamberger 28f4a38752 refactor helper function extendableApps to singleton helper class ExtendableAppsHelper and use it in FHC-Header and FHC-Footer, revert previous changes to other CI views 2026-02-27 16:50:50 +01:00
Andreas Österreicher 8495c74a7d Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-27 10:48:35 +01:00
Harald Bamberger 43a37021a5 ensure extend_app js files from extensions are loaded directly before the apps js file 2026-02-27 09:24:47 +01:00
Johann Hoffmann abeb411742 betreuer email button config 2026-02-26 18:00:14 +01:00
Johann Hoffmann aa2334afe7 sammelmail button betreuer page; fix notenOpt retrieval in setDetailComponent for Betreuer when reopening detailView; $emit("paUpdated") after savingTermin/deletingTermin to update projektarbeit in overview table aswell; 2026-02-26 17:58:48 +01:00
Harald Bamberger 667a00d64b Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-02-26 16:05:32 +01:00
Harald Bamberger 4deed45f29 prepend extend_app js to customJSModules array, use FhcApps in Dashboard/Fhc App 2026-02-26 15:53:41 +01:00
Harald Bamberger 1ae072390e revert changes to add fhcApps property, not using path based syntax, to CI views include array 2026-02-26 15:27:52 +01:00
Andreas Österreicher 9eb2cb847d Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-26 15:06:42 +01:00
Harald Bamberger 26fca87c75 refactor VueJs App magic into a helper function 2026-02-26 14:56:33 +01:00
ma0048 f3986688f2 selfoverview:
nur aktive kategorien anzeigen
uebersetzungen hinzugefuegt
2026-02-26 12:50:37 +01:00
Johann Hoffmann 859cb39a9d EmailJobs log & skip cases where no benutzer_uid email and no private email is available 2026-02-26 11:36:06 +01:00
Johann Hoffmann 4e2c3f7741 show qgate benotungsstatus of saved note, not currently selected note 2026-02-26 11:18:27 +01:00
ma0048 f1dbc6ab7d mc4 vorlage hinzugefuegt 2026-02-25 14:46:15 +01:00
Johann Hoffmann 325c84e6fe phrasen consistency "Short description of the submitted file" -> "Short description of the submitted document" + "Type of document submitted" 2026-02-25 13:31:00 +01:00
Johann Hoffmann 379880aef8 filter paabgabe uploads from newOrChanged job, since uploading a file still writes updateamum/updatevon fields -> compare student_uid with updatevon; when logging new paabgabe termine insert the whole paabgabe object into the logs, not just the result id; 2026-02-25 13:10:30 +01:00
Johann Hoffmann 16186bbee8 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-02-25 11:09:50 +01:00
Cristina d1015956d1 Merge branch 'master' into epic-56039/LV-Evaluierung 2026-02-25 10:54:29 +01:00
Cristina 726fce9fac Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-02-25 10:52:50 +01:00
Harald Bamberger ee0fa9f7d4 studvw reduce height of elements e.g:
- tabulator header filter
 - tabulator rows
 - form input and select
 - primevue autocomplete
 - primevue tabs
2026-02-24 17:23:50 +01:00
Harald Bamberger 7680a5c773 add bpk to api output if authuser has permission 2026-02-24 17:19:49 +01:00
Johann Hoffmann 1e827fffee additional erstbetreuer/zweitbetreuer name parts fetch & columns default invisible, columns next/prev termin header filter & custom sort func, list header filter for qgate 1/2 status assistenz & mitarbeiter, change all "Assessor" and "Assesor" phrasen to "Reviewer" 2026-02-24 15:58:44 +01:00
Harald Bamberger 0468b2b523 Merge branch 'master' into feature-68767/FHC4_Studierendenverwaltung_Details_4spaltig 2026-02-23 16:56:07 +01:00
Paolo d6108d816e Merge branch 'master' into hotfix-69228/DOCSBOX 2026-02-23 14:28:54 +01:00
Paolo f274b74ab1 Merge branch 'master' into feature-70440/Change_var_dump_to_error_log_to_show_the_referring_script 2026-02-23 14:25:40 +01:00
Paolo 029c51c2b2 Merge branch 'master' into bug-70950/Coodle_ICS_Organizer_falsch 2026-02-23 13:36:17 +01:00
Paolo 356a5fb51b Merge branch 'master' into bug-56209/is_valid_date_vs_isValidDate 2026-02-23 13:03:06 +01:00
Andreas Österreicher 9b114c5fb1 Merge branch 'feature-71344/LVEvaluierungZeitfenster' 2026-02-23 09:51:47 +01:00
Harald Bamberger 00fae2fa15 Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-23 09:28:54 +01:00
Johann Hoffmann 6c8eb9ac38 abgabetool dbupdate script check&insert new tbl_vorlage entry "PAANoSigAssSM" 2026-02-20 13:56:11 +01:00
Andreas Österreicher 2228b4d683 Sancho Header LV-Evaluierung 2026-02-20 13:29:01 +01:00
Johann Hoffmann 5558f6fc17 Signatur Sammelmail Job an Assistenz 2026-02-20 12:20:26 +01:00
kindlm 32fc029bd3 Merge remote-tracking branch 'origin/master' 2026-02-20 11:20:19 +01:00
kindlm f4e0516d89 Prüfung ob jede Fragen mindestens 2 Vorschläge hat auf Warning geändert
- Kleines Padding vor "Blättern"-Text
2026-02-20 11:20:09 +01:00
Harald Bamberger d98b7fd67a fix duplicates in lvplan for special groups 2026-02-19 18:34:27 +01:00
Johann Hoffmann 4b1a9fe892 avoid loading paabgaben a 2nd time for mitarbeiter; extracted getDateStyleClass from components; 2026-02-19 17:33:41 +01:00
ma0068 118dcbd252 remove testoutput 2026-02-19 15:45:34 +01:00
ma0068 d279f955a0 add emit-event for resetFilter 2026-02-19 15:12:38 +01:00
ma0068 1e8ec83965 add tileUid to StudentHeader, show Tiles only for selection of 1 student, just allow single selection of Mitarbeiter in MitarbeiterHeader 2026-02-19 11:57:28 +01:00
Harald Bamberger f2d49e02a7 Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-19 09:49:44 +01:00
Harald Bamberger 7169cb68a2 fix bug when sending multi messages introduced by loading time optimisation 2026-02-19 09:20:10 +01:00
Harald Bamberger f8da0b0915 Merge branch 'feature-69551/Einmeldeformular_als_VueJS_Component_fuer_LV-Evaluierung' 2026-02-19 07:46:15 +01:00
Alexei Karpenko f068b56083 PlausiIssueProducer: removed debugging output and die 2026-02-18 22:30:29 +01:00
Alexei Karpenko fa7a125727 Studierendenverwaltung archivieren: error message when no studentlehrverband found 2026-02-18 21:18:57 +01:00
Johann Hoffmann 4724008c2d betreuer page update table after adding serientermin qgate1/2 status prev/next; preserve scrollX/Y in betreuer/assistenz page 2026-02-18 14:32:57 +01:00
ma0068 34cd5d1a80 Filter List: only emit to updateURL if there is final dropdown result or change 2026-02-18 13:17:37 +01:00
Johann Hoffmann 6f28696556 getDateStyleClass evaluation also with precise luxon calculation on all pages; qgate12 status col, next/prev termin col on betreuer page; table persistence on mitarbeiter page; same rowheight on betreuer table as in assistenz to achieve similar UX; 2026-02-18 13:00:19 +01:00
Andreas Österreicher 6ec4737b22 Merge branch 'bug-71685/bewerbungstool_login_zugangscode' 2026-02-18 12:47:02 +01:00
Johann Hoffmann 328affa35c actually set deadline calculation to IANA timezone 'Europe/Vienna', so the code still works once Berlin moves to another timezone away from Austria. You never know. 2026-02-18 11:53:24 +01:00
ma0068 4b875bf019 also show filterActiveModule for HeaderFilters, change colour to red 2026-02-18 11:27:14 +01:00
Johann Hoffmann 90c845899f explicitely set deadline to end of day to achieve the desired "valid until 23:59" logic, instead of just moving the deadline by one day; endupload deadline is now optional by defining it as a "nachreichen möglich" aka non fixtermin; 2026-02-18 11:15:59 +01:00
Andreas Österreicher bb273d10bd Merge branch 'bug-71662/Bug_cancelVertrag_Berechtigungspruefung' 2026-02-18 10:50:59 +01:00
Johann Hoffmann a6daa7bf0c all abgabetool datepickers use date format via format="dd.MM.yyyy" instead of :format="formatDate" to enable text-input + autoapply; backend deadline datetime check for endupload; 2026-02-17 17:32:11 +01:00
ma0068 f0597e99e5 VV: update persistanceId 2026-02-17 16:51:56 +01:00
ma0048 1d8c4b7159 bug behoben, login wieder nur mit zugangscode moeglich 2026-02-17 16:49:09 +01:00
ma0068 f860fd3dc7 Studvw: update persistance_id for all tabs 2026-02-17 16:46:22 +01:00
Johann Hoffmann ee7254a964 assistenz preserve table state (selection, scroll) when adding serientermin; update isPastDate() function to luxon timezone safe logic; 2026-02-17 16:22:26 +01:00
ma0068 5ffd22c1f7 refactor last tabs from updateDefinition to setHeader variante 2026-02-17 16:11:43 +01:00
Alexei Karpenko c58674d133 Projektarbeiten cancelVertrag permission check bugfix (added array_column to get oes) 2026-02-17 15:15:30 +01:00
Harald Bamberger 006393704c Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-17 12:17:15 +01:00
Harald Bamberger 4825c75b5d revert changes made in commit b1a1cdf235 2026-02-17 12:11:37 +01:00
Harald Bamberger d82c186643 Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-17 11:23:18 +01:00
ma0048 2f51f18447 studierende in die gruppe ziehen ohne vorheriges selektieren 2026-02-17 11:16:44 +01:00
ma0048 5b34a226bd verbandsbaum nur toggeln und nicht automatisch selektieren 2026-02-17 11:09:54 +01:00
ma0068 1c69f3f654 VV: refactor Modal, change height of Table Unassigned Contracts 2026-02-17 10:31:45 +01:00
Harald Bamberger f6fd5ab678 Merge branch 'feature-71645/StudVw_MessageTab_Ladezeit' 2026-02-17 10:29:10 +01:00
Harald Bamberger 3d1aef617f add phrase error.opproject_does_not_exists in category kvp 2026-02-17 08:13:07 +01:00
Harald Bamberger e12b7e1ed5 add indexes for person_id to table msg_message and msg_recipient, ensure tabulator data request is made before requests of create msg components 2026-02-17 08:06:30 +01:00
ma0068 d9d3b1a245 VV: show Details und Status only if one Vertrag is selected 2026-02-17 07:58:03 +01:00
ma0068 ce27964df9 Detailheader VV and StudV: show - if no value for Tile 2026-02-16 16:46:46 +01:00
Harald Bamberger 0496eb7cc9 use union instead of or to avoid parallel seq scan 2026-02-16 15:56:40 +01:00
ma0068 556683574c Ignore typing inside editable elements for handling of keyboards event in function onKeydown 2026-02-16 15:44:01 +01:00
Harald Bamberger 962cbf4e78 join person table for sender and recipient instead of using subselect 2026-02-16 15:16:49 +01:00
Harald Bamberger 5415180b2c fetch count and paginated data in one query 2026-02-16 14:18:59 +01:00
ma0068 9d789d9a97 Tab Messages: remove unused computed statusText 2026-02-16 10:37:15 +01:00
ma0068 3d061df1d7 merge master into feature-68767/FHC4_Studierendenverwaltung_Details_4spaltig 2026-02-16 10:05:45 +01:00
Andreas Österreicher 827b6148a7 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-16 08:47:30 +01:00
Johann Hoffmann 3831f3c1d7 consistent use of :optionDisabled="getOptionDisabled" for paabgabetyp dropdowns in assistenz view 2026-02-16 03:41:30 +01:00
Johann Hoffmann 60294dd8f2 paBenotet evaluation fix 2026-02-16 03:22:39 +01:00
Andreas Österreicher 9d5adc1ed2 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-13 13:58:30 +01:00
Johann Hoffmann 632866c8c4 reset newTermin object when switching projektarbeit so they are assigned to the correct student 2026-02-13 13:45:12 +01:00
Andreas Österreicher 7f029ec8b5 Merge branch 'einspielen_12_02_2026' 2026-02-13 11:20:22 +01:00
ma0048 d9d15c1ed3 neue tag farben 2026-02-13 11:10:16 +01:00
Harald Bamberger a9b343646e Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-13 10:49:09 +01:00
ma0068 fd35d20955 refactor VV: change handling of selections, allow only strg for multiselect in vetraegen and for adding unassignedVertraege 2026-02-13 09:24:36 +01:00
Paolo 34b00f8dd6 cis/public/coodle.php now produces the correct ORGANIZER:MAILTO: 2026-02-12 21:44:12 +01:00
Johann Hoffmann 043b1bcf11 extracted email split method from stv/kontakt component to helperfile; adjusted that method to take subject param & make phrasen/alert call via parameter reference; 2026-02-12 17:38:00 +01:00
Johann Hoffmann 5c1e967d5e dont reset z-index on opening tiered menu (email button) by setting its autoZIndex property to false 2026-02-12 16:05:02 +01:00
Harald Bamberger 664b0a81bb use vilesci base url in combinePeople component 2026-02-12 15:52:11 +01:00
ma0068 aec0e5227f get selection after reload of added or updated contract, remove selection, stati and details after delete 2026-02-12 15:09:51 +01:00
Harald Bamberger fa807f37ae gehaltsbestandteil chart data: spezialfall neuer Gehaltsbestandteil und sofort valorisiert 2026-02-12 14:47:07 +01:00
Harald Bamberger 8f62d0d351 use correct category for phrase notiz_edit 2026-02-12 13:20:54 +01:00
Harald Bamberger e016deb042 add more space between download and delete button 2026-02-12 13:14:23 +01:00
Harald Bamberger ed170645df use plsql function public.get_rolle_prestudent instead of local sql 2026-02-12 11:27:50 +01:00
Andreas Österreicher 3a441228b8 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-12 11:07:36 +01:00
Andreas Österreicher 0a97e5781e Nicht beurteilt aus Default Config entfernt 2026-02-12 11:02:16 +01:00
ma0048 3465e299f7 tag - helper and formatter 2026-02-12 08:16:31 +01:00
Andreas Österreicher 136d6f9f28 Fix von BFI übernommen 2026-02-11 16:08:15 +01:00
Johann Hoffmann 67838eb630 load projektarbeit.note correctly for mitarbeiter; evaluate projektarbeit termin editability correctly and define a notenarray which does NOT count (currently "Nicht beurteilt" & "Noch nicht eingetragen"). such rules apply for betreuer, assistenz is allowed to do whatever they want since we never defined an actual business process anywhere and people do whatever they want anyways 2026-02-11 13:39:23 +01:00
Johann Hoffmann 609e226057 place email buttons inside a tiered menu (dropdown for some) to save space in the ui; 2026-02-10 14:25:45 +01:00
kindlm ffaff361b7 Merge remote-tracking branch 'origin/master' 2026-02-10 11:51:24 +01:00
kindlm d17206fe40 Admin-Seite: Padding bei Vorschau; Login Bugfix Fallback STG-Name 2026-02-10 11:51:02 +01:00
Andreas Österreicher 34e8b2e36d Merge branch 'feature-69180/AnwUID4CSV' 2026-02-10 11:14:39 +01:00
Andreas Österreicher fbea5a9306 Merge branch 'master' into feature-69180/AnwUID4CSV 2026-02-10 11:02:20 +01:00
Johann Hoffmann 6da19585ff optional sammelmail buttons assistenz abgabetool 2026-02-09 13:45:01 +01:00
ma0068 e13a7069dc Studverwaltung: refactor from Tabulator5 to 6, reformat some date entries 2026-02-06 13:18:09 +01:00
Andreas Österreicher f4ae8dd8e1 Korrektur zur Ermittlung der (legacy) Anwesenheit von BFI übernommen 2026-02-06 13:10:31 +01:00
ma0068 1cd332115b Changes Vertragsverwaltung
- refactor from Tabulator 5 to Tabulator 6
- not reloading contract list after changes of Status or Detail to keep row selection
- Start reselection of current row
2026-02-06 10:38:29 +01:00
ma0068 0bf9d8fa8a Adaptions Detailheader: center Title and Values for Tiles, change size for mitarbeiterDetailHeader 2026-02-05 14:50:20 +01:00
ma0068 464f04b254 merge studvw_2026_02_rc4 in vv_und_studvw_2026_02_rc4 2026-02-05 11:57:03 +01:00
ma0068 2a63b99816 handle emit redirectToLeitung in parent 2026-02-05 11:50:43 +01:00
ma0068 2aca2cd6ab Custom Filter: change colour to green for filter symbol 2026-02-05 09:55:07 +01:00
ma0068 ee619004bd refactor tabulatorevents to avoid updateDefinitions (Tabs Betriebsmittel, Funktionen, Messages, Notizen, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Dokumente, Kontakt, Lehrveranstaltungstermine, Mobility, Prestudent, Pruefungen) 2026-02-05 09:41:15 +01:00
Johann Hoffmann 1eda652fba remove old code 2026-02-04 17:34:21 +01:00
Johann Hoffmann cc302ed5a1 lazyload signatur status for assistenz view to avoid worst case loading times due to 50 x 30mb signatur server payload 2026-02-04 17:32:17 +01:00
Andreas Österreicher f2308a32c8 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-04 11:37:57 +01:00
Johann Hoffmann c8cb484299 add missing email template public.tbl_vorlage inserts to checksystem script; checked template naming convention for higher case 2026-02-04 11:34:36 +01:00
ma0068 fc0fdc7909 Merge branch 'studvw_2026-02_rc4' of github.com:FH-Complete/FHC-Core into studvw_2026-02_rc4 2026-02-04 11:34:19 +01:00
ma0068 3053289146 Filter: change type filter Active, change position filter item, default values All Buchungstypen 2026-02-04 11:33:54 +01:00
Andreas Österreicher 7c67e65c9b Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-04 11:11:59 +01:00
Johann Hoffmann a4dcf9e935 use phrase c4betrart + pa.betrart_kurzbz for betreuer/zweitbetreuer: text 2026-02-04 11:04:55 +01:00
Andreas Österreicher 6f99f493ea Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-04 10:46:10 +01:00
Andreas Österreicher 023c2a10be Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-02-04 10:21:17 +01:00
Harald Bamberger f6b13c0bdf Merge branch 'master' into studvw_2026-02_rc4 2026-02-03 17:16:42 +01:00
Harald Bamberger a7cd6c35f1 Merge branch 'feature-71399/Javscript_Caching_Problem_fhc-build-version_in_URL_und_mod_rewrite' 2026-02-03 16:29:05 +01:00
ma0068 e0082db7c9 Tab Aufnahmetermine: add context self to computed properties and adapt name of 2 variables, Tab Lehrveranstaltungstermine: add space 2026-02-03 16:16:18 +01:00
Harald Bamberger 87ff7acef0 use absoluteJsImportUrl helper instead of APP_ROOT constant to build js components file path 2026-02-03 14:27:02 +01:00
ma0068 936858948b merge bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed into origin/studvw_2026-02_rc4 2026-02-03 14:15:58 +01:00
ma0068 18c949eed4 refactor tabulator options and events into computed section: Tabs Betriebsmittel, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Kontakt, Prestudent, Status, bugfix Lehrveranstaltungstermine: sorter for Lektor as string 2026-02-03 13:57:30 +01:00
Harald Bamberger d192489c6f use correct filename in comment 2026-02-03 13:52:04 +01:00
Harald Bamberger 7028fe0ac8 Merge branch 'master' into feature-71399/Javscript_Caching_Problem_fhc-build-version_in_URL_und_mod_rewrite 2026-02-03 13:49:48 +01:00
Harald Bamberger a3a03f6362 update check system to create or update widget path to start with public/... 2026-02-03 13:49:06 +01:00
Harald Bamberger 82f0f3f5e3 Merge branch 'bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed_Part1' into studvw_2026-02_rc4 2026-02-03 13:39:59 +01:00
Harald Bamberger 8b9601502a Merge branch 'bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed' into studvw_2026-02_rc4 2026-02-03 13:38:28 +01:00
ma0068 888bb1c7c0 Merge branch 'master' into bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed_Part1 2026-02-03 13:26:04 +01:00
ma0068 372c932c47 Merge branch 'master' into bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed 2026-02-03 13:16:17 +01:00
Johann Hoffmann 6391bf5a45 tippfehler in phrase "c4tooltipStandard" ausgebessert: 'Termin mehr als 12 Tag entfernt' => 'Termin mehr als 12 Tage entfernt' 2026-02-03 12:52:25 +01:00
Johann Hoffmann d774335bcf assistenz view query now also checks for betreuerart_kurzbz ("Erstbegutachter", "Begutachter", "Betreuer", "Erstbetreuer", "Senatsvorsitz") instead of only ("Erstbegutachter", "Begutachter") 2026-02-03 12:35:06 +01:00
Harald Bamberger 69749da331 Merge branch 'master' into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2026-02-03 11:46:19 +01:00
Andreas Österreicher b4f28d5426 Abstract zum Default Config für Betreuer hinzugefügt 2026-02-03 11:12:50 +01:00
Harald Bamberger 0442a3da0a Merge branch 'bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed' into studvw_2026-02_rc4 2026-02-03 10:58:24 +01:00
Harald Bamberger 2492a4fc06 Merge branch 'bug-70848/FHC4_Studierendenverwaltung_Notiz_handleVisibleColumns_pp' into studvw_2026-02_rc4 2026-02-03 10:57:38 +01:00
Harald Bamberger 9ae9feb9ea Merge branch 'bug-69548/FHC4_Studierendenverwaltung_Aufnahmetermine_Gesamtnote_berechnen' into studvw_2026-02_rc4 2026-02-03 10:48:06 +01:00
Harald Bamberger a535fd85cd Merge branch 'feature-69516/studvw_verbandsbaum_zu_ausklappbar_machen' into studvw_2026-02_rc4 2026-02-03 10:47:31 +01:00
Harald Bamberger 269860252e Merge branch 'feature-69710/FHC4_Studierendenverwaltung/Filterverhalten_bei_Aenderungen' into studvw_2026-02_rc4 2026-02-03 10:46:57 +01:00
Harald Bamberger d0faba03a2 Merge branch 'feature-39571/Studierendenverwaltung_CoreNotizcontroller' into studvw_2026-02_rc4 2026-02-03 10:43:39 +01:00
ma0068 88a06194d4 Merge branch 'master' into bug-70848/FHC4_Studierendenverwaltung_Notiz_handleVisibleColumns_pp 2026-02-03 10:36:13 +01:00
Andreas Österreicher 3e1b9865b1 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-02-03 10:33:54 +01:00
Andreas Österreicher 3534118261 Merge branch 'feature-71355/constructor_config_bewerbungstool_datenschutz' 2026-02-03 08:50:20 +01:00
Harald Bamberger 5d73f051ba sample .htaccess to use with config option use_fhcomplete_build_version_in_path 2026-02-03 08:13:57 +01:00
Harald Bamberger 85a10e27cc fix setFirstStudent if GENERATE_ALIAS_STUDENT is false 2026-02-02 17:59:15 +01:00
ma0068 8c22a652fa merge master into bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed 2026-02-02 17:24:36 +01:00
ma0068 a70e25d0e8 Merge branch 'master' into feature-69516/studvw_verbandsbaum_zu_ausklappbar_machen 2026-02-02 16:48:02 +01:00
ma0068 e689531224 merge master into bug-69548/FHC4_Studierendenverwaltung_Aufnahmetermine_Gesamtnote_berechnen 2026-02-02 16:31:13 +01:00
ma0068 3ab1a002f0 Merge branch 'master' into feature-69710/FHC4_Studierendenverwaltung/Filterverhalten_bei_Aenderungen 2026-02-02 16:24:51 +01:00
ma0068 b9eaac18b0 merge Master into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2026-02-02 16:21:47 +01:00
ma0068 b26df9ac21 Tab Kontakt: Bankaccount: move tabulator options to computed, fix bug height 2026-02-02 11:48:02 +01:00
ma0068 0539281adf Messages: move tabulator options and event to computed 2026-02-02 11:36:03 +01:00
Johann Hoffmann 1b35569797 Merge branch 'master' into feature-69180/AnwUID4CSV 2026-02-02 10:22:10 +01:00
ma0068 e01d814ae9 Tab Dokumente: move tabulator options and event to computed 2026-02-02 09:44:47 +01:00
Harald Bamberger 77abcb6129 use absoluteJsImportUrl in Dashboard Widget Api Endpoints, send widget setup and arguments column values as json to frontend, remove JSON.parse from frontend dashboard code 2026-01-30 18:58:20 +01:00
Harald Bamberger 63f198098d use absoluteJsImportUrl Helper for calendar Event renderers 2026-01-30 18:55:25 +01:00
Harald Bamberger f7478ff05c add config to insertr fhc-build-version into path or add it as query string 2026-01-30 18:53:31 +01:00
ma0068 99ea6ad333 - moved tabulator options to computed
- removed unused change param
- added values to resetModal
2026-01-30 14:26:32 +01:00
Johann Hoffmann 366cb16b61 anw phrasen "studentByLVATitle" & "kontrolliertVon", slight adjustment of fullscreen modal button so it looks similar 2026-01-30 14:10:28 +01:00
ma0068 683626921b Tab Mobility: moved tabulator options to computed 2026-01-30 13:21:40 +01:00
ma0068 326d4b3923 Revert "refactor in computed section: Tabs Betriebsmittel, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Kontakt, Prestudent, Status, bugfix Lehrveranstaltungstermine: sorter for Lektor as string"
This reverts commit f2107a377f.
2026-01-30 10:31:38 +01:00
ma0068 f2107a377f refactor in computed section: Tabs Betriebsmittel, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Kontakt, Prestudent, Status, bugfix Lehrveranstaltungstermine: sorter for Lektor as string 2026-01-30 10:29:19 +01:00
Johann Hoffmann fbe10cc2a1 PersonModel loadAllStudentUIDSForPersonID used in anw extension AdministrationApi aka Entschuldigungsmanagement 2026-01-29 15:08:24 +01:00
ma0048 783c4fc5f8 constructor warning config hinzugefuegt
testtool englisch uebersetzung datenschutz hinzugefuegt
2026-01-29 08:15:35 +01:00
Harald Bamberger f1aa5382cf check editZgv Permission for Stg and also check it in api function 2026-01-28 17:04:11 +01:00
ma0068 e3b630550a delete comment 2026-01-28 14:42:26 +01:00
ma0068 8903fa878c - more prominent view of Active Custom Filter
- one click filterreset
- fhc search bar: resetFilter with submit
2026-01-28 13:33:01 +01:00
Harald Bamberger 7fe36d59e3 apply edit Zgv permissions only to ZGV dropdowns 2026-01-28 11:32:03 +01:00
kindlm c724c6a20f MathML auf Darstellungs-Testseite überarbeitet 2026-01-27 16:53:33 +01:00
kindlm b9bfa5c3c5 Merge remote-tracking branch 'origin/master' 2026-01-27 16:52:16 +01:00
Johann Hoffmann 101613ecdd detail view infos - student: {student} titel: {titel} betreuer: {betreuer} 2026-01-27 14:47:51 +01:00
Johann Hoffmann edd0c46186 target blank on students stg moodle link; added new classes to assistenz table cell formatters 2026-01-27 11:50:29 +01:00
Johann Hoffmann 07dd9e3a77 abgabedatum logic fix in dateStyles 2026-01-27 11:31:56 +01:00
Johann Hoffmann 06139b14d6 bestanden style from purple to green 2026-01-27 11:25:41 +01:00
Harald Bamberger 3e46e94736 quick fix to prevent pruefunglist from being empty due to js error in combination with tabulator sort persistence 2026-01-27 11:07:46 +01:00
Johann Hoffmann fc468ca34a URL_ASSISTENZ for links in email jobs 2026-01-27 10:52:15 +01:00
Johann Hoffmann 84db668566 compare notenOpt in student view if necessary for datestyle 2026-01-27 10:30:00 +01:00
Johann Hoffmann 3c82cd1282 icon template statusses 2026-01-27 09:58:48 +01:00
Johann Hoffmann 709f64e292 2 new dateStyle status regarding QG benotung 2026-01-27 09:31:14 +01:00
ma0068 5dcf8bb854 add showVariables.showErledigt to tabulatorOptions 2026-01-26 15:11:00 +01:00
Johann Hoffmann 709aba5783 Merge branch 'master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	application/models/organisation/Studiengang_model.php
2026-01-26 15:06:22 +01:00
Harald Bamberger afc4544304 use showVariables properties directly in tabulatorOptions and tabulatorEvents moved to computed, so they are used only if user has not customized columns visibility in localstorage 2026-01-26 14:09:07 +01:00
ma0048 0a2afadb0a tagheaderfilter bug fix 2026-01-26 13:21:20 +01:00
Cristina 27a91de5f6 Added app lvevaluierung to system.tbl_app 2026-01-22 15:51:05 +01:00
Cristina 7ccc26c878 Added lvevaluierung phrasen for STGL Übersichtsseite 2026-01-22 15:41:25 +01:00
Cristina 9ebc847e8e Added lvevaluierung phrasen for Lektoren Übersichtsseite 2026-01-22 14:59:00 +01:00
Cristina 511b04c1f8 Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-21 18:01:55 +01:00
Cristina ec90d35e02 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-21 18:01:24 +01:00
Harald Bamberger f867e60702 fix use of config FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE to override studiengang_kz in public.tbl_konto 2026-01-21 17:37:23 +01:00
Johann Hoffmann 668f0a6618 fixed betreuerart bezeichnung formatting discrepancy between first and second assesor 2026-01-21 16:26:26 +01:00
Andreas Österreicher ef8314c33a Config to check Extension LVEvaluierung is enabled 2026-01-21 15:32:52 +01:00
Johann Hoffmann 48cd37058e also block uploads and termin changes for projektarbeiten with a note on backend 2026-01-21 14:53:44 +01:00
Andreas Österreicher e4ebdd59b6 Merge branch 'epic-56039/LV-Evaluierung' 2026-01-21 14:51:24 +01:00
Johann Hoffmann 4d97127539 remove Abgabedatum column from Assistenz/Betreuer update sammelmail. Keep it for UPLOADS sammelmail since it is relevant there; defined relevant_types in abgabetool config to filter for in the sammelmail for each role student/assistenz/betreuer; block saving/deleting/uploading ui components when projektarbeit has a note, since this indicates that the project is over; 2026-01-21 14:05:31 +01:00
Andreas Österreicher d1cc7244f7 Merge branch 'feature-70999/bewerbungstool_datenschutz_checkbox' 2026-01-21 10:56:54 +01:00
Johann Hoffmann c9bcf9b9b0 fixed note init by object/object key on 2nd time opening the details modal in the assistenz view; 2026-01-21 10:34:17 +01:00
ma0048 2f5b90b9d5 dsgvo confirm und proctoring confirm beim RT Login 2026-01-21 09:04:11 +01:00
Cristina 9b90e0edde Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-20 10:53:36 +01:00
Cristina 56e9b253d2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-20 10:52:23 +01:00
Cristina c5c7123358 Added lvevaluierung phrase 2026-01-20 10:51:49 +01:00
Johann Hoffmann 2471d37dd3 fix loginfo statements betreuer->assistenz 2026-01-19 16:54:10 +01:00
Johann Hoffmann ad7808eb21 fix typo in speed dial disabled computed (based on being a zweitbegutachter 2026-01-19 16:49:03 +01:00
Johann Hoffmann 9a07e7c804 wrote Studiengang_model.php -> getAssistenzForStudiengangKZ() that does just that but is not used currently since we retrieve assistenz in AbgabetoolJob.php via oe_kurzbz; added new getAssistenzForOE() method in Organisationseinheit_model; added new job "notifyAssistenzAboutChangedAbgaben" that does just that to AbgabetoolJob.php; removed console.log/debugger statements in cis4 code; 2026-01-19 16:12:54 +01:00
Cristina 50e93fc9ba Fixed wrong configs (restored CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN + removed double CIS_EVALUIERUNG_ANZEIGEN_STG) 2026-01-19 13:33:12 +01:00
Andreas Österreicher 47ea1e848c Merge branch 'feature-69528/reihungstestueberwachung_constructor' 2026-01-19 10:17:38 +01:00
ma0048 e0f99a8e88 gewichtung und regeln in die config verschoben 2026-01-19 08:28:25 +01:00
Johann Hoffmann 6c82741341 remove var_dump() statement 2026-01-16 12:00:30 +01:00
Johann Hoffmann c3f7f7223a add student name info to betreuer sammelemail jobs table; WIP adapting same logic for assistenz; 2026-01-16 11:59:46 +01:00
Johann Hoffmann fbd0a4685e fix jobs & fancy formatting; check paabgabetyp instead of bezeichnung to enable enduploads for users in english lmao 2026-01-15 18:40:51 +01:00
Harald Bamberger 63aebde7f2 Merge branch 'bug-70906/FHC4_Archive_Dokument_Studienbestaetigung' 2026-01-15 18:01:25 +01:00
ma0068 62f5b66324 add missing parameters studiensemester and studiengang_kz for document Studienbestaetigung and StudienbestaetigungEnglish 2026-01-15 17:24:38 +01:00
Harald Bamberger ef08e39449 api endpoint student: prevent storing an empty string as alias e.g. from StudVw Details Tab 2026-01-15 17:09:30 +01:00
Harald Bamberger c720c46125 education/Projektarbeit_model: fix missing from-clause entry for table tbl_projektarbeit error - ticket#6059687 2026-01-15 16:28:38 +01:00
Harald Bamberger 597d4dbfec Abschusspruefung Modal add model-type to datepicker to prevent sending full utc timestamp to backend 2026-01-15 11:37:51 +01:00
Johann Hoffmann eb15d6b841 getStudentConfig Api Method; moodle link config entry; write abgabetool termin noten into header; uniform getDateStyleClass logic in all 3 views; WIP refining AbgabetoolJob; 2026-01-14 16:57:57 +01:00
ma0048 d67cad925d externe ueberwachung deaktivieren ueber config
params in die config verlagert
2026-01-14 13:59:42 +01:00
Johann Hoffmann bbb90f6dc4 added fixtermin variable to Paabgabe->update() statement; email logic for sancho emails towards betreuer: return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; phrasen wordings; reworked assistenz config api promises as allSettled to avoid race conditions; nachreichen möglich is always the default everywhere; WIP enabling the same status logic workflow everywhere; 2026-01-13 18:20:05 +01:00
Harald Bamberger 2d9e9df8a0 fix notiz component showing no data when setting sort an switching tabs in stv 2026-01-13 14:10:33 +01:00
Cristina 6d6659f6e5 Merge remote-tracking branch 'origin/epic-56039/LV-Evaluierung' into epic-56039/LV-Evaluierung 2026-01-13 13:39:21 +01:00
Cristina 6512ad0f1c Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-13 13:38:04 +01:00
Cristina f034a99928 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-13 13:37:43 +01:00
Johann Hoffmann e89fcbab31 phrase typo fix 2026-01-13 13:05:58 +01:00
Johann Hoffmann 7c1f239dcb configurable paabgabe types for signature check; finetuned signature response message; phrasen & code cleanup; 2026-01-13 12:32:41 +01:00
Johann Hoffmann cc0f38b276 fix the comment describing the "fix" 2026-01-12 17:14:03 +01:00
Johann Hoffmann a56335f4f9 "fix" the signatur check 2026-01-12 17:11:48 +01:00
Johann Hoffmann 954c55ba3e finetuning 2026-01-12 17:06:35 +01:00
Johann Hoffmann c7250959d0 Merge remote-tracking branch 'origin/feature-61164/AbgabetoolQualityGates' into feature-61164/AbgabetoolQualityGates 2026-01-12 12:52:31 +01:00
Johann Hoffmann 6c8318ead2 wip 2026-01-12 12:51:34 +01:00
Andreas Österreicher 3095f7ea8b Notice für UID entfernt 2026-01-12 10:44:57 +01:00
Andreas Österreicher 8f98d0c5a1 Fixed UID 2026-01-12 10:31:50 +01:00
Johann Hoffmann 13232015c3 more sophisticate zuordnung check & place it in every sensitive API endpoint; WIP: check STGentitlement when querying projektarbeiten for certein stg, since only dropdown info is pulled with this berechtigungslogic in mind but not the fetch itself; 2026-01-09 14:13:26 +01:00
Johann Hoffmann db861e81b2 rewrote post param acces from $id = $_POST['id'] to $id = $this->input->post('id') and subsequently rewrote safety checks from !isset($id) || isEmptyString($id) to $id === NULL || trim((string)$id) === '' to avoid ASCII conversion of low integers when passing them to isEmptyString function 2026-01-08 17:45:02 +01:00
Johann Hoffmann 7eb147085f typo fix in getDateStyleClass; fix selectAll button in Assistenz view; change the upload_allowed checkbox on change as expected; give fhcAlert primevue btn classes instead of bootstrap so they actually get applied; save convert js date to iso string to avoid timezone shenanigans; created zusatzdaten edit phrase; 2026-01-08 16:05:24 +01:00
ma0068 4f104523ff - include directive primevue.tooltip
- refactor phrases to avoid timing problem with loading phrases of alert
2026-01-08 16:02:29 +01:00
Johann Hoffmann 80175f46cb typo fix in getDateStyleClass; fix selectAll button in Assistenz view; 2026-01-08 14:40:24 +01:00
Johann Hoffmann 3d82d69bfc fixed student_uid variable aquisition inside StudentComponent; No allowedToSave check in client for Betreuer at all, everything done at backend level (WIP); added legacy phrasen to phrasesupdate to guarantee their existence; 2026-01-08 13:40:58 +01:00
ma0048 40ae57fb0c proctoring check ueberarbeitet 2026-01-08 12:01:20 +01:00
Andreas Österreicher f845809e6b Fixed Variable Check in Abgabetool 2026-01-07 16:02:06 +01:00
Paolo 1ce362b66b Removed forgotten error_log 2026-01-07 15:54:59 +01:00
Harald Bamberger c113c80862 fix calculation of next student matrikelnr aka personenkennzeichen and student uid 2025-12-22 21:11:05 +01:00
ma0068 02153e469f Dashboard Admin Cleanup
- refactoring Api: FHC-API controller for Edit/Update, widgets and presets
- delete dashboard with Prompt
- phrases
2025-12-19 11:39:31 +01:00
Andreas Österreicher 063cbcbf4f Merge branch 'feature-62775/reihungstesttool_firefox_check_entfernen' 2025-12-19 09:50:15 +01:00
Paolo 47d4b2e2d4 Change var_dump_to_error_log to show the referring script -> tail -f /var/log/apache2/error.log | grep <user> can catch it 2025-12-18 13:20:08 +01:00
Andreas Österreicher 7e6805ca98 Merge branch 'master' into epic-56039/LV-Evaluierung 2025-12-18 13:18:16 +01:00
Cristina 871534af52 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-12-18 13:07:27 +01:00
Andreas Österreicher 67b03dd29f ReAdded Lost Phrases 2025-12-18 12:55:08 +01:00
Harald Bamberger 0616236e00 bugfix: ZGV Übernahme bei Interessentenanlage, bestehende ZGVs die null sind ausfiltern 2025-12-18 12:48:08 +01:00
Andreas Österreicher 47e3c83909 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2025-12-18 12:25:05 +01:00
Cristina 4dd4d8aaa5 Removed filtering aktiv studienganege from method to get Studiengaenge by Stgs
otherwise when switching to former semester (which will have inactive studiengaenge) it will not appear
2025-12-17 14:35:24 +01:00
Cristina f9ac824cc0 Added LV-Evaluierung NEU link button to CIS LV Menu 2025-12-17 14:33:04 +01:00
Harald Bamberger 79ad8601da Merge branch 'feature-68763/CIS4_Profilupdate_Additional_Changes' 2025-12-17 13:35:59 +01:00
Harald Bamberger 6b0526fb95 add tabulator persistence config 2025-12-17 13:22:39 +01:00
Harald Bamberger 39d708aa61 Merge branch 'master' into feature-68763/CIS4_Profilupdate_Additional_Changes 2025-12-17 12:56:07 +01:00
Harald Bamberger becbe5823c Merge branch 'feature-69286/StudStatusWiedereinstiegsmail_an_Studierende' 2025-12-16 16:16:29 +01:00
Harald Bamberger ddfcef9ad7 log Error if mail can not be sent, only change status if both reminder emails were successfully sent 2025-12-16 15:52:44 +01:00
Harald Bamberger 4f5e49a93c send to all private email addresses marked as zustellung 2025-12-16 15:27:31 +01:00
Harald Bamberger a3b5718422 Merge branch 'master' into feature-69286/StudStatusWiedereinstiegsmail_an_Studierende 2025-12-16 07:43:45 +01:00
Cristina db048e876c Renamed getEntitledStgs to getByStgs
Permissions check happens in application controller.
2025-12-15 16:48:07 +01:00
Harald Bamberger a4be020156 Merge branch 'feature-68768/Studierendenstatus_Neue_Abmeldungsgruende' 2025-12-15 16:36:16 +01:00
Harald Bamberger 2149ed2384 Merge branch 'master' into feature-68768/Studierendenstatus_Neue_Abmeldungsgruende 2025-12-15 16:27:57 +01:00
Cristina e6ef234c8b Added method getOrgformsByStg to Studiengang_model.php
Get OrgForms of given Studiengang and Studiensemester
2025-12-15 16:27:47 +01:00
Harald Bamberger 29c8e6fb19 Merge branch 'master' into feature-69286/StudStatusWiedereinstiegsmail_an_Studierende 2025-12-15 16:27:25 +01:00
Harald Bamberger cf7e9921b5 change grades sort order 2025-12-15 16:11:46 +01:00
Harald Bamberger 887d9f9cbd Merge branch 'feature-69877/StudVw_Status_GrundAndAnmerkungEditable' 2025-12-15 15:31:52 +01:00
Harald Bamberger 7de3c4a24e remove unnecessary line 2025-12-15 15:22:32 +01:00
Harald Bamberger 11ff26d8e7 remove empty lines 2025-12-15 15:20:19 +01:00
Harald Bamberger 718272e8a1 remove empty line 2025-12-15 15:13:53 +01:00
Harald Bamberger 3f891179aa move check for critical changes bis from frontend to backend 2025-12-15 15:12:49 +01:00
kindlm 2a84999e56 Merge remote-tracking branch 'origin/master' 2025-12-15 14:39:47 +01:00
Andreas Österreicher 56ef700ec8 Merge branch 'feature-69439/negative_stunden_im_neuen_kartereiter' 2025-12-15 14:27:27 +01:00
Harald Bamberger afc3cd0131 Merge branch 'master' into feature-69877/StudVw_Status_GrundAndAnmerkungEditable 2025-12-15 13:53:28 +01:00
Harald Bamberger 5536408065 add property stg_kz to json of org_forms to prevent clearing tabulator when changing form a node with stg_kz property set to an orgform_node 2025-12-15 13:35:50 +01:00
Johann Hoffmann 756a51defa selectable check during selectAll to block it for Zweitbetreuer -> custom formatted/handled selection column for mitarbeiter & assistenz; custom sticky-col css; 2025-12-15 13:16:12 +01:00
ma0048 5a77478071 insertvon entfernt 2025-12-15 12:27:17 +01:00
Harald Bamberger 293a8625e4 change sort order in grades list api endpoint 2025-12-15 12:03:41 +01:00
Harald Bamberger 5266a6fe4d Merge branch 'master' into feature-69877/StudVw_Status_GrundAndAnmerkungEditable 2025-12-12 16:28:35 +01:00
Harald Bamberger 3485ee624c Merge branch 'studvw_2025-12_rc3' 2025-12-12 15:22:24 +01:00
Harald Bamberger 61c859f2e1 Merge branch 'bugfix-69874/Dokument_Ausbildungsvertrag_ohneParamUid' into studvw_2025-12_rc3 2025-12-12 15:06:49 +01:00
Harald Bamberger b967f83dd4 skip adding uid to params for templates Ausbildungsver and AusbVerEng instead of deleting it afterwards 2025-12-12 15:05:37 +01:00
Harald Bamberger ad184f5c16 change projektbetreuer tabulator layout, use correct phrases for columns person_id and punkte 2025-12-12 14:37:44 +01:00
ma0068 34d6b2d97a use only prestundent_id in Archive-functionality 2025-12-12 14:36:02 +01:00
Johann Hoffmann 735a6654b9 projektbeurteilung_check_available event when loading studentprojektarbeiten handled in extension 2025-12-12 13:45:01 +01:00
ma0068 431ae8ddac - make button edit editable
- set field anmerkung editable (like statusgrund and statusgrund)
- refactor function updateStatus to skip validation
- change phrases
2025-12-12 13:04:58 +01:00
Johann Hoffmann 635da9f8d9 checksystem paabgabetyp default values for upload_allowed, benotbar & aktiv only on first checksystem run by checking availability of qgate2 typ; english phrasen for betreuerart, paabgabetyp & projekttyp; disable new termin for zweitbetreuer (WIP disabling serientermin); QGate1/2 Status column -> text only for now; 2025-12-12 12:51:07 +01:00
Harald Bamberger 0072d87f3b Merge branch 'bug-69804/FHC4_StudVw_Mobility_showAddedZweckAndGrund' into studvw_2025-12_rc3 2025-12-11 16:41:43 +01:00
ma0068 d91789aee5 Aufruf Ausbildungsvertrag mit Param prestudent-id 2025-12-11 16:20:09 +01:00
Cristina 8280ec42b0 Added method getEntitledStgs to Studiengang_model.php
Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. Helpful to easily get Studiengänge the user is entitled for.
2025-12-11 16:07:07 +01:00
Harald Bamberger d8766e8f7a Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' into studvw_2025-12_rc3 2025-12-11 16:06:28 +01:00
Alexei Karpenko 91f141326a Studierendenverwaltung Projektarbeiten PRojektbetreuer: replaced "formdata modified" check with edit mode check 2025-12-11 15:38:53 +01:00
ma0068 a6907d1bc5 - bugfix delete Purpose
- reload local data after pushing new entries in Purpose and Support
2025-12-11 14:20:22 +01:00
Harald Bamberger 95027937bd remove debug code 2025-12-11 12:52:05 +01:00
Harald Bamberger a86d35f731 Merge branch 'master' into feature-69065/Projektarbeiten_Firmen_verwalten 2025-12-11 12:12:05 +01:00
Alexei Karpenko 1c511f9c66 Projektarbeit controller: added comments 2025-12-11 11:42:31 +01:00
ma0068 f40f554c6b add logic for config FAS_REIHUNGSTEST_EXCLUDE_GEBIETE 2025-12-11 10:53:15 +01:00
ma0048 b4668aa6bc verbandsbaum zu/ausklappbar 2025-12-11 08:58:05 +01:00
ma0048 df639c8b07 sprache mitschicken 2025-12-11 08:28:01 +01:00
Alexei Karpenko 80f80ab8e8 added comments to Projektbetreuer 2025-12-10 19:43:15 +01:00
Alexei Karpenko 32b73b7287 Studierendenverwaltung Projektarbeiten: delete checks bugfixes, layout guidelines 2025-12-10 18:03:04 +01:00
Johann Hoffmann eade9b7beb fixed accordion header padding size; student sees public mail, lektor gets notifs to private; remove unused injections; rewrite viewData validation for old Cis to remove console.warnings; clear abgabetermin.kurzbz when changing to smth not quality gate to avoid leaky kurzbz; fixed accordion header style offset for both cis environments; tooltip fix; only show abgabedatum if termin has upload_allowed; lower max-width in old cis; activated custom persistence for assistenz page + stricter promise handling around tableBuilt; activeIndex Handling on Student Page in case of several Projektarbetien; Phrasen gendering; 2025-12-10 17:41:01 +01:00
Alexei Karpenko 98bcbda53e added check for Projektarbeitsbeurteilung when deleting Projektarbeit 2025-12-10 16:09:44 +01:00
Harald Bamberger ba1f3da02f Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 15:35:58 +01:00
Harald Bamberger 994d523258 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' 2025-12-10 15:29:07 +01:00
Harald Bamberger 213f20eab3 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' into studvw_2025-12_rc3 2025-12-10 15:20:27 +01:00
Harald Bamberger 2bb58e24cc fix timing to prevent zgv autocomplete fields from being empty when switching from and to prestudent tab 2025-12-10 15:18:16 +01:00
ma0048 53cf777970 check im menu entfernt 2025-12-10 15:18:15 +01:00
ma0048 48512f46ab exam name geandert 2025-12-10 15:15:23 +01:00
Harald Bamberger da78332a92 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' into studvw_2025-12_rc3 2025-12-10 14:50:56 +01:00
Harald Bamberger 83a76d06b6 Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 14:16:46 +01:00
Harald Bamberger cfd24dd8bc Merge branch 'feature-69452/studvw_status_aktion_vorruecken_ausblenden_via_config' 2025-12-10 14:07:45 +01:00
Harald Bamberger ea5d2bc6f8 Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 13:50:20 +01:00
Harald Bamberger 8468d881f1 Merge branch 'feature-69517/FHC4_Abschlusspruefung_Pruefungsprotokolltext' 2025-12-10 13:40:59 +01:00
Harald Bamberger 5041999b4b Merge branch 'master' into feature-69517/FHC4_Abschlusspruefung_Pruefungsprotokolltext 2025-12-10 13:34:52 +01:00
ma0068 1176c8d6e4 - use studiengang_kz and studiengangkurzbz of studienordnung of persontRT
- add check for existing studiengang
- use studiengang_kz instead studiengangkurzbz for filter and background green
2025-12-10 09:49:00 +01:00
ma0048 8bab5285e9 testversuch ueber config
abfrage gefixed
menu wird nicht mehr angezeigt
2025-12-10 08:08:46 +01:00
Cristina 76cdaefdc7 Merge branch 'master' into epic-56039/LV-Evaluierung 2025-12-09 17:06:06 +01:00
Johann Hoffmann bb689a6d48 Merge branch 'master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	public/css/Cis4/Cis.css
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-12-09 17:03:18 +01:00
Harald Bamberger 033af68343 teleport datepicker out of modal 2025-12-09 17:01:30 +01:00
Cristina f725594f0c Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-12-09 17:00:24 +01:00
Harald Bamberger f460a909d9 Merge branch 'feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte' into studvw_2025-12_rc3 2025-12-09 16:37:16 +01:00
Harald Bamberger 054574f9fb Merge branch 'feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten' into studvw_2025-12_rc3 2025-12-09 16:35:45 +01:00
ma0048 597aa1aa4e status vorruecken ueber config steuerbar
statusgrund kann wieder entfernt werden
2025-12-09 12:36:08 +01:00
Harald Bamberger 7c57f5a308 Merge branch 'master' into feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte 2025-12-09 11:50:08 +01:00
ma0068 43497b186d return empty array if there is no placementtest instead of error 2025-12-09 11:43:39 +01:00
Harald Bamberger 50439ee6cc Merge branch 'master' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-12-09 11:37:57 +01:00
Alexei Karpenko 016d4a1927 Studierendenverwaltung Projektbetreuer: added phrases, added check for existing Projektbetreuer when saving 2025-12-06 01:28:38 +01:00
Alexei Karpenko 112e30ab39 Studierendenverwaltung Projektarbeit: added concatenated Betreuer, sorted autocomplete suggestions, added Gesamtnote, freigegeben check removed when lock date set, added phrases 2025-12-05 22:01:35 +01:00
Andreas Österreicher e1959b9e40 Quality Gate Aenderungen im DBUpdate hinzugefügt 2025-12-05 13:21:46 +01:00
ma0068 e78482e947 - refactor sum points
- create green row background for current RT
2025-12-05 12:31:02 +01:00
Johann Hoffmann ca152dc1ea add projektarbeit_id & student_uid to projektbeurteilung_formular_link event in projektarbeitsbeurteilungsextension 2025-12-04 17:28:16 +01:00
Johann Hoffmann ec7ebc8286 allowedNoten config integer instead of string so javascript array.includes() doesnt miss the noten options 2025-12-04 16:57:24 +01:00
Johann Hoffmann 035e844fab added tbl_vorlage insert for PAAChangesBetSM.txt 2025-12-04 15:40:45 +01:00
Johann Hoffmann e7a737b7aa write stg_kz & semester_kurzbz into sammelmail about each projektarbeit; move method from abgabe.php api controller to abgabejob.php 2025-12-04 15:36:24 +01:00
Harald Bamberger 7e0acdbf45 fix typo 2025-12-04 14:57:03 +01:00
Johann Hoffmann e3c1287664 WIP 2025-12-04 14:49:05 +01:00
Harald Bamberger 391a4753d5 fix flex-grow with tabulator exceeding width (found by ma0646) 2025-12-04 14:38:30 +01:00
ma0068 c6686f56f6 make ZGV fields and bisMelden field editable
- new Berechtigung student/editDokZgv
- Berechtigungen student/editBakkZGV, student/editMakkZGV, student/editBismelden
2025-12-04 10:35:43 +01:00
Harald Bamberger 1c2937dfb6 Merge branch 'feature-69570/StudVw_Filter_broken' 2025-12-04 08:47:55 +01:00
Harald Bamberger 841b4736a9 do not send filters to backend when search endpoint is used 2025-12-04 08:39:37 +01:00
Alexei Karpenko c79ff24c89 Studierendenverwaltung Projektarbeit: added Studiensemester dropdown for Lv-Teil 2025-12-03 19:29:42 +01:00
Johann Hoffmann 0c5af137db WIP notifyBetreuerAboutNewOrChangedAbgabenForBetreuedProjektarbeiten Email Job; allowed abgabetypen & allowed noten as per config now via db primary key; new ProjektbetreuerModel method "getAllBetreuerOfProjektarbeit" to do just that; 2025-12-03 16:49:49 +01:00
Alexei Karpenko 77a1067ea5 Studierendenverwaltung Projektbetreuer: default Stunden coming from global config, Stundensatz is requested each time BetreuerIn is selected 2025-12-03 15:32:21 +01:00
ma0068 d33af0ae21 bugfix: resetModal in openMode modal 2025-12-03 15:14:26 +01:00
Johann Hoffmann 541d6d78cc projektbeurteilung_formular_link event for benotung link AbgabetoolMitarbeiterDetail.js; projektarbeit_is_current event for abstracted logic in Abgabetool; show endupload missing message on benoten if neither old nor new link are eligable; 2025-12-03 11:35:49 +01:00
ma0068 7726c3ce21 disable pruefungsnotizen 2025-12-03 10:23:58 +01:00
Harald Bamberger 5a970c3f2e fix typo 2025-12-03 09:58:33 +01:00
Harald Bamberger abcc1269eb add permission to show profile images in new studvw 2025-12-03 09:44:34 +01:00
Harald Bamberger c849b5defa fix broken filters 2025-12-02 18:08:03 +01:00
ma0068 d75939a8f8 refactor Messages
- endpoint: using apiMessages instead of prop
- add Phrases
- openMode Modal: resetModal if no messageId
- openMode inSamePage: loadReplyData
- function getNameOfDefaulRecipients: add missing check, if id[]
2025-12-02 16:08:13 +01:00
Johann Hoffmann 7747857583 AbgabetoolStudent beurteilung erstbetreuer/zweitbetreuer switch + get the actual link from the projektarbeitsbeurteilung extension via event 'projektbeurteilung_download_link' + fallback from config in case that fails; WIP implementing the switch for lektor beurteilungstemplate based on isCurrent/Semester etc in an Event in the pabu extension; 2025-12-02 16:07:26 +01:00
Andreas Österreicher 3ee81ae6e7 Merge branch 'feature-55978/infocenter_electronic_onboarding_filter' 2025-12-02 16:04:51 +01:00
Andreas Österreicher d1f684f0b3 Merge branch 'feature-69182/PHP8-Stringzugriff_mit_geschwungenen_Klammern' 2025-12-02 15:53:15 +01:00
ma0048 d8e57d43f9 session url in die config verschoben 2025-12-02 13:53:38 +01:00
ma0048 5c9710f44d externe ueberwachung v1 2025-12-02 13:49:05 +01:00
ma0048 257038a2d1 negative stunden markieren
headerfilter angepasst fuer minusstunden
2025-12-02 13:25:46 +01:00
Johann Hoffmann 6359dc0fc9 use sendUploadMail on endupload, no events for that; remove extensive form validation from student detail; serientermin update table format fix; WIP new job informing betreuer about changes to thei betreued PA's; zweitbetreuer/erstbetreuer beurteilungslink switch in abgabetoolStudent; WIP getting that link from event not hardcoded; fix checkUploadSize calculation bytes to megabytes; added beurteilungerforderlich class to accordion headers; 2025-12-02 13:13:42 +01:00
Harald Bamberger 4dabc642ed Merge branch 'master' into feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte 2025-12-02 07:54:40 +01:00
Harald Bamberger afb3ce4cae modify using open mode newTab or window with multiple Recipients via post request 2025-12-02 07:54:13 +01:00
ma0068 be2b578f82 reset default openmode to modal 2025-12-01 14:43:21 +01:00
ma0068 17519eac83 refactor Messaging
- headerFilter for table Messages
- multiactions for sendMessages for openmodes modal and inSamePage
2025-12-01 13:27:42 +01:00
Harald Bamberger 89ec51bd0a Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' 2025-11-28 14:45:29 +01:00
Johann Hoffmann aee6ace42e termine without uploads can now only have 'standard' or 'abgegeben' status based on datum; FHC_Api_Controller method checkUploadSize() -> checks input->server('CONTENT_LENGTH') against min($max_upload, $max_post, $memory_limit) and throws a designated filesizeExceeded error message; added fhc-orange palette for new status 'beurteilungerforderlich'; 2025-11-28 14:09:53 +01:00
Harald Bamberger 0372853df2 Aufnahmetermine: fix error persiting boolean, GS: sortorder studiensemester, Gruppen exclude generated groups from search result 2025-11-28 14:01:20 +01:00
Harald Bamberger dc603375ec Merge branch 'master' into feature-69065/Projektarbeiten_Firmen_verwalten 2025-11-28 11:15:59 +01:00
Johann Hoffmann 095d5acbc5 load all studiensemester for assistenz; load paabgabetyp benotbar for all paabgaben; datediff calc luxon; new dateclass 'beurteilungrequired'; 2nd quality gate validation logic option; filter notenoptions as per config; filter abgabetypoptions as per config; upload_allowed checkbox for serientermine; serientermin modal layout rearranged; abgabetoolJob fixes; 23:59 in the descriptive col, not datepicker; zusatzdaten are required; activeIndex for accordion calulated on demand by method instead of reading a computed value; 2025-11-27 16:53:50 +01:00
ma0068 aa84bdec1e ---staging---- 2025-11-27 14:46:55 +01:00
ma0048 96be1789b5 tag-formatter & helper hinzugefuegt 2025-11-27 09:45:57 +01:00
Alexei Karpenko eb1c3189b5 Studierendenverwaltung Projektarbeit: title not required anymore 2025-11-26 16:45:51 +01:00
Andreas Österreicher 6d27c3f6e2 PHPInfo entfernt 2025-11-26 08:27:14 +01:00
ma0068 93e25bb5fc added Reminder for Unterbrecher for Student 2025-11-25 17:35:44 +01:00
Harald Bamberger a413b6c779 fix bug when changing studiensemester on route search 2025-11-25 14:00:31 +01:00
ma0068 38e8f91fdf add kurzbzlang to studentDropdown suggestion 2025-11-25 10:48:57 +01:00
Harald Bamberger f0e0bdc082 add optional query parameter studiensemester to notenspiegel and notenspiegel_erweitert to override semester_aktuell if multiple tabs in new studvw have different current semesters 2025-11-24 18:37:30 +01:00
Harald Bamberger 60661d3457 Merge branch 'studvw_2025-11_rc2' 2025-11-24 17:02:00 +01:00
Harald Bamberger 41bb99b5ea Merge branch 'master' into studvw_2025-11_rc2 2025-11-24 16:48:11 +01:00
Harald Bamberger 054b9fdee3 Merge branch 'feature-69388/Pruefung_API_insert_Propleme' 2025-11-24 16:42:49 +01:00
Harald Bamberger 61faf5386a Merge branch 'master' into studvw_2025-11_rc2 2025-11-24 16:39:47 +01:00
Harald Bamberger 6b4f5778c2 refactor stv Pruefung Tab and API endpoint to use same logic for insert and update, use luxon lib to initialize datepicker with iso date and send iso date format to api endpoint 2025-11-24 16:26:11 +01:00
Johann Hoffmann 8888b6991f Merge branch 'master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	application/models/education/Projektarbeit_model.php
#	public/js/helpers/StringHelpers.js
2025-11-24 14:25:43 +01:00
Johann Hoffmann 9ac7ff2a4c allowed to upload on endtermin switch to production logic (date & quality gates) 2025-11-24 14:16:07 +01:00
Johann Hoffmann f4ca34f247 remove email sent to alert on serientermin since we do this in cronjob now; 2025-11-24 14:14:46 +01:00
Andreas Österreicher 060f11f1d8 Anmerkung und Spaltenanzahl bei Leistungsstipendien Import angepasst 2025-11-24 09:49:15 +01:00
Harald Bamberger cdc1933ce4 fix typo 2025-11-24 09:48:05 +01:00
Harald Bamberger 239a9c89d7 compare DateTime with DateTime instead of String 2025-11-24 09:46:53 +01:00
Harald Bamberger 4964a2c06d set tabulator layout to fitDataStretchFrozen when frozen columns are defined, change css classes to display disabled status use the same as in students list 2025-11-24 09:40:33 +01:00
Johann Hoffmann 3b7ed523b4 postStudentProjektarbeitZusatzdaten in detail view for Betreuer/Assistenz; 2025-11-21 12:36:03 +01:00
Harald Bamberger ce5e3131c1 Merge branch 'master' into studvw_2025-11_rc2 2025-11-21 10:55:47 +01:00
Harald Bamberger 7eee6d51aa clear tabulator when returning to index or studiensemester route from search route 2025-11-21 10:55:01 +01:00
chfhtw 1666ba82b2 Bugfix: correct compare values in Pruefung->insertPruefung() 2025-11-21 10:42:13 +01:00
Harald Bamberger e54e83f718 Merge branch 'bug-68552/LV-Plan_mobile_Wochenansicht_links_rechts_scrollen' 2025-11-21 08:48:19 +01:00
chfhtw d916c6ab31 make Pruefung->insertPruefung() behave exactly like old FAS 2025-11-21 08:27:05 +01:00
Harald Bamberger be35fd5313 fix typo 2025-11-20 19:09:31 +01:00
Harald Bamberger dd92c815da fix back button behavior in studvw and lvverwaltung 2025-11-20 18:59:44 +01:00
ma0068 d76e84639f neue Phrasen bzw. Phrasenupdate zu Abmeldungsgruende Studierendenantrag 2025-11-20 16:18:55 +01:00
Harald Bamberger 6357aca656 show combine person tab only if permission basis/person, restore endpoint handling logic in List.js 2025-11-20 15:19:36 +01:00
Harald Bamberger d001e3c168 add option to deactivate livesearch, so the searchresult in studvw is shown in tabulator 2025-11-20 13:40:10 +01:00
Harald Bamberger d88f2a0a48 Merge branch 'feature-69176/Studierendenverwaltung_Berichte' into studvw_2025-11_rc2 2025-11-20 13:35:01 +01:00
Harald Bamberger 6378e75c37 Merge branch 'feature-68744/Studierendenverwaltung_Einstellungen' into studvw_2025-11_rc2 2025-11-20 13:33:56 +01:00
Harald Bamberger e22344e9dd Merge branch 'feature-68770/FHC4_Studierendenverwaltung_Funktion_Personen_Zusammenlegen' into studvw_2025-11_rc2 2025-11-20 13:28:37 +01:00
Harald Bamberger 0ed11a02a5 Merge branch 'master' into feature-69176/Studierendenverwaltung_Berichte 2025-11-20 13:27:30 +01:00
Harald Bamberger 23d1104602 Merge branch 'master' into feature-68770/FHC4_Studierendenverwaltung_Funktion_Personen_Zusammenlegen 2025-11-20 13:26:34 +01:00
Johann Hoffmann c447fb9632 properly center loadingOverlay in center of screen, not center of content + put that template away in a FhcOverlay.js component 2025-11-20 11:33:30 +01:00
Johann Hoffmann 352638ed90 code cleanup; 2025-11-20 10:36:23 +01:00
Harald Bamberger bab15bc5b2 add fs_x-small and fs_xx-small and ajust css em settings 2025-11-19 13:01:47 +01:00
Harald Bamberger 1cc77c8eba Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-19 11:42:21 +01:00
Harald Bamberger 3730be991a Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-11-19 11:30:52 +01:00
Harald Bamberger 2f2c7d0d92 Merge branch 'feature-69379/Tooltip-Direktive' 2025-11-19 11:19:37 +01:00
Paolo e837101651 PHP8 compatibility: replaced the curly brackets {} with square brackets [] where used in combination with strings 2025-11-19 10:53:59 +01:00
Harald Bamberger e4a7955239 fix editor params stored empty in tabulator local storage causing empty grade dropdown when switching tabs 2025-11-18 16:42:31 +01:00
Johann Hoffmann a4fee77301 link url in abgabetoolJob per config; comment out addMeta; 2025-11-18 15:01:43 +01:00
Cristina 92030ca697 Merge branch 'feature-69379/Tooltip-Direktive' into epic-56039/LV-Evaluierung 2025-11-18 11:02:57 +01:00
Cristina 53424999dc Created Vue Tooltip directive
This directive initializes and disposes Bootstrap tooltip
2025-11-18 10:58:57 +01:00
Cristina a59f90112d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-11-18 10:51:18 +01:00
Johann Hoffmann 96fdc357de move getDateStyleClass to AbgabetoolStudent.js from AbgabeStudentDetail.js 2025-11-17 16:39:19 +01:00
Johann Hoffmann 6cd0e3a574 email tbl_vorlage inserts dbupdate script; index.ci.php/Abgabetool/Assistenz/stg_kz? optional param route in old cis & cis4; no data placeholder phrase fix; 2025-11-17 15:57:53 +01:00
Alexei Karpenko ad7012367c added Link to company management in project work management 2025-11-17 14:52:58 +01:00
chfhtw 03b3182000 adding Notenspiegel to AppMenu 2025-11-17 13:09:16 +01:00
Johann Hoffmann 1120b823d2 log email count and early job termination in case of new events to notify for 2025-11-17 12:06:07 +01:00
Johann Hoffmann f89a53b156 fix getProjektbetreuerAnrede function since betreuer are not necessarily mitarbeiter with such an uid; notify students config from milliseconds to pgsql interval '1 day'; ported notifyBetreuerMail & notifyStudentMail to AbgabetoolJob.php; 2025-11-17 11:47:00 +01:00
Andreas Österreicher 126aa890c4 Merge branch 'feature-6976/Link_fuer_unverifizierte_email_anpassen' 2025-11-17 10:50:34 +01:00
Andreas Österreicher 4762154bbc Merge branch 'feature-67484/lvverwaltung_finetunning' 2025-11-17 09:06:10 +01:00
Harald Bamberger c9506adc10 do not use cisroot for link to placement test administration 2025-11-14 11:19:54 +01:00
Harald Bamberger f281925874 do not use cisroot for link to final exam protocol 2025-11-14 11:13:23 +01:00
Harald Bamberger 1c319addc5 do not use cisroot for document download 2025-11-14 11:03:48 +01:00
Harald Bamberger dbfa64a436 do not use cisroot for document download 2025-11-14 10:46:27 +01:00
Harald Bamberger 366d48b836 Merge branch 'feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen' 2025-11-14 09:45:21 +01:00
Harald Bamberger 0a53ca49aa readd accoutinfoblatt to single student dropdown 2025-11-14 09:39:46 +01:00
ma0048 284633012f Merge remote-tracking branch 'origin/master' into feature-67484/lvverwaltung_finetunning 2025-11-14 08:09:25 +01:00
ma0048 63eda8b934 addgroup/addperson immer anzeigen
gruppen sortierung angepasst
fehlende les anzeigen
2025-11-14 08:07:39 +01:00
Johann Hoffmann cff71ec829 AbgabetoolJob notifyStudentMail function to send Emails to students about their changed abgabetermine inside the configurable threshold; 2025-11-13 17:16:51 +01:00
chfhtw de012b290b get semester & orgform from Verband to StudVw Main Component 2025-11-13 16:27:15 +01:00
chfhtw dbf9547f9c add CSS class disabled to AppMenu 2025-11-13 16:23:57 +01:00
chfhtw 65df13ca9f add slot to AppMenu 2025-11-13 16:23:04 +01:00
Harald Bamberger 1d786d3e16 Merge branch 'master' into feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen 2025-11-13 16:09:31 +01:00
Harald Bamberger 339639cc6e add Link to Lehrauftraege to apps menu in stv 2025-11-13 15:48:20 +01:00
Cristina 993dff3351 Gendered phrase lektorInnen (FHTW style) 2025-11-13 11:11:37 +01:00
Cristina 0a118a1427 Clustered LV-Evaluierung phrases after merge 2025-11-13 10:50:36 +01:00
Cristina 4ab0c0a44e Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-11-13 10:44:39 +01:00
chfhtw e36e86fd50 Code Quality 2025-11-13 09:54:56 +01:00
Cristina d99d1c5ca0 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-11-13 09:49:37 +01:00
Cristina 43281c6ba2 Removed test buttons from FhcChart basic template 2025-11-13 09:48:54 +01:00
chfhtw cd574cd12c Reload settings setup on language change 2025-11-13 09:39:38 +01:00
chfhtw 95f1c66684 Stv Settings Phrases 2025-11-13 09:11:06 +01:00
chfhtw 5d957e38ae Phrase settings saved 2025-11-13 08:52:47 +01:00
chfhtw 7566e8aac2 Make AppConfig a general Component 2025-11-13 08:48:54 +01:00
Johann Hoffmann 8b851221b0 cis4 main content element shrinkability with style="min-width: 0;" 2025-11-12 12:05:48 +01:00
chfhtw 7fdfa94d11 Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-12 08:15:56 +01:00
chfhtw 77604c5e15 StV: Font Size setting 2025-11-12 08:02:06 +01:00
Harald Bamberger 84b9b08d28 Merge branch 'studvw_2025-11_rc' 2025-11-11 16:40:30 +01:00
Johann Hoffmann 2920c68f05 wip 2025-11-11 15:59:42 +01:00
Johann Hoffmann 74937db204 WIP email logs to read/send in job; 2025-11-11 15:52:04 +01:00
Johann Hoffmann 410f0c4b6a fixtermin -> "kein neichreichen erlaubt" phrase/bool logic change; signatur message on enduploads fetched from signatur server on every load request; Inplace toggle for further infos in offcanvas timeline & student details on mobile view(tooltips); reworked col/row structure on detail views for mobile; 2025-11-11 13:44:47 +01:00
Harald Bamberger a9e90cf10d add absoluteJsImportUrl helper function - to generate absolute urls with fhcomplete_build_version for dynamic imports - and use it in stv config 2025-11-11 13:01:48 +01:00
Paolo 0b6dc34220 If docsbox queue is slow, the DocsboxLib can stop checking the queued document status and raise an error 2025-11-10 15:41:01 +01:00
Harald Bamberger b31ebf3412 Merge branch 'feature-67518/Studierendenverwaltung_Karteireiter_anzeigen_verstecken_wenn_Interessent_gewaehlt' into studvw_2025-11_rc 2025-11-10 13:20:36 +01:00
Harald Bamberger 00eac334c0 Merge branch 'feature-63443/Studierendenverwaltung_Tab_Abschlusspruefung_Finetuning' into studvw_2025-11_rc 2025-11-10 12:48:01 +01:00
chfhtw 775d865878 StV settings 2025-11-10 12:38:57 +01:00
Harald Bamberger d2b1eb4645 Merge branch 'feature-68738/FHC4_Studierendenverwaltung_Studentlist_Export' into studvw_2025-11_rc 2025-11-10 09:40:42 +01:00
Johann Hoffmann cef0046acd speeddial icon/positioning; textarea styles; fixtermin phrase; wip inverting fixtermin bool logic to avoid double negative semantics 2025-11-07 14:19:17 +01:00
Johann Hoffmann a61d5b1d62 orgform/studstatus cols; 2025-11-07 11:17:59 +01:00
Alexei Karpenko f15932964f Studierendenverwaltung email: descending order kontakt_id 2025-11-07 01:06:22 +01:00
Alexei Karpenko 5678c18619 keepemailunverified parameter: email is passed even if unverified 2025-11-07 00:51:07 +01:00
Johann Hoffmann b1a1cdf235 studiensemester dropdown filter, default all, options are current/next and op to 10 back; benotet/unbenotet/alle fetch parameter; WIP orgform/studstatus cols; 2025-11-06 16:29:24 +01:00
ma0068 74a00a4ce0 changes according to userStory #68983 2025-11-05 17:26:39 +01:00
Harald Bamberger 1c5d3d7c78 Merge branch 'master' into studvw_2025-11_rc 2025-11-05 17:15:39 +01:00
Harald Bamberger 1ac9c9b6cb Merge branch 'feature-68672/Studierendenverwaltung_Suche_nach_Personenkennzeichen_und_Matrikelnummer' 2025-11-05 17:10:40 +01:00
Harald Bamberger 303f29ebdb Merge branch 'bug-68772/Suche_mit_Sonderzeichen' 2025-11-05 17:07:17 +01:00
Harald Bamberger 383590fa6b Merge branch 'master' into feature-68672/Studierendenverwaltung_Suche_nach_Personenkennzeichen_und_Matrikelnummer 2025-11-05 16:55:26 +01:00
Harald Bamberger 0d449d60c2 Merge branch 'master' into studvw_2025-11_rc 2025-11-05 16:51:38 +01:00
chfhtw 5ecd81bb09 translate logout 2025-11-05 16:50:22 +01:00
chfhtw 1cdebbe977 remove unused changed eventlistener 2025-11-05 16:49:12 +01:00
chfhtw a97a176522 use phrasen in stv list 2025-11-05 16:47:31 +01:00
Harald Bamberger 327e849fc6 Merge branch 'bug-66932/studierendenverwaltung_status_tab_fehlermeldung_meldestichtage' 2025-11-05 16:46:19 +01:00
chfhtw ede2e1710e Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-05 16:45:21 +01:00
Harald Bamberger f54ad298fa Merge branch 'feature-69107/StringHelpersCapitalize' 2025-11-05 16:41:31 +01:00
Harald Bamberger 5e1fc3abf7 Merge branch 'master' into feature-69107/StringHelpersCapitalize 2025-11-05 16:39:06 +01:00
Harald Bamberger 819a7ef219 Merge branch 'master' into studvw_2025-11_rc 2025-11-05 16:33:40 +01:00
Harald Bamberger d815176bab Merge branch 'bug-66890/studierendenverwaltung_statuswechsel_doppelte_statuseintraege' 2025-11-05 16:29:41 +01:00
Harald Bamberger 4e01420ce0 Merge branch 'master' into bug-66890/studierendenverwaltung_statuswechsel_doppelte_statuseintraege 2025-11-05 16:22:58 +01:00
Harald Bamberger 683360b13a Merge branch 'master' into studvw_2025-11_rc 2025-11-05 16:17:39 +01:00
Harald Bamberger 9042caa06b Merge branch 'bug-66774/Messages_Vorlagen_Subject_Bezeichnung_statt_Vorlagekurzbz' 2025-11-05 16:12:17 +01:00
Harald Bamberger 9668c67197 Merge branch 'bug-66933/studierendenverwaltung_message_tab_fehlermeldung' 2025-11-05 16:05:48 +01:00
Harald Bamberger 84610faedc Merge branch 'master' into bug-66933/studierendenverwaltung_message_tab_fehlermeldung 2025-11-05 15:58:48 +01:00
Harald Bamberger 8c4a163671 Merge branch 'master' into bug-66774/Messages_Vorlagen_Subject_Bezeichnung_statt_Vorlagekurzbz 2025-11-05 15:53:36 +01:00
Johann Hoffmann 9e40c6b21f declaration, import & binding of capitalize function from StringHelpers.js; 2025-11-05 15:41:17 +01:00
Johann Hoffmann 3878fce625 wip abgabetool; 2025-11-05 15:34:10 +01:00
Andreas Österreicher 67d41f1df9 Note Bestanden am Diploamsupplement priorisiert damit diese als
"bessere" Note als Nicht Genügend gewertet wird
2025-11-05 14:26:45 +01:00
chfhtw 6011109132 Fix language on details tabs 2025-11-05 11:44:25 +01:00
chfhtw cc3da1439d StV: add user menu 2025-11-05 11:06:45 +01:00
Harald Bamberger c97e1b6453 Merge branch 'feature-67490/studstatus_suche_abort_controller_haengt' 2025-11-05 11:06:32 +01:00
Harald Bamberger 72403e0960 Merge branch 'feature-68745/Menue_zur_Verlinkung_von_Apps' into studvw_2025-11_rc 2025-11-04 17:12:19 +01:00
Harald Bamberger e91b829c25 Merge branch 'feature-68390/Studierendenverwaltung-Details_Header_und_Tabsnav_nicht_mitscrollen' into studvw_2025-11_rc 2025-11-04 17:11:23 +01:00
Harald Bamberger c56fd038b8 Merge branch 'feature-63445/Studierendenverwaltung_Filter' into studvw_2025-11_rc 2025-11-04 17:10:24 +01:00
Harald Bamberger 24c014e8dd Merge branch 'feature-63444/stv_mehrfachaktion_mail_an_private_oder_interne_adresse' into studvw_2025-11_rc 2025-11-04 17:06:23 +01:00
Harald Bamberger 608dab1e65 Merge branch 'feature-63435/Studierendenverwaltung_Studierende_Verbandsgruppen_und_Spezialgruppen_zuordnen_Multiaktion' into studvw_2025-11_rc 2025-11-04 17:03:52 +01:00
Harald Bamberger fe1433a19c Merge branch 'feature-63374/Studierendenverwaltung_International_Baum_Filter' into studvw_2025-11_rc 2025-11-04 16:56:51 +01:00
Harald Bamberger 8c83e08472 Merge branch 'feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen' into studvw_2025-11_rc 2025-11-04 16:55:20 +01:00
chfhtw 0893ec30d9 Bugfix: use plainto_tsquery instead of to_tsquery to avoid errors on special chars 2025-11-04 15:26:18 +01:00
Harald Bamberger 0417afeea8 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into studvw_2025-11_rc 2025-11-04 14:56:54 +01:00
chfhtw 9601c8bdd2 add personenkennzeichen & matrikelnummer to stv search config 2025-11-04 11:40:08 +01:00
Harald Bamberger 146bb5f336 replace legacy lvplan link in room content with cis4 lvplan link 2025-11-03 15:34:54 +01:00
chfhtw 9e4401d441 better contrast for apps-menu-button 2025-11-03 13:14:14 +01:00
Andreas Österreicher aa43a2f32c Merge branch 'master' into feature-55978/infocenter_electronic_onboarding_filter 2025-11-03 12:57:41 +01:00
chfhtw d6c4e0db41 show submit btn in StV 2025-11-03 11:36:24 +01:00
chfhtw 398478e575 searchbar submit button 2025-11-03 11:36:10 +01:00
chfhtw 17540070a1 remove comments 2025-11-03 11:35:31 +01:00
chfhtw d923f30ccf Add search from url functionality 2025-11-03 11:05:26 +01:00
Johann Hoffmann 3d51753419 new bootstrap offcanvas component; projektarbeit abgabetermine timeline & status legende in offcanvas; fixtermin toggle & allowed to edit all termine for assistenz; studiengang selection + filter for getSTG_isEntitledFor('basis/abgabe_assistenz:rw'); moved filedownload from Cis/Abgabetool Auth Controller to Abgabe.php Api Controller; status symbol in table columns prevTermin/nextTermin; get_betreuer_details pgsql function to avoid rewriting the same subquery for every betreuer anrede; 2025-10-31 11:14:39 +01:00
Andreas Österreicher 3c910d03bb Fixed Problem with Special Characters in Permission Description 2025-10-30 15:33:12 +01:00
chfhtw fc16a9e4c6 Stv: add search results to student list 2025-10-30 14:01:46 +01:00
chfhtw 9699684946 Stv: students search function 2025-10-30 14:00:41 +01:00
chfhtw 06b562786d searchbar: make abort function 2025-10-30 14:00:03 +01:00
chfhtw 539c78166f Stv list: allow post calls on tabulator 2025-10-30 13:59:12 +01:00
chfhtw 5a0134c6cc searchbar: prevent clear on enter 2025-10-30 13:58:18 +01:00
chfhtw a8535e6e0f replace old $fhcApi calls with new $api 2025-10-30 13:57:15 +01:00
Andreas Österreicher 5677142b0b Merge branch 'feature-68676/Ausbildungsvertrag_Lehrgaenge_2025' 2025-10-30 12:59:47 +01:00
ma0068 c78eef8af5 add validation for required props, refactor slots 2025-10-28 09:31:04 +01:00
Johann Hoffmann ac1e0a8aa3 Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	system/phrasesupdate.php
2025-10-27 14:51:52 +01:00
Johann Hoffmann 259c2aec14 load projektarbeiten for studiengänge -> assistenz page; speed dial position rework; automagicmodal logic fix; activeTabIndex by date in detail views; tooltips on icons; $capitalize phrasen to ensure capitalization; phrasenpromise & resolve similar to anw; modal component emits fullscreen event now; 2025-10-27 14:40:56 +01:00
ma0068 6a7de7417b student view: reload after delete or upload 2025-10-27 13:50:25 +01:00
ma0068 c12678ca5a buttons edit and delete foto: adapt for better visibility, add preview to upload 2025-10-27 13:43:59 +01:00
Alexei Karpenko 565640c73b Ausbildungsvertrag: akad grad from Studienordnung is own field 2025-10-26 17:36:22 +01:00
Andreas Österreicher 3c9a52e389 Merge branch 'feature-68950/Anmelderegel' 2025-10-24 13:44:35 +02:00
Andreas Österreicher 3e52ea39d5 LVRegel Fixed Semester Check 2025-10-24 13:36:11 +02:00
Andreas Österreicher 2b53eb327f LVRegeln - Abschlussregel bei Anmeldung entfernt da diese dort zu Problemen führt 2025-10-24 13:10:41 +02:00
ma0068 84bfea0be9 make Prestudent.js and Details.js responsive 2025-10-24 11:18:19 +02:00
chfhtw 406b93a628 remove comment & renaming Studierenden Verwaltung to Studierendenverwaltung 2025-10-24 09:22:17 +02:00
ma0068 4be0a831a1 add Phrases 2025-10-23 13:49:05 +02:00
ma0068 9ed3251e55 open in iframe, only show tab if count in config is valid 2025-10-23 12:55:14 +02:00
chfhtw 94d5e8f780 use AppMenu in LvV 2025-10-23 12:48:11 +02:00
chfhtw 5baf8b645f use AppMenu in StV 2025-10-23 11:49:07 +02:00
chfhtw 11daf96850 add navigation entries for StV & LvV 2025-10-23 11:48:55 +02:00
chfhtw 752ef8a57b AppMenu Component 2025-10-23 11:48:03 +02:00
chfhtw 8ddc2f02fe SVG Icons 2025-10-23 11:47:33 +02:00
Alexei Karpenko 1623c8e51c Ausbildungsvertrag: akadgrad is coming from Studienordnung 2025-10-22 16:57:19 +02:00
ma0068 9a8fbabbe4 move dropdown profileUpdateStates to FilterComponent, delete not needed code 2025-10-22 14:25:43 +02:00
ma0068 6337869098 new Multitab CombinePeople, start Function 2025-10-22 10:23:24 +02:00
ma0068 1423579a49 refactor Profile Update for filter, backendfilter not active 2025-10-21 14:42:02 +02:00
Andreas Österreicher 87ec4fd482 Problem beim Drucken von Zeugnissen behoben wo die LV der
Studienverpflichtung Sonderzeichen enthält
2025-10-20 17:32:43 +02:00
ma0068 6e9969d9e4 use shorter table names for columns stg and orgform , add column ausbildungssemester 2025-10-20 16:08:12 +02:00
Andreas Österreicher 4407310f40 Merge branch 'master' into feature-67484/lvverwaltung_finetunning 2025-10-20 11:33:43 +02:00
Harald Bamberger 4495632393 join only prestudent for studiengang_kz of student 2025-10-17 14:45:03 +02:00
ma0068 9fa7166c84 added download to StudentList 2025-10-17 12:33:22 +02:00
chfhtw 1fbca8bdab Bugfix: Add overflow for horizontal scrolling 2025-10-17 10:14:47 +02:00
Harald Bamberger a9670fce5c Merge branch 'bug-68555/Dokumente_Studienbestaetigung_wird_nicht_angezeigt' 2025-10-16 15:38:37 +02:00
chfhtw e7788fc18f Bugfix: format betrag in StV Konto correctly 2025-10-16 08:38:59 +02:00
chfhtw 11205e9ec1 Bugfix: multiple types in CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN config were concatenated wrong in CIS 4.0 2025-10-16 08:38:17 +02:00
ma0068 7755dc12d0 View Studierendenverwaltung
- add badge unruly
- add tileSlots for PersKz, MatrikelNr, person_id
- remove MatrikelNr and person_id from left side
- add attribut unruly to student object
2025-10-15 13:55:54 +02:00
Cristina 343964750b Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-10-14 17:22:39 +02:00
Cristina 0201bac046 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-10-14 17:19:29 +02:00
Johann Hoffmann 0d2e41cf2f added paabgabetyp columns "aktiv", "upload_allowed", "aktiv"; setting sensible default values for existing typen that are just the developers best guess really; accordion header with icons & tooltips; logLib in Abgabe API controller logging all successful delete/insert/update requests; show arbitrary '23:59' string after target date so it is clear until when the upload should be fulfilled, even though we still dont do anything technically different; new Termine can only be made with aktiv paabgabe typen; note & benotungsnotiz now tied to paabgabetyp benotbar flag instead of hardcoded for qgate1 & 2; added "noch nicht abgegeben" text in case the abgabedatum is null; modal now spawns in xl with fullscreen optionally enabled; 2025-10-14 16:45:28 +02:00
Cristina 2aee86baba Changed phrase lvevaluierung/logoutText 2025-10-14 16:16:23 +02:00
ma0068 15a9379c6e use Slots for Core Detail Header: Tags, Issues, TileSlots 2025-10-14 15:45:11 +02:00
Harald Bamberger 9d306fcb7e Merge branch 'feature-68388/FHC_Alert_should_be_loaded_always' 2025-10-14 09:41:12 +02:00
ma0068 40512edef0 add emit redirect to reload parent 2025-10-13 16:46:29 +02:00
ma0068 e9c039dad2 Refactor detailHeader component for PV21
- own css.file for fotouplad
- domain as prop
- refactor link to Leitung
- slots for issuetracking and tags
2025-10-13 16:07:51 +02:00
Harald Bamberger fed45015bd set updateamum, updatevon when changing profile update status 2025-10-13 11:18:45 +02:00
Alexei Karpenko 07bcbee11b add Interessent: insertamum and insertvon when adding prestuden 2025-10-13 10:52:52 +02:00
chfhtw 440477d249 Quickfix: Api errors sometimes will not be displayed 2025-10-13 09:30:35 +02:00
Alexei Karpenko b9cb8f9cce Interessent anlegen: bugfix Geburtsdatum save, when searching for existing persons, more fields are displayed, form is emptied each time it is opened, adress can only be added, but not overwritten 2025-10-10 16:42:14 +02:00
ma0068 c7f2b145bf add checkBerechtigungen for Notes person_id and notes prestudent_id 2025-10-10 14:15:40 +02:00
Andreas Österreicher f483e87455 Merge branch 'feature-61673/pep_lv_entwicklung' 2025-10-10 09:35:45 +02:00
Johann Hoffmann 14aad56d5e datepicker css overflow fix; returned modalMagic to old form since its simpler now 2025-10-09 12:40:53 +02:00
chfhtw 601c4367dc use fhcApps for CIS 2025-10-09 10:57:51 +02:00
chfhtw 70c230edce use fhcApps for LogsViewer/LogsViewer 2025-10-09 10:44:13 +02:00
chfhtw d294d17e37 use fhcApps for lehre/lvplanung/LvTemplates 2025-10-09 10:42:22 +02:00
chfhtw d88cc77a5c use fhcApps for Studstatus 2025-10-09 10:40:02 +02:00
chfhtw 61600e78b6 use fhcApps for Bismeldestichtag/Bismeldestichtag 2025-10-09 09:27:31 +02:00
chfhtw ea0b69d4c2 use fhcApps for ProfilUpdateRequest 2025-10-09 09:15:26 +02:00
chfhtw 0309c04ae0 use fhcApps for Cis/Documents 2025-10-09 08:46:09 +02:00
chfhtw 3c3e920573 use fhcApps for Studentenverwaltung 2025-10-09 08:43:12 +02:00
chfhtw d389cf87b8 delete MyLv->Info because app does not exist anymore and url is rerouted to MyLv->index 2025-10-09 08:42:29 +02:00
chfhtw 09864c5154 remove unused view that links to a non existing app 2025-10-09 08:41:58 +02:00
Johann Hoffmann f03411c668 legacy cis abgabetool routes; abgabetool.css for legacy cis; endupload & fixtermin logic enabled; paabgabe template rearranged; legacy view, controller has cis4 switch; viewData & router props workaround with CI3 router logic; wrapper app legacy cis; fix enduplaod validation; 2025-10-08 17:41:00 +02:00
Harald Bamberger 5be4e5e0f7 remove debug code 2025-10-08 17:34:13 +02:00
Harald Bamberger 6bf823b4cf return oe_kurzbz instead of array oe_kurzbz 2025-10-08 17:32:23 +02:00
ma0068 204ae1a469 refactor prepareQuery, use and take into account config parameters, refactor autoSelectRows 2025-10-08 16:34:39 +02:00
Harald Bamberger 2c3843fce6 ProfilUpdate Modal styling 2025-10-08 16:03:41 +02:00
Harald Bamberger 0fa8b6bc32 add permission to view attachements when accepting/rejecting 2025-10-08 15:46:42 +02:00
Harald Bamberger c79e329439 add iso dates to result object of profile updates api endpoint, use iso date in tabulator to sort correctly and format with luxon js 2025-10-08 15:35:28 +02:00
chfhtw d2f21ba4e6 use fhcApps for LVVerwaltung 2025-10-08 14:45:12 +02:00
Harald Bamberger 5fbcc60c67 fix bug when editing profile request adding a file and no previous file exists 2025-10-08 14:37:25 +02:00
ma0048 e11d72ace0 bei den tags copy button hinzugefuegt
datatree reexpand gefixed nach dem loeschen und hinzufuegen
2025-10-08 13:48:45 +02:00
chfhtw 842dabc1e7 add fhcApps functionality to view template 2025-10-08 13:37:06 +02:00
chfhtw 67281c84ed FhcApps Library 2025-10-08 13:36:20 +02:00
ma0068 3a6c8dfd2d adapt event dataProcessed and method autoselect 2025-10-08 10:28:14 +02:00
ma0068 450789ed72 extend query getStudents, change zuordnung_type from uid to prestudent 2025-10-08 09:12:54 +02:00
kindlm 3549fc1b1b Merge remote-tracking branch 'origin/master' 2025-10-07 18:43:11 +02:00
kindlm 06788bafc8 ParseHTML bei statistik.class ergänzt. SVNR aus BIS-Checks entfernt 2025-10-07 18:42:50 +02:00
Harald Bamberger e4943e0bb8 Merge branch 'feature-67550/CIS4_Profilupdate_Finetuning' 2025-10-07 16:22:09 +02:00
Harald Bamberger 4054a0cfee format Zutrittskarte Datum 2025-10-07 15:24:45 +02:00
Andreas Österreicher da43c88567 Merge branch 'feature-68386/Access_the_FilterComponent_without_Permission_breaks_all_Filters' 2025-10-07 15:17:36 +02:00
Harald Bamberger b681ca29c1 add info alert for heimatadresse, tune duplicate zustellkontakt handling 2025-10-07 15:13:07 +02:00
Paolo 5f57c53ed0 Api.js: better error handling 2025-10-07 14:47:34 +02:00
Paolo 8a1ca9a598 Checked that the session is not an error in the FilterComponent 2025-10-07 13:33:49 +02:00
Andreas Österreicher 9927667086 Merge branch 'feature-47972/pruefungsverwaltung_ects_angabe' 2025-10-07 12:53:52 +02:00
Andreas Österreicher ba0dd5341f Merge branch 'feature-62007/Defaultstunden_fuer_Betreuung_von_Bachelorarbeiten' 2025-10-07 11:21:32 +02:00
Harald Bamberger a1d616ff03 alter profilupdate api if heimatadresse is updated create new adress, readd missing isMitarbeiter info in frontend an provide/inject it 2025-10-06 18:27:19 +02:00
Alexei Karpenko 309faaae06 phrasesupdate coma bugfix 2025-10-06 16:57:31 +02:00
Alexei Karpenko 1c21e8f88d Merge branch 'master' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-10-06 16:54:41 +02:00
ma0068 984d81edb6 add tag component to List.js, add column tags to table, add functionality add, delete and update 2025-10-06 16:37:17 +02:00
Alexei Karpenko 5640f229d3 Studierendenverwaltung add Interessenten: switched to new API, Studienplaene are loaded in time 2025-10-06 16:10:06 +02:00
Johann Hoffmann 1e23b6de61 download files with window.open instead of window.location; fix signature mail student_modal info loading; check length of every entry field when doing endupload and force user to accept or cancel upon notification; berechtigung check für Abgabetool.php controller; phrasen everywhere; 2025-10-06 13:58:26 +02:00
Harald Bamberger 1340e762c3 Merge branch 'master' into feature-67550/CIS4_Profilupdate_Finetuning 2025-10-06 13:24:03 +02:00
ma0048 9309a48e97 autcomplete gefixed 2025-10-06 10:20:21 +02:00
Alexei Karpenko b22c6c10e4 Student.php controller: renamed method add Interessent to addFirstPrestudentstatus 2025-10-03 14:05:40 +02:00
Alexei Karpenko 60a1d40048 prstudentlib incoming: removed addmeta (debugging) 2025-10-03 14:03:41 +02:00
Alexei Karpenko 8c6033fed6 add first incoming: correctly check lehrverband, moved creating of incoming prestudentstatus to prestudent lib 2025-10-03 14:02:53 +02:00
ma0068 e79bb607d9 add permission validation oe for lehreinheit 2025-10-03 10:23:25 +02:00
Johann Hoffmann dab34eff35 klickibunti farben in accordion headers je nach datum/abgabedatum combo; more color definitions cis4 default.css; nomore legacy classes in Abgabe.php, CI3 models only; confirm delete Termin prompt; endupload validation stub, not sure about the technical min requirements here; mitarbeiter table format fix; show noten in projektarbeit view for students so there is some distinction; fhc isMobile computed revamp; order projektarbeiten by insertamum DESC to get most recent ones at the top of lists; 2025-10-02 16:53:41 +02:00
Alexei Karpenko 3a6fb08350 Creating of Interessenten: moved to PRestudentlib, renamed check to getPerson, corrected transaction handling, enabled creating of Incomings 2025-10-02 16:52:11 +02:00
Andreas Österreicher 00696bfa20 Merge branch 'feature-40314/Electronic_Onboarding_Anbindung_IDA' 2025-10-02 14:40:23 +02:00
Andreas Österreicher 666a6ea42c Merge branch 'master' into feature-40314/Electronic_Onboarding_Anbindung_IDA 2025-10-02 14:32:00 +02:00
ma0048 81725a0fe9 echterdv ueberprfung fixed 2025-10-02 14:27:14 +02:00
Paolo 35b37dec55 Other filters are still working even if for one of them the user does not have permissions 2025-10-02 13:34:44 +02:00
Paolo a2d2025e4c Fixed 2025-10-02 13:33:47 +02:00
Cristina 0d51df95f9 Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-10-02 11:30:55 +02:00
Cristina bfd513a475 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-10-02 11:27:31 +02:00
Harald Bamberger 3d50eacdc3 limit height of profile img in detail header 2025-10-01 18:45:26 +02:00
Harald Bamberger 4e4269033b Merge branch 'master' into feature-63445/Studierendenverwaltung_Filter 2025-10-01 17:50:22 +02:00
Harald Bamberger 9d2b147248 Details Header und TabsNav nicht mitscrollen 2025-10-01 17:32:17 +02:00
Harald Bamberger d148eaed11 ReservierungModel getRerservierungenMitarbeiter remove unused paramter ort_kurzbz, StundenplanLib only query reservations for logged in user if request is for the personal lv plan aka if ort_kurbz is empty 2025-10-01 16:19:15 +02:00
chfhtw 7b1bb27b34 Multiselect group selection: show only when all selected have an UID 2025-10-01 14:53:08 +02:00
chfhtw 2f20ddaefa Change StV config to hide Tabs when Prestudents without UID are selected 2025-10-01 14:51:29 +02:00
chfhtw ba7cfc3890 Make showOnlyWithUid and showOnlyWithoutUid available for multiselects 2025-10-01 14:50:18 +02:00
Harald Bamberger ecbb6744a7 readd renderif feature from commit d6bdad27b2 to searchbar 2025-10-01 14:26:58 +02:00
Cristina deebe987d3 Added slot selectedItem to autocomplete component in Input.js 2025-10-01 13:51:43 +02:00
Cristina cb77f3148a Added method to get Stundenplantermine for Lehreinheit/Lehrveranstaltung 2025-10-01 13:50:57 +02:00
Cristina cb64c83b50 Added method to get LV-Leitung from given LV 2025-10-01 13:48:10 +02:00
Harald Bamberger ac5ce1573a Merge branch 'master' into bug-66890/studierendenverwaltung_statuswechsel_doppelte_statuseintraege 2025-10-01 13:24:45 +02:00
ma0068 890b50c830 add new api for notiz 2025-10-01 13:13:41 +02:00
Harald Bamberger 57345940ef Merge branch 'feature-63394/StV_Favoriten_64_Zeichen_Variablenbeschraenkung' 2025-10-01 12:03:21 +02:00
Johann Hoffmann c796536417 notiz -> beurteilungsnotiz; some missing phrasen; more color definitions (WIP); finalize automagic modal logic; added validation stub for endupload; loading spinner on every upload; added custom header classes to code unexpanded paabgabe accordion tabs by their abgabedatum or lack thereof (WIP); 2025-09-30 16:47:05 +02:00
Harald Bamberger 10b6641aa2 Merge branch 'master' into feature-63394/StV_Favoriten_64_Zeichen_Variablenbeschraenkung 2025-09-30 14:51:10 +02:00
chfhtw 1414d5f1ef Code Quality 2025-09-30 14:10:21 +02:00
Harald Bamberger 81e705f297 Merge branch 'feature-63430_63431/bugfixes_checkbox_dual_and_setAbsolvent_with_user_schuhch' 2025-09-30 13:22:48 +02:00
Harald Bamberger 9a74ab9c63 add empty option to zgvnation, zgvmanation, zgvdoktornation, berufstaetigkeit_code and ausbildungcode. to not violate fk set empty value for those to null in backend 2025-09-30 13:19:18 +02:00
Harald Bamberger 8fdabcb317 handle boolean values explicitly 2025-09-30 12:22:12 +02:00
chfhtw f9e2d784cf phrases for fhtw addon 2025-09-30 11:47:34 +02:00
chfhtw f518d56d4e StV: configurable Filters 2025-09-30 11:01:08 +02:00
Harald Bamberger 93fa0ed180 deleteStatus fix isMeldestichtagErreicht comparison, add modal-dialog-scrollable class to status modal 2025-09-30 10:51:14 +02:00
ma0068 3664428467 add logic to edit and delete Personfoto 2025-09-30 10:50:01 +02:00
Harald Bamberger 3551172c0b reenable meldestichtag check 2025-09-30 09:33:07 +02:00
Harald Bamberger 795378bf40 Merge branch 'master' into feature-63430_63431/bugfixes_checkbox_dual_and_setAbsolvent_with_user_schuhch 2025-09-30 09:13:10 +02:00
Harald Bamberger 76e6874a1a Merge branch 'master' into feature-63444/stv_mehrfachaktion_mail_an_private_oder_interne_adresse 2025-09-29 17:33:23 +02:00
Harald Bamberger 3c47453762 add projektarbeit tab to tab_order 2025-09-29 15:49:13 +02:00
Harald Bamberger 4fa2de5105 Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-09-29 15:37:42 +02:00
Harald Bamberger ca55c8b1a7 Archiv.js: import add missing file extension, DocumentDropdown: remove wrapper div causing button not being aligned 2025-09-29 13:48:14 +02:00
Harald Bamberger 2ede54b60e ProfilUpdateView Tabulator add columns studiengang, orgform and oezuordnung, tune tabulator options e.g. headerfilter 2025-09-29 13:31:15 +02:00
Andreas Österreicher 9db14effdc Merge branch 'feature-67500/AnwesenheitenNanotuning' 2025-09-29 11:13:04 +02:00
Harald Bamberger 5c66dfad49 Merge branch 'master' into feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen 2025-09-29 08:24:18 +02:00
Harald Bamberger 8403384cc2 Merge branch 'feature-59258/Studierendenverwaltung_Kontakttypen' 2025-09-29 08:05:22 +02:00
Harald Bamberger 4a55b73461 do not query hidden contacts or the hidden contact type from db, remove hidden contact type filtering from frontend code 2025-09-29 08:03:04 +02:00
Harald Bamberger 159904b8ad Merge branch 'master' into feature-59258/Studierendenverwaltung_Kontakttypen 2025-09-26 15:00:00 +02:00
Harald Bamberger 245e4a3028 Merge branch 'feature-62462/FHC4_Studierendenverwaltung_Delete_Photo' 2025-09-26 14:37:55 +02:00
Harald Bamberger 0df9cf769f strip data image base64 prefix before storing foto, show dummy profile img when foto is null in DetailsHeader 2025-09-26 14:33:20 +02:00
Harald Bamberger 464b99b3f9 Merge branch 'master' into feature-62462/FHC4_Studierendenverwaltung_Delete_Photo 2025-09-26 14:29:32 +02:00
Harald Bamberger 845c75b775 Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-09-26 12:33:39 +02:00
Harald Bamberger e908215b05 use person_id from profilupdate request instead of logged in user to handle duplicates 2025-09-25 17:40:39 +02:00
Johann Hoffmann a021c85920 schönere phrasen 2025-09-25 17:23:03 +02:00
Harald Bamberger 6047b19f47 do not show contacts with type hidden in cis4 profile 2025-09-25 17:19:19 +02:00
Harald Bamberger e5778acf9d Merge branch 'feature-63437/cis4_iframe_component' 2025-09-25 16:15:17 +02:00
Harald Bamberger 58b942f044 fix typo in template_kurzbz 2025-09-25 16:14:09 +02:00
Harald Bamberger 2ef2948a6e prevent strange effects when switching between content_types 2025-09-25 16:02:43 +02:00
ma0048 e3b6852017 bug beim aendern des status auf student mit ausbildungssemester 0 behoben 2025-09-25 14:42:34 +02:00
ma0068 5326f961c6 DetailHeader: add uid to redirectToLeitung 2025-09-25 11:25:55 +02:00
ma0048 0f43e8eb7a autocomplete auf backend umgestellt
textarea formattedAnmerkung rausgenommen
ui angepasst
2025-09-24 14:27:01 +02:00
ma0048 6abdb25c0a abort controller fixed und index auf campus.tbl_studierendenantrag_status.studierendenantrag_id hinzugefuegt 2025-09-24 09:33:41 +02:00
ma0048 5efad50b62 added missing iframe component 2025-09-23 08:31:00 +02:00
Alexei Karpenko 6199283698 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-09-22 17:36:11 +02:00
Alexei Karpenko 3f0f48a4e0 Student.php: bracket bugfix, return person id of added Personinstead of true, Studierendenverwaltung Projektarbeit phrases 2025-09-22 17:34:50 +02:00
Harald Bamberger eaec76c3d2 Merge branch 'master' into feature-63437/cis4_iframe_component 2025-09-22 17:03:42 +02:00
Alexei Karpenko 0cb36c2d30 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-09-22 15:54:46 +02:00
Alexei Karpenko a533294121 removed addMeta in Student.php Studierendenverwaltung 2025-09-22 15:54:26 +02:00
Andreas Österreicher b5d44de0b4 Merge branch 'feature-66843/infocenter_studentenverwaltung_verlinkung' 2025-09-22 14:15:49 +02:00
Andreas Österreicher 60d09bd2a7 Merge branch 'bug-67504/notizcontroller_delete' 2025-09-22 14:10:17 +02:00
Andreas Österreicher 2b91ae87c0 Merge branch 'feature-61714/infocenter_hinweis_wenn_die_selbe_person_bereits_einen_aufrechten_status_im_selben_studiengang_hat' 2025-09-22 14:07:54 +02:00
Andreas Österreicher efcc4b8ea5 Merge branch 'feature-62331/infocenter_anmerkung_zur_bewerbung_weiterleiten' 2025-09-22 13:59:13 +02:00
Alexei Karpenko c07697c541 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-09-22 13:52:37 +02:00
ma0048 c69877ed85 bug beim loeschen von einer notiz mit doc 2025-09-22 13:41:58 +02:00
Alexei Karpenko 8e7a1a2ddd Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-09-22 13:39:36 +02:00
Andreas Österreicher f97951966c Merge branch 'deploy_22_09_25_lvverwaltung' 2025-09-22 10:49:15 +02:00
Johann Hoffmann 14f5a651a4 abgabetool rechte; WIP magic modal for next QG Termin logic handling; 2025-09-22 10:47:12 +02:00
ma0048 ef56af6337 lv teil hinzufuegen beim semesterwechsel das richtige semester preselecten
lv teil kopieren nur bei lv teilen anzeigen
2025-09-22 09:40:37 +02:00
Andreas Österreicher 3f5801f6ed Menüpunkt für LV-Verwaltung im Vilesci hinzugefügt 2025-09-22 09:26:13 +02:00
Alexei Karpenko d062e8903f Mitarbeiter model searchMitarbeiter method: removed redundant person id 2025-09-19 11:29:08 +02:00
Harald Bamberger 41143a6dfc profile functions use tbl_benutzerfunktion.beschreibung in column description, format date columns in profile tabulators, fix vuejs dev version warnings 2025-09-19 10:58:53 +02:00
Harald Bamberger 0577f3f8b9 Cis4 Profile only show current userfunctions with description from tbl_funktion 2025-09-18 18:46:11 +02:00
Alexei Karpenko 473715c25c Merge branch 'master' into feature-40314/Electronic_Onboarding_Anbindung_IDA 2025-09-18 17:39:31 +02:00
Alexei Karpenko 566938d4f0 Studierendenverwaltung Abschlusspruefung: moved Vorsitz and Pruefer search to backend, searched by vorname or nachname or combinations of vorname and nachname 2025-09-18 17:25:00 +02:00
ma0048 41dbd83bdb phrases
tags als default entfernt
master gemerged
2025-09-18 15:27:04 +02:00
ma0048 6a31eade8b Merge branch 'feature-60973/komponente_fuer_lehrfaecherverteilung' into deploy_22_09_25_lvverwaltung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-09-18 15:04:01 +02:00
ma0048 57531d956d gruppen in eigenen tab verschoben
styling
phrases
2025-09-18 13:18:44 +02:00
Harald Bamberger 5b42c438d0 Merge branch 'master' into feature-62462/FHC4_Studierendenverwaltung_Delete_Photo 2025-09-18 07:47:53 +02:00
Johann Hoffmann ce9f0536d6 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2025-09-17 16:40:53 +02:00
Andreas Österreicher e80cfc207e Merge branch 'feature-63370/AnwesenheitenMicrotuning' 2025-09-17 14:59:49 +02:00
Harald Bamberger af94cb1e40 Merge branch 'feature-63455/Studierendenverwaltung_Tab_Reihenfolge' 2025-09-17 14:25:04 +02:00
Harald Bamberger 8ae5ce27ce Merge branch 'bug-67033/Stv_Verband_Auswahl_springt' 2025-09-17 14:08:37 +02:00
Harald Bamberger bbfaf447f5 remove dependency to library from pv extension and do not delete salary history when gb is deleted since foreign key is configured on delete set null 2025-09-17 12:13:15 +02:00
ma0048 dff8223d3e sortierung der tags 2025-09-17 11:04:10 +02:00
ma0048 aca4195df6 stv kontaktieren tab hinzugefuegt 2025-09-17 11:01:08 +02:00
Harald Bamberger 7e40e34212 remove DMS_PATH from original user filename 2025-09-16 17:40:27 +02:00
Harald Bamberger fe8bdbd0e4 Merge branch 'feature-67041/CIS4_Profilupdate_bugfixes' 2025-09-16 13:55:16 +02:00
Harald Bamberger cef581178c show documents in status view 2025-09-16 13:52:52 +02:00
Harald Bamberger 34eb373061 adapt phrase profilUpdateInformationMessage 2025-09-16 13:39:15 +02:00
Harald Bamberger cb5623d228 label and layout for documents 2025-09-16 13:32:28 +02:00
Harald Bamberger 379270c296 consider person foto_sperre in advanced cis search 2025-09-16 11:57:27 +02:00
Harald Bamberger 7f7488e61e add fileupload to edit address for meldezettel upload 2025-09-16 11:45:49 +02:00
ma0048 651452d821 bug beim laden des status tabs ohne meldestichtag 2025-09-16 08:40:40 +02:00
ma0048 69a1e945b3 bug beim laden des messages tab ohne oe zuordnung 2025-09-16 08:36:12 +02:00
Harald Bamberger 9e6ae4f5a4 add phrase lehre/termineImLvPlan 2025-09-15 11:31:35 +02:00
Harald Bamberger c498119b6c fix cis4 cms link replacement in general content type when switching via vue router from one content to another 2025-09-15 11:08:33 +02:00
Andreas Österreicher e589aff1f3 Merge branch 'feature-66956/MobilityOnline_Incoming_LV_Uebernahme_optimieren' 2025-09-15 10:16:20 +02:00
Harald Bamberger bdfd3d86de Merge branch 'feature-62450/MyLv_VueRouter_Semester' 2025-09-15 07:24:53 +02:00
Harald Bamberger 2c60dcb0a9 Merge branch 'master' into feature-62450/MyLv_VueRouter_Semester 2025-09-15 07:20:28 +02:00
Harald Bamberger edf2eca348 Merge branch 'feature-62450/Drag_Drop_Dashboard_Chrome' 2025-09-15 07:01:06 +02:00
Harald Bamberger bc318e79f5 Merge branch 'master' into feature-62450/Drag_Drop_Dashboard_Chrome 2025-09-15 06:56:10 +02:00
Harald Bamberger f0d9a43733 fix LvPlan not rendering Events in timeGrid correctly 2025-09-13 11:08:19 +02:00
Harald Bamberger 1adf1622db Merge branch 'feature-67041/CIS4_Profilupdate' 2025-09-12 16:10:38 +02:00
Harald Bamberger 92ba45a84d cleanup Controller, move api functions to api controller, use api in tabulator, fix card refresh in profile right column, fix sancho mails 2025-09-12 16:09:03 +02:00
Alexei Karpenko 776222fd11 bugfix Studierendenverwaltung Projektarbeiten: correct default Stunden at all times 2025-09-12 13:52:21 +02:00
Johann Hoffmann b8d197d923 deleted entschuldigung email betreff 2025-09-12 13:50:25 +02:00
Andreas Österreicher 3cbec91c2a Merge branch 'feature-66982/Zeitaufzeichnung_Berufsschule' 2025-09-12 09:41:18 +02:00
Andreas Österreicher 012ae4ac62 Berufsschule für Lehrlinge als aktivität hinzugefügt in der
Zeitaufzeichnung
2025-09-12 09:39:06 +02:00
chfhtw d9c716a62b convert wert from public.tbl_variable to TEXT 2025-09-12 08:37:18 +02:00
Alexei Karpenko 97f72caf90 Studierendenverwaltung Projektarbeiten: display of lv orgform only if present, hiding modal again after save, Betreuer can be edited after initial creation of Projektarbeit 2025-09-12 02:02:31 +02:00
Andreas Österreicher e3ccb76e9b Reverted Table Sort-fix 2025-09-11 18:07:39 +02:00
Johann Hoffmann 48f7a04d81 wip abgabetool 2025-09-11 16:27:24 +02:00
chfhtw 0ae0ceb5d9 Bugfix: Stv Verband springt 2025-09-11 16:14:20 +02:00
chfhtw 6658e80d99 code quality 2025-09-11 14:58:20 +02:00
Harald Bamberger 087fb6a702 Merge branch 'feature-63370/AnwesenheitenMicrotuning' 2025-09-11 13:24:37 +02:00
chfhtw ee6e7f3a48 finetuning drag&drop 2025-09-11 13:13:57 +02:00
chfhtw 112211fb0b move function 2025-09-11 13:11:34 +02:00
Harald Bamberger 20f7c2e841 Merge branch 'master' into feature-63370/AnwesenheitenMicrotuning 2025-09-11 13:06:46 +02:00
Harald Bamberger 849a850e71 Merge branch 'feature-67026/CIS4_Zugriffe_loggen' 2025-09-11 12:57:07 +02:00
Harald Bamberger b7d9edc85d Merge branch 'master' into feature-67026/CIS4_Zugriffe_loggen 2025-09-11 12:56:46 +02:00
Harald Bamberger c9f8df8d98 Merge branch 'feature-63463/CIS_NEU_Logout' 2025-09-11 12:52:36 +02:00
Harald Bamberger 41773fb6f0 Merge branch 'master' into feature-63463/CIS_NEU_Logout 2025-09-11 12:52:09 +02:00
Harald Bamberger 632e7d74e5 add validation 2025-09-11 11:25:18 +02:00
Alexei Karpenko 06a41e24d6 Lehreinheit model getLesForLv method: only getting necessary fields to save memory 2025-09-10 17:39:32 +02:00
Alexei Karpenko 3a06dc613f Studierendenverwalung Projektarbeiten: preserve data before saved, modal not closed after saving 2025-09-10 17:28:15 +02:00
Harald Bamberger af32f65015 store routeinfo and advanced search info in db 2025-09-10 17:10:24 +02:00
Andreas Österreicher 4c3f9e42b9 Bankimport hinzugefügt 2025-09-10 14:29:58 +02:00
chfhtw 86bbfe42db missing break 2025-09-10 11:21:58 +02:00
Johann Hoffmann c9425a0061 'fileuploaddatum' phrase => 'FileUpload-Datum' 2025-09-10 11:20:32 +02:00
chfhtw 455698b28e StV Groups Drag&Drop 2025-09-10 11:18:23 +02:00
Johann Hoffmann b95dd49d0e assistenz uploaddatum -> antragsdatum; added new column 'fileuploaddatum'; 2025-09-10 10:44:43 +02:00
Harald Bamberger 14d49d87b3 also clear browser basic auth via additional fhclogout cookie in private/logout.php 2025-09-10 07:51:09 +02:00
Johann Hoffmann 708e03bda3 raumsuche phrasenpromise; lvMenu phrasenkeys; lv component property bezeichnung_eng so template can find it; 2025-09-09 11:31:19 +02:00
Andreas Österreicher 14cca2b4cc Problem behoben wodurch der Projektarbeitskarteireiter nicht geladen
wurde wenn das neue Config fehlt
2025-09-09 10:40:41 +02:00
Andreas Österreicher a2ff98b299 Merge branch 'master' into feature-62007/Defaultstunden_fuer_Betreuung_von_Bachelorarbeiten 2025-09-09 10:33:28 +02:00
Johann Hoffmann 20f936c22c 'emails an studierende' add phrasenkey for responsive translations lvmenu 2025-09-09 09:54:33 +02:00
Johann Hoffmann eee9d6b691 raumsuche phrasen change & fix; fhcapi -> api; lvMenu try to use phrasenkey for responsiveness instead of the already looked up phrase; tried investigating news carousel bug, not sure if bug or feature - at least declared non changing variables as const; 2025-09-08 17:28:09 +02:00
Johann Hoffmann d015b208fc dont reassign event.lektor inside computed property depending on event.lektor 2025-09-08 14:35:20 +02:00
Johann Hoffmann 56e74fc365 fix phrasesLib init so reference in lvMenuBuild event doesnt break 2025-09-08 11:59:25 +02:00
Johann Hoffmann 4e598a321d wip add new abgabe wizard 2025-09-08 10:44:41 +02:00
chfhtw ff061a3e95 FhcAPI: expose getConfig function 2025-09-05 14:04:41 +02:00
chfhtw 1b76b852cf Merge branch 'master' into feature-63435/Studierendenverwaltung_Studierende_Verbandsgruppen_und_Spezialgruppen_zuordnen_Multiaktion 2025-09-05 14:02:48 +02:00
Andreas Österreicher 9067f0e00a Merge branch 'master' into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2025-09-05 12:48:33 +02:00
Andreas Österreicher 4099d91a1b Vertragsverwaltung - Filter korrigiert fuer aktive und inaktive
Mitarbeiter
2025-09-05 12:45:39 +02:00
Johann Hoffmann 49ca538381 student page redesign; wip mitarbeiter page + add new modal 2025-09-04 17:38:32 +02:00
Andreas Österreicher 5889bdb6ea Merge branch 'feature-63359/StV_API_error_clustering' 2025-09-04 14:40:24 +02:00
Andreas Österreicher 6fb06397be Merge branch 'master' into feature-63359/StV_API_error_clustering 2025-09-04 14:32:10 +02:00
Andreas Österreicher a1f305aa51 Merge branch 'feature-61672/svnr_im_fas_ausblenden_bei_studierenden' 2025-09-04 14:17:09 +02:00
Andreas Österreicher 8bba492ec1 Check for existing Folder before loading possible routes 2025-09-04 13:36:14 +02:00
Johann Hoffmann 5f1c7537fb WIP 2025-09-04 11:04:12 +02:00
Andreas Österreicher 707a900ee4 Ortprüfung bei Pruefungszusammenlegung korrigiert 2025-09-03 18:38:29 +02:00
Cristina ed747fe07c Merge remote-tracking branch 'origin/epic-56039/LV-Evaluierung' into epic-56039/LV-Evaluierung
# Conflicts:
#	application/models/education/Lehrveranstaltung_model.php
2025-09-03 15:26:39 +02:00
Cristina 10d58d1a42 Added column prestudent_id to getStudentsByLv method query in Lehrveranstaltung_model.php 2025-09-03 15:24:44 +02:00
Cristina fd2ff27e22 Added column prestudent_id to getStudentsByLv method query in Lehrveranstaltung_model.php 2025-09-03 15:24:07 +02:00
Cristina 594333889d Merge branch 'epic-56039/LV-Evaluierung_NEU' of https://github.com/FH-Complete/FHC-Core into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-09-03 15:14:53 +02:00
Johann Hoffmann 2c3754b33f more tooltips so people can avoid reading the wiki 2025-09-03 13:51:41 +02:00
Cristina 174ed990a7 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-09-03 13:06:47 +02:00
ma0048 d027e62e75 neu hinzugefuegter tag an erster stelle 2025-09-03 11:21:08 +02:00
chfhtw 61cfb175e3 use undefined to avoid VueJs warning 2025-09-03 11:06:09 +02:00
ma0068 1bb10ddeb1 refactor backend filter 2025-09-03 10:43:20 +02:00
Andreas Österreicher eae7ac1f15 Merge branch 'master' into feature-47972/pruefungsverwaltung_ects_angabe 2025-09-03 06:53:07 +02:00
Andreas Österreicher bf83b71585 Removed ugly Border in Prüfungseverwaltung 2025-09-03 06:52:01 +02:00
Andreas Österreicher ab70968bfc Fixed Date Sort order in Pruefungsliste 2025-09-03 06:50:18 +02:00
ma0068 49e89f44be set default domain to fhcomplete.info 2025-09-02 20:37:20 +02:00
ma0068 e5cf417ac0 adapt headerFilter, remove frontend filter, add backend filter aktiv mitarbeiter 2025-09-02 20:29:23 +02:00
chfhtw 86641ea02d StV: Lehrverband- & Special-groups 2025-09-02 16:06:04 +02:00
chfhtw eae79e9f5e CSS fix: primevue autocomplete inside bootstrap input-group 2025-09-02 16:04:47 +02:00
chfhtw b378649b06 add validation "is_in_db" 2025-09-02 16:04:02 +02:00
Andreas Österreicher edce5716fd Merge branch 'feature-63370/AnwesenheitenMicrotuning' 2025-09-02 15:50:45 +02:00
Andreas Österreicher 8e4f2143f2 Merge branch 'feature-61742/UHSTAT_Staatenlos_Meldung_geht_nicht2' 2025-09-02 15:15:40 +02:00
Alexei Karpenko 0782de0550 uhstat form: moved constant down for better readability 2025-09-02 15:09:15 +02:00
Alexei Karpenko 022fb26e92 uhstat1 form: removed staatenlos code from dropdowns 2025-09-02 15:08:58 +02:00
ma0048 988ce11528 ueberpruefung der kompatiblen lvs regeln 2025-09-02 15:05:42 +02:00
Alexei Karpenko fc845ebf4e Studierendenverwaltung Projektarbeit: separate saving of Projektarbeit and Betreuer, added action for editing Betreuer 2025-09-02 15:04:45 +02:00
Andreas Österreicher e0a3df5d06 Merge branch 'feature-66775/UHSTAT_1_mit_normalem_login' 2025-09-02 14:59:52 +02:00
ma0048 0095595dd2 falsche kompatible lvs ueberpruefung rausgenommen 2025-09-02 14:11:48 +02:00
Johann Hoffmann a560c335b8 WIP responsive tabulator collapse abgabetool; paabgabe notiz column; 2025-09-02 13:35:42 +02:00
ma0048 396251b061 lvverwaltung einschraenkung bei den tags
erledigte tags werden in der header suche nicht beruecksichtigt
2025-09-02 13:35:15 +02:00
ma0048 374c1b66b5 alle fehlenden lvs markieren
alle abwaehlen
id im title
beim delete autocomplete beruecksichtigen
2025-09-02 12:56:45 +02:00
ma0048 ba6224bc78 oeh betrag aus der eigener tabelle holen
studentenverwaltung bei jedem studiensemester wechsel
fas nur einmalig ueber die variable
2025-09-02 11:18:24 +02:00
Johann Hoffmann fa6d651b21 phrasen & permissionLib/Phrases reference $param in lvMenuBuild event 2025-09-01 16:48:24 +02:00
Andreas Österreicher 05a3c40a9e Falschen Config Eintrag verschoben 2025-09-01 15:56:33 +02:00
ma0068 ea85cce957 own controller detailHeader, bugfix loadDepartmentdata 2025-09-01 09:37:30 +02:00
ma0048 0d1cf2b043 autocomplete bei den kompatiblen lvs beruecksichtigen 2025-09-01 09:20:33 +02:00
Johann Hoffmann 1f0fe08b69 upload_required => allowed; hardcoded links => config; styling; endupload/qualgate logic; phrasen; 2025-08-29 14:15:20 +02:00
ma0048 34528bb014 iframe content hinzugefuegt 2025-08-29 13:19:00 +02:00
Andreas Österreicher db61320b8c Merge branch 'master' into feature-47972/pruefungsverwaltung_ects_angabe 2025-08-29 12:57:39 +02:00
Andreas Österreicher f18de90c67 Merge branch 'nscbrandb-env_routes' 2025-08-29 12:11:06 +02:00
Andreas Österreicher 014d2b68ae Merge branch 'bug-66817/ku_udfs' 2025-08-29 11:41:15 +02:00
Andreas Österreicher 4bc58ee946 Merge branch 'feature-66852/raum_content_anzeige_im_alten_cis' 2025-08-29 11:23:38 +02:00
nscbrandb d17f87be09 also take environment config into account 2025-08-29 10:35:27 +02:00
ma0068 3cdb391a6d use helper file instead of private function for building dropdown entry 2025-08-28 14:29:26 +02:00
ma0068 7b187ebadd add Dropdown for Multiaction Print
add Event for adding Documents to PrintArray
add Berechtigung hasPermissionOutputformat to enable Print for odt and doc Formats (documents abschlusspruefung)
add Validations
2025-08-28 11:05:04 +02:00
ma0048 7df383f45e hinzugefuegte spann class caps durch den parser entfernt 2025-08-28 08:36:20 +02:00
Alexei Karpenko 1d634a2530 uhstat form: bewerbungstool user data is loaded if there is a login, normal logged in user data otherwise. renamed methods, removed unnecessary model loads 2025-08-27 16:23:58 +02:00
chfhtw 1024fc6cab Don't overwrite object => work with copies 2025-08-27 14:41:50 +02:00
ma0068 3a5c4444cb Tab Archive: Documentdropdown for Printing
- define structure for single print array
- fill array with documents according to Fas Dropdown Drucken
- event for adding documents from extension/addons
2025-08-27 14:11:03 +02:00
ma0048 9a35ee5945 raum content im alten cis wieder auf tablesorter 2025-08-27 11:48:35 +02:00
chfhtw 2d2bbd1bb3 Bootstrap Modal Component: forward shown-bs-modal event 2025-08-27 10:20:41 +02:00
chfhtw 41d26246aa Form Input Component: add name & use autocomplete that was loaded in the CI View 2025-08-27 10:19:39 +02:00
ma0048 7e6643c0ff phrase typo 2025-08-27 09:51:34 +02:00
ma0048 e2147c8f1f regeln von kompatiblen lvs wird geprueft
zusammen legen von pruefungsterminen ermoeglicht
2025-08-27 08:40:57 +02:00
Johann Hoffmann 63390b192c qualgate 1&2 dbupdate script, note fkey reference & upload required flag in paabgabe; noten api duplicate from notentool for now; WIP more emails; qualgates benotbar & saveable aswell as upload flag; 2025-08-26 17:15:37 +02:00
Andreas Österreicher e366556992 Dienstverhinderung für Volksschultag hinzugefügt 2025-08-26 16:05:06 +02:00
chfhtw f1c9e641bb API: feedback for stv status dropdown 2025-08-26 14:25:29 +02:00
chfhtw 1ef884de8c API: return results on multicall 2025-08-26 14:25:04 +02:00
ma0048 045b764d65 studentenverwaltung im infocenter verlinkt 2025-08-26 12:40:27 +02:00
ma0048 e79b7a525f pruefung bestaetigen bestaetigungsmail schicken ermoeglicht 2025-08-26 11:41:10 +02:00
Andreas Österreicher d7c56ad05d Merge branch 'master' into feature-61672/svnr_im_fas_ausblenden_bei_studierenden 2025-08-26 08:58:01 +02:00
Andreas Österreicher d8eac58ab1 Merge branch 'feature-61672/svnr_aus_infocenter_tool_entfernen' 2025-08-26 08:45:05 +02:00
Andreas Österreicher c6d04c7490 Merge branch 'master' into feature-61672/svnr_aus_infocenter_tool_entfernen 2025-08-26 08:43:22 +02:00
Andreas Österreicher ce432d4c43 Merge branch 'master' into feature-61672/svnr_im_fas_ausblenden_bei_studierenden 2025-08-26 08:36:36 +02:00
Andreas Österreicher 866d95c4b8 Merge branch 'feature-62681/mc1_vorlage_v2025_07' 2025-08-25 14:12:54 +02:00
Johann Hoffmann e97c26022f Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates 2025-08-25 12:00:30 +02:00
Andreas Österreicher 1025a8b461 Removed Duplicate Phrase 2025-08-25 11:19:20 +02:00
Andreas Österreicher 67290a5af8 Merge branch 'feature-61592/AnwesenheitenFinetuning' 2025-08-25 11:10:34 +02:00
Alexei Karpenko 531fae8ab5 enabled filling out UHSTAT1 form for logged in students 2025-08-23 16:46:26 +02:00
Alexei Karpenko ce9a4e2e09 Merge branch 'feature-60973/komponente_fuer_lehrfaecherverteilung' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-08-23 16:16:41 +02:00
Johann Hoffmann 483662726d abgabetool api/controller refactor; quality gates dbupdate script; load types from backend instead of hardcoded; WIP email check for externe betreuer; 2025-08-22 14:40:58 +02:00
chfhtw 11868d9496 StV: tab final ordering 2025-08-21 15:00:18 +02:00
chfhtw fb9f2e86fc StV: tab ordering 2025-08-21 13:46:30 +02:00
chfhtw 9b8ac595c6 Code Quality 2025-08-21 12:59:24 +02:00
chfhtw 608e2b5171 Implement: stv/students/getGemeinsamestudien 2025-08-21 09:18:52 +02:00
chfhtw 7de81fab7d Implement: stv/students/getOutgoing 2025-08-20 17:00:14 +02:00
chfhtw c9104749c5 Faster Query for stv/students/getIncoming 2025-08-20 16:52:16 +02:00
chfhtw 5ba0007641 fix: correct relative priority calculation 2025-08-20 14:34:19 +02:00
chfhtw 923427b41f Implement: stv/students/getIncoming 2025-08-20 11:57:31 +02:00
chfhtw 31a5caa558 better (safer) output for semester verband gruppe prio 2025-08-20 11:56:29 +02:00
chfhtw b73eac62b5 add studiensemester param to incoming/outgoing/gs backend 2025-08-20 11:54:01 +02:00
ma0068 6ee3f1d241 show Bezeichnung in Subject Vorlage, add adaption for Tinymce for openMode inSamePage 2025-08-20 11:32:31 +02:00
Andreas Österreicher 703872adc9 Merge branch 'master' into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2025-08-20 11:14:40 +02:00
Harald Bamberger ad83228396 do not terminatewithsuccess in function called in db transaction because this results in the transaction being rollbacked 2025-08-19 17:34:23 +02:00
Harald Bamberger 905a2dadff terminate with error if receiver person_id or prestudent_id is not found 2025-08-19 17:18:57 +02:00
Harald Bamberger 1c86a6ad55 add validation callback wrapper method 2025-08-19 16:05:47 +02:00
Harald Bamberger a482016dee modal-dialog-scrollable 2025-08-19 13:58:41 +02:00
Harald Bamberger 2198ea95e4 use form.post instead of form.send since latter expects a promise 2025-08-19 13:51:09 +02:00
Harald Bamberger ef80a19a24 allow negative studiengang_kz in prestudent and orgform urls 2025-08-19 13:22:59 +02:00
chfhtw ca3f8bc554 move statusofsemester select into shared function 2025-08-19 11:24:51 +02:00
Johann Hoffmann c5001f87bd modal header flex container for buttons (close, expand); 2025-08-19 11:03:23 +02:00
Harald Bamberger ba7f59de24 Merge branch 'bug-63358/CIS4_Kalendar_Widget_Deutsch_English_Tagesname_schalten_nicht_um' 2025-08-19 10:56:34 +02:00
Johann Hoffmann 9707258e62 Merge remote-tracking branch 'origin/master' into feature-61592/AnwesenheitenFinetuning
# Conflicts:
#	public/js/components/Bootstrap/Modal.js
#	system/phrasesupdate.php
2025-08-19 09:43:30 +02:00
ma0048 eb8c3213df - ects angabe bei der anmeldung
- tablesorter hinzugefuegt
- pruefungsort anderer raum moeglich (text)
- pruefungsanmeldungen nur noch studiensemester dropdown
- kompatible lvs vergleichen
2025-08-19 07:37:33 +02:00
chfhtw f50171ad9a Calender: track locale change for day & list mode 2025-08-18 15:38:35 +02:00
chfhtw 42a81a4558 API error clustering 2025-08-18 13:06:59 +02:00
SimonGschnell f695d8b66a update(Dashboard Widget Drag): shows hidden widget when dragging the widget on the dashboard 2025-08-18 10:21:18 +02:00
Harald Bamberger e2d6e5d9c8 Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-08-14 18:38:04 +02:00
Harald Bamberger 6d7429eb8e Merge branch 'feature-62779/xul_abloese_haustechnik_schluesselverwaltung' 2025-08-14 18:10:36 +02:00
Harald Bamberger b9e3c47be9 Merge branch 'master' into feature-62779/xul_abloese_haustechnik_schluesselverwaltung 2025-08-14 18:03:36 +02:00
Harald Bamberger 5119858c12 Merge branch 'feature-63411/Notizen_Anzahl_im_Tab_Header_anzeigen' 2025-08-14 17:52:47 +02:00
Harald Bamberger ed00c8d0ae add permission for new function in Core_Notizcontroller to NotizPerson Controller 2025-08-14 16:45:52 +02:00
Harald Bamberger 83d98c258e stv Notiz Controller add permission for new function getCountNotes 2025-08-14 16:36:00 +02:00
ma0068 a42e70e2fe comment out check Bismeldestichtag for deleteStatus 2025-08-14 16:28:20 +02:00
Harald Bamberger aaf9e8c885 revert to popupModal to stay consistent with other stv tabs 2025-08-14 16:16:53 +02:00
ma0068 729618cbe7 Tab Status: change format for Date for Check Bismeldestichtag 2025-08-14 15:38:03 +02:00
Harald Bamberger aa3e1ad1d1 Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into feature-63411/Notizen_Anzahl_im_Tab_Header_anzeigen 2025-08-14 15:24:42 +02:00
Harald Bamberger 1092463beb show count of notes in tab title 2025-08-14 15:23:42 +02:00
SimonGschnell e46f46c95b update(Dashboard grid): doesnt allow the user to drag a widget outside of the grid boundaries 2025-08-14 15:07:38 +02:00
ma0068 4d78abf9ec Tab Prestudent: use false for boolean and null for other variables for update if field is empty 2025-08-14 13:15:10 +02:00
Harald Bamberger 33fbbde99f Merge branch 'master' into feature-63411/Notizen_Anzahl_im_Tab_Header_anzeigen 2025-08-14 12:32:07 +02:00
Harald Bamberger 79506319a0 Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-08-14 12:31:47 +02:00
Cristina bbf147ec39 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-08-14 11:37:57 +02:00
Harald Bamberger a51f587da7 match negative studiengang_kz explicitly 2025-08-14 10:29:16 +02:00
Harald Bamberger e11ff91b53 use (:any) for studiengang_kz since it can be negative 2025-08-13 18:45:58 +02:00
Harald Bamberger d4f5a7c92f add missing helper js file 2025-08-13 16:37:28 +02:00
ma0068 34a239a823 Set Foto to null instead of empty String when Deleted 2025-08-13 14:54:43 +02:00
SimonGschnell 645da5a5bf fix(Dashboard drag&drop): ensures dragend events trigger correctly in chrome 2025-08-13 12:09:34 +02:00
Harald Bamberger 50b2334e5c work in progess, calc tabs title suffix when component is not rendered 2025-08-13 10:38:30 +02:00
Harald Bamberger e7f58ca1ba Merge branch 'master' into feature-62779/xul_abloese_haustechnik_schluesselverwaltung 2025-08-13 07:33:13 +02:00
Harald Bamberger 3749955d5b Merge branch 'master' into feature-60973/komponente_fuer_lehrfaecherverteilung 2025-08-13 07:03:59 +02:00
SimonGschnell 4eab58177a update(disabled widget background): updates the background of disabled widgets in the dashboard by giving them more opacity 2025-08-12 11:41:14 +02:00
SimonGschnell 3e69495842 fix(Dashboard drag&drop): behavior of dragged widgets when they exceed the grid limits, and ensures all widget clones are always deleted 2025-08-12 09:53:45 +02:00
Harald Bamberger 2402693116 Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-08-12 09:07:19 +02:00
Harald Bamberger 5e7514ffff Merge branch 'feature-63400/studentenverwaltung_phrases' 2025-08-12 09:02:40 +02:00
ma0048 57bc4d7b92 load phraseslib in students 2025-08-12 08:51:55 +02:00
Harald Bamberger 80f1edca8f Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-08-11 15:25:16 +02:00
chfhtw 3fad0fd69a CSS fix primevue/bootstrap box-sizing 2025-08-11 13:00:26 +02:00
SimonGschnell 8e6a103340 update(MyLv remove comment): removes unnecessary comment from the FHC.js file 2025-08-11 11:33:37 +02:00
Harald Bamberger c8c3361783 use getAktOrNextSemester instead of getNearest to use next semester in summer 2025-08-11 11:26:01 +02:00
SimonGschnell 03397b7272 update(MyLv VueRouter History): update the currentSemester based on the studiensemester param of the VueRouter history 2025-08-11 11:17:59 +02:00
SimonGschnell 3c3038362a update(MyLv VueRouter Studiensemester): adds the Studiensemester to the url of the vue router in the mylv view 2025-08-11 10:38:26 +02:00
ma0068 c109d84492 Tab Details: bugfix: show Zugangscode 2025-08-11 10:13:42 +02:00
ma0048 9ae78f2de6 master gemerged 2025-08-11 09:23:18 +02:00
chfhtw f6432cdcd0 accummulate multiple setFeedback calls in Form/Valdation 2025-08-08 12:26:51 +02:00
chfhtw 04cce2af4c CSS fix primevue box-sizing 2025-08-08 12:26:39 +02:00
Harald Bamberger 8c797fb212 Personal LVPlan: generate download links also for employees not only for students 2025-08-07 15:34:23 +02:00
ma0068 b2d8b81ab5 Changes for Tab Notes
- change layout to classicFas to enable input note with one click less
- extend Tab component: add headerSuffix
- show count of messages in header
2025-08-07 15:30:04 +02:00
Harald Bamberger 73d269d54b adapt media breakpoints for degree programs view 2025-08-07 14:42:59 +02:00
Harald Bamberger d071d0d9fe fix theme switch position in chrome based browsers 2025-08-07 14:25:22 +02:00
Harald Bamberger 8494033bda CIS4 Dashboard: add workaround for chrome fireing event dragend when styles are manipulated during dragging 2025-08-07 13:35:47 +02:00
ma0048 2b7f56622c Merge branch 'master' into feature-60973/komponente_fuer_lehrfaecherverteilung
# Conflicts:
#	application/models/education/Lehrveranstaltung_model.php
#	application/models/organisation/Studienplan_model.php
#	application/models/person/Notiz_model.php
#	application/models/ressource/Mitarbeiter_model.php
#	public/js/components/Stv/Studentenverwaltung.js
#	public/js/components/Stv/Studentenverwaltung/Verband.js
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-08-07 11:03:05 +02:00
Harald Bamberger 4f2499862f scale height of images in news widget 2025-08-07 09:45:19 +02:00
Harald Bamberger 8048b9d9c3 use light text color in language selector 2025-08-07 09:30:57 +02:00
Harald Bamberger 954cd16d10 use getAktOrNextSemester to determine preselected semester 2025-08-07 09:21:12 +02:00
Harald Bamberger 9e3ebca0a4 fix vue warning duplicate attribute class 2025-08-07 09:20:24 +02:00
Harald Bamberger 2faafea462 Merge branch 'rc1_FHC4_C4' 2025-08-06 11:15:07 +02:00
Harald Bamberger 9ad2198b02 update phrase Stundenplan => LV-Plan, Feiertag => Ferien / Feiertag, Holiday => Holidays 2025-08-06 11:14:37 +02:00
Harald Bamberger 8104d77399 improve styling of deactivated lines in stv students list 2025-08-06 11:07:59 +02:00
chfhtw c96db9f573 reworked StV favorites (only 1st tier version) 2025-08-06 11:06:57 +02:00
ma0068 42a40072fa show all errors in one alert
- refactor Dropdown.js: use new factory for overwriting errors
- move functionaliy to show Errors and InfoAlerts to Api.js
- extend FhcAlert (primeVue) with slot for toast for ability to use html
2025-08-06 10:55:58 +02:00
Johann Hoffmann 0605baf68f capitalize tab phrases; style&phrase change for Attendance Check Date Datepicker; Picture col min width icrease so the title is readable in english; 2025-08-06 10:45:37 +02:00
chfhtw 49ddf568e1 filter component: keep column visibility on reload 2025-08-06 08:46:02 +02:00
Harald Bamberger 9de0a41035 move Theme plugin to plugins folder 2025-08-05 18:36:07 +02:00
Harald Bamberger 8a1cbd754d Merge branch 'merge_C4_25999_61235_61730' into rc1_FHC4_C4 2025-08-05 16:32:50 +02:00
Harald Bamberger 555a4f01c2 Merge branch 'feature-40128/Mehrere_Suchergebnisse_für_selbe_Person' into rc1_FHC4_C4 2025-08-05 16:12:57 +02:00
chfhtw 603622a3f1 LvPlan use computed for lv title 2025-08-05 14:38:59 +02:00
chfhtw 6391e58f74 Bugfix: negation of instanceof 2025-08-05 14:37:57 +02:00
chfhtw aded9067e5 remove id-attribute from calendar renderer templates 2025-08-05 14:37:36 +02:00
Harald Bamberger e241b586a8 use currentSemester instead of defaultSemester because of vuerouter 2025-08-05 13:28:15 +02:00
Harald Bamberger 133e1f08f6 use currentSemester instead of defaultSemester 2025-08-05 12:20:29 +02:00
Harald Bamberger 41a46aa7b2 add component name, cssclass name, replace old delete api call with new one 2025-08-05 11:59:07 +02:00
Harald Bamberger 70274eef3a remove console.log 2025-08-05 11:33:25 +02:00
Harald Bamberger c728f60ec5 fix cherry picked Archiv.js 2025-08-05 11:28:18 +02:00
Alexei Karpenko b4a1720a94 Studierendenverwaltung archiv: removed tabulator columns from computed 2025-08-05 11:13:44 +02:00
Alexei Karpenko d33f493543 Studentenverwaltung archive: switched to new api factory 2025-08-05 11:09:38 +02:00
Andreas Österreicher db30fa0d96 Sorting Akte Results if creation date is the same 2025-08-05 09:42:00 +02:00
chfhtw 043c9fd5f3 split LvPlan into MyLvPlan (personal calendar) and LvPlan (lv calendar) 2025-08-05 09:33:11 +02:00
chfhtw 8f44a8b33e use for-loop instead of reduce to get rid of Firefox ESR 128 Workaround 2025-08-05 09:31:20 +02:00
Andreas Österreicher 2a9432d076 Merge branch 'rc1_FHC4_C4' of github.com:FH-Complete/FHC-Core into rc1_FHC4_C4 2025-08-05 09:26:11 +02:00
Andreas Österreicher 72bb465ecf Fixed Document Archive und Signature 2025-08-05 09:25:34 +02:00
chfhtw 30cc798c0b Endpoint to get lv details 2025-08-05 08:35:37 +02:00
Harald Bamberger 52e0535312 use existing phrase 2025-08-05 07:21:09 +02:00
Harald Bamberger 459d445f2f trigger search when searchfield gets focus a searchstr is there and the searchresult is empty 2025-08-05 06:59:21 +02:00
Andreas Österreicher ecc7e4672f Styling in Navigation Component korrigiert 2025-08-04 17:34:19 +02:00
Andreas Österreicher b8de311015 Umlaute in Navigation Component gefixed 2025-08-04 17:33:52 +02:00
Andreas Österreicher f57e27fae0 Merge branch 'rc1_FHC4_C4' of github.com:FH-Complete/FHC-Core into rc1_FHC4_C4 2025-08-04 17:20:16 +02:00
Andreas Österreicher 0516fa2ff5 Alert CSS fixed, Legacy Icons aus Alerts entfernt 2025-08-04 17:19:44 +02:00
Harald Bamberger cba5b39e29 searchcis do not search for organisationeinheittyp_kurzbz Container 2025-08-04 16:28:31 +02:00
Harald Bamberger cc91fe7588 searchcis only students and employees with active useraccount 2025-08-04 16:17:38 +02:00
Andreas Österreicher e9807a210b Removed Error Logs 2025-08-04 16:00:53 +02:00
Andreas Österreicher 4a69204384 Bugfix for Firefox ESR 128 Bug where Reduce Function is not always available 2025-08-04 15:53:22 +02:00
chfhtw 9b396088c3 Refactor LvPlan endpoints to be more granular 2025-08-04 14:09:27 +02:00
chfhtw b76bdfa431 Close calendar modal on unmount 2025-08-04 14:08:59 +02:00
Harald Bamberger e727c03a42 fix current simple search with modified searchbar, let action always emit actionexecuted event on click to close search in combination with vue router 2025-08-04 13:42:51 +02:00
Harald Bamberger 648dca3eba Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into rc1_FHC4_C4 2025-08-04 13:06:53 +02:00
Harald Bamberger 8bcd0961f6 remove unused empty file 2025-08-04 13:06:32 +02:00
Harald Bamberger 384dcd8411 Merge branch 'feature-62018/C4_Weiterleiten_zu_CIS4_nach_CIS_Login_unter_bestimmten_Bedingungen' into rc1_FHC4_C4 2025-08-04 10:54:37 +02:00
Harald Bamberger 9cbb612c8f Merge branch 'feature-63192/FHC4-Studierendenverwaltung_Semsterauswahl_fuer_mehrere_Tabs_anpassen' into rc1_FHC4_C4 2025-08-04 10:22:44 +02:00
Harald Bamberger 42e31af94c Merge branch 'merge_C4_25999_61235_61730' into rc1_FHC4_C4 2025-08-04 10:20:45 +02:00
Harald Bamberger 89c64cadc7 calc current Studiensemester by start_date, to avoid gap and error msg during summer 2025-08-04 10:20:11 +02:00
ma0048 be24190636 studiensemester auswahl abhaengig von url 2025-08-04 10:15:07 +02:00
chfhtw 502942deb3 Remove template from slot 2025-08-04 09:28:50 +02:00
Harald Bamberger 405f7a551e Merge branch 'merge_C4_25999_61235_61730' into rc1_FHC4_C4 2025-08-04 09:17:09 +02:00
chfhtw 02a52d1aee Bugfix: forward both params in LvPlan update:date and update:mode events 2025-08-04 08:44:27 +02:00
Harald Bamberger 6714432c30 handle no existing stgs from url 2025-08-01 18:02:01 +02:00
Harald Bamberger 9999cb47c2 use extende Verband component from branch feature/60973, add route for studiengang kuerzel in url, adapt for switching studiengang also via url 2025-08-01 17:32:54 +02:00
Harald Bamberger 5329fadbac add searchresultlink function to generate urls with current studiensemester in extended search 2025-08-01 17:25:30 +02:00
Harald Bamberger a429b20823 Merge branch 'feature-63192/FHC4-Studierendenverwaltung_Semsterauswahl_fuer_mehrere_Tabs_anpassen' into rc1_FHC4_C4 2025-08-01 16:26:01 +02:00
Harald Bamberger 37b67641ef Merge branch 'feature-40128/Mehrere_Suchergebnisse_für_selbe_Person' into rc1_FHC4_C4 2025-08-01 16:19:23 +02:00
Harald Bamberger 66caf47d98 Merge branch 'merge_C4_25999_61235_61730' into rc1_FHC4_C4 2025-08-01 15:54:22 +02:00
Harald Bamberger 497e839963 Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into rc1_FHC4_C4 2025-08-01 15:48:49 +02:00
chfhtw 219507ffa3 Shareable calendar components 2025-08-01 15:22:34 +02:00
chfhtw e326c9483d correct default value for calender date prop 2025-08-01 15:10:04 +02:00
Harald Bamberger cf073d04b4 remove console.log 2025-08-01 12:27:00 +02:00
Harald Bamberger 8472813246 Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into feature-63192/FHC4-Studierendenverwaltung_Semsterauswahl_fuer_mehrere_Tabs_anpassen 2025-08-01 12:24:02 +02:00
Harald Bamberger 472fceaf62 changes to support studiensemester_kurz as part of the url 2025-08-01 12:22:27 +02:00
Harald Bamberger 247de82e81 add config number_displayed_past_studiensemester_default and use it in api endpoint 2025-08-01 11:59:29 +02:00
ma0048 5d07879ebd org form hinzugefuegt im stree
gruppe autocomplete auch auf die bezeichnung
getalloe sql angepasst
2025-08-01 11:44:23 +02:00
ma0068 66e27b3bb2 Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' of github.com:FH-Complete/FHC-Core into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-08-01 10:55:29 +02:00
ma0068 1cb637cb7f Tab Betriebsmittel: change type kaution to text, edit validations and add translations 2025-08-01 10:55:11 +02:00
Johann Hoffmann 913b218fca phrasenupdate Stundenplan -> LV-Plan; tooltip update/remove; 2025-08-01 10:53:15 +02:00
Harald Bamberger 5a9972a85f Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into feature-63192/FHC4-Studierendenverwaltung_Semsterauswahl_fuer_mehrere_Tabs_anpassen 2025-07-31 17:03:31 +02:00
Harald Bamberger 0d514ad482 Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-07-31 17:01:04 +02:00
ma0068 562eb0a890 remove selectable from tables with not selectable rows 2025-07-31 17:00:11 +02:00
Harald Bamberger 38fe68362d use correct function in routing 2025-07-31 16:40:33 +02:00
ma0068 6217309c6f add infotext to reload button filtercomponent
tab archive: add infotext to reload button, edit and delete button
2025-07-31 16:34:24 +02:00
chfhtw 7755e2c7a6 searchbar: code quality 2025-07-31 15:20:05 +02:00
ma0068 9c1eb35e88 Tab Contact: Phrase for Validation Length PLZ 2025-07-31 11:18:37 +02:00
chfhtw 25da0d6865 cleanup - remove old/unused searchbar files 2025-07-31 11:12:58 +02:00
chfhtw 9a231d4bb4 name for searchbar components 2025-07-31 11:09:09 +02:00
chfhtw 9c3c8cd186 status sorting in mergedperson search results 2025-07-31 10:33:25 +02:00
ma0068 c4bb543c0a HeaderDetails: delete empty space before titelpost 2025-07-31 09:37:13 +02:00
ma0048 4d3ad0008e deleted automated added import 2025-07-31 09:33:11 +02:00
chfhtw bc7c811227 searchbar: filter btn accessisible (real button) 2025-07-31 09:29:43 +02:00
chfhtw 9a5790edf0 searchbar: better layout for clear button 2025-07-31 09:24:33 +02:00
ma0048 f9f0748b89 studiensemester_kurzbz aus dem fronted beruecksichtigen
extendedHeaderFilter suche in mehreren spalten moeglich
getAllOe sql abfrage richtig gestellt
2025-07-31 09:10:11 +02:00
Harald Bamberger 2f10a3a3e9 adapt single person routes, old and new js api files and frontend usage 2025-07-31 07:50:17 +02:00
ma0068 f12db529e0 Tab Notizen: remove clipContents 2025-07-31 07:40:07 +02:00
Harald Bamberger c876179762 adapt Students api endpoints, use ci routing, adapt frontend 2025-07-30 18:15:09 +02:00
Harald Bamberger fa97116ec4 replace backend var semester_aktuell with api parameter in grades, student and status endpoints, adapt old and new js api definitions, adapt frontend, add validation method to studiensemester_model 2025-07-30 18:09:56 +02:00
ma0068 16db622bc9 Tab Details
- add anrede to modelValue
- add Validations Alias and Lehrverbandsgruppe
- add Phrase invalidAlias
- add translation to validation Integer for field semester
2025-07-30 17:55:59 +02:00
chfhtw 2755a194eb searchbar remove redundant cssclass option 2025-07-30 15:12:20 +02:00
chfhtw ee13cfadba Use labels for types in CIS & StV searchbar 2025-07-30 12:33:48 +02:00
chfhtw 79720a77c2 searchbar: allow labels for types 2025-07-30 11:23:48 +02:00
chfhtw a7698b9af8 searchbar clear button stretch height 2025-07-30 11:23:00 +02:00
ma0068 ba23a6496c Tab Exam: change layout to fitDataStretchFrozen 2025-07-30 11:22:39 +02:00
ma0068 4e7ae928b5 Tab Details: add missing person attributes to modelValue.. second try 2025-07-30 11:19:21 +02:00
ma0068 62aa022c69 Tab Details: add missing person attributes to modelValue 2025-07-30 11:13:46 +02:00
chfhtw cb1ff2ef1a remove unused function 2025-07-30 11:03:42 +02:00
chfhtw 91624a3e53 searchbar clear button, searchbar z-indexes 2025-07-30 09:42:47 +02:00
chfhtw 1005963179 Each searchbar it's own config 2025-07-29 16:52:29 +02:00
Andreas Österreicher 386ae59428 Archivierung von MC Zertifikaten/Zeugnissen 2025-07-29 16:46:12 +02:00
chfhtw 30b895ad04 use renderers in search config 2025-07-29 16:07:15 +02:00
chfhtw 868c15f47d use teaching units for calendar 2025-07-29 15:47:17 +02:00
chfhtw b0f8b316af Use renderers in roominformation component 2025-07-29 15:36:29 +02:00
chfhtw 3cd00a5e5f Cleanup 2025-07-29 15:27:09 +02:00
Harald Bamberger ee5391f11a place timeinterval left of eventtext, add missing success wrapper in stundenplanlib 2025-07-29 14:27:46 +02:00
Harald Bamberger 602a572518 max height for all-day container, rearange zeitraum / frist in lehreinheit modal 2025-07-29 13:48:54 +02:00
chfhtw 2442c16eeb Calendar header CSS 2025-07-29 13:24:49 +02:00
ma0068 c1ca8c78af bugfix field gsstudientyp_kurzbz 2025-07-29 13:13:15 +02:00
ma0068 d262c5106c add zgv-fields to allow null values for update 2025-07-29 11:52:36 +02:00
chfhtw fd04b26af4 code quality 2025-07-29 11:40:40 +02:00
chfhtw 31fb649cac Bugfix: moodle start/end dates lost timezones and end time 2025-07-29 11:40:24 +02:00
chfhtw d76a5965db CSS improvements Calendar 2025-07-29 08:54:16 +02:00
Harald Bamberger 4d1c4bf7ab add css rules to show vue-datepicker svg icons inside of elements with bootstrap input-group or primevue p-component css class 2025-07-28 15:04:15 +02:00
ma0068 dcb9fad0d2 remove not existing tinymce-plugin linktitle 2025-07-28 12:11:45 +02:00
ma0068 cc0572b386 use endpoint for Messages, refactor component Vorlagendropdown to fhcapi 2025-07-28 11:44:06 +02:00
chfhtw 5e0ef4ebab Fix send mode on date update and vice versa to fix multiple router pushes 2025-07-28 09:39:32 +02:00
ma0068 24df22ba24 enable text-input zgv-master and enable remove dates ZGV 2025-07-28 08:40:45 +02:00
ma0068 e2df03debf Tab Prestudent: ZGVFields: Add Autocomplete function with strike through for not active entries 2025-07-25 14:05:37 +02:00
chfhtw 1b8ab88820 Fix: Browser back 2025-07-25 13:31:56 +02:00
chfhtw d59b623cb4 Bugfix: Return no events instead of error if the student is/was not enrolled in a timeframe 2025-07-25 13:17:41 +02:00
ma0068 58a85432ca enable text-input in datepicker 2025-07-25 10:50:48 +02:00
chfhtw 76248175f7 News padding not hardcoded in Dashboard Item Container but in the News CSS 2025-07-25 09:33:27 +02:00
chfhtw d101b53d3d Calendar: ResizeObserver for compact day mode 2025-07-25 09:27:56 +02:00
ma0068 53e395aca4 Tab Notizen, Messages: use HTML-Entities
Tab Abschlussprüfung, Prestudent, Pruefung, Dokument: Phrasen
2025-07-24 14:40:48 +02:00
chfhtw 611a6204cd compare AllDayEvents to whole day 2025-07-24 14:15:20 +02:00
ma0048 1d63b8de44 schluesselverwaltung & kontaktdatenverwaltung gui hinzugefuegt
betriebsmittel einschraenkung ueber prop moeglich (nur anzeige)
2025-07-24 11:18:58 +02:00
chfhtw c0e2a156d5 Merge branch 'merge_C4_25999_61235_61730_calendar' into merge_C4_25999_61235_61730 2025-07-24 10:46:23 +02:00
chfhtw d5f2f3d787 add luxon to composer.lock 2025-07-24 10:45:53 +02:00
Harald Bamberger d024d57ef5 fix carousel switching to wrong index, news widget styling 2025-07-24 10:21:50 +02:00
chfhtw 3a8984a8c3 CSS improvements for events 2025-07-24 09:39:47 +02:00
chfhtw ccb4a72ae4 CSS changes 2025-07-24 09:32:18 +02:00
ma0048 96cb546b68 permission check bug fixed 2025-07-23 14:14:03 +02:00
ma0068 715b48c39f Tab Nachrichten: Relationmessage Id, Letzte Änderung, Status in capital letters 2025-07-23 13:41:24 +02:00
chfhtw 6994591a10 better CSS file arrangement 2025-07-23 13:39:34 +02:00
ma0068 b1fe60aab0 Tab Anrechnungen: Add Phrasen Status, Notiz hinzufügen 2025-07-23 11:57:56 +02:00
SimonGschnell 92bd09355b update(News widget): adds number padding for the date and the time stamp in the news widget 2025-07-23 11:25:13 +02:00
SimonGschnell ae725c08a9 update(News und Paginator styling): updates how the news widget is highlighted and adds paginator css overwrites 2025-07-23 11:18:38 +02:00
ma0068 0be83eedef Start Translation ErrorMessage 2025-07-23 11:17:47 +02:00
chfhtw 8f73404307 truncate past-markings in month mode 2025-07-23 10:50:57 +02:00
chfhtw 66fd2e65a4 add css class today 2025-07-23 10:42:12 +02:00
chfhtw d648f79ca5 Correct click source for list mode 2025-07-23 09:38:31 +02:00
chfhtw 4ead590732 Fix: negation of instanceof in Lehreinheit modalContent Renderer 2025-07-23 09:25:16 +02:00
chfhtw 132ab686c9 get rid of Dashboard warnings 2025-07-23 09:24:16 +02:00
chfhtw 36fd2dcd90 cleanup 2025-07-23 09:23:29 +02:00
chfhtw 72df2cb79c Implementation CIS => LvPlanWidget 2025-07-23 08:56:23 +02:00
SimonGschnell db07f33e3c update(Cis Modals): makes modals scrollable by default and uses fhc-primary for the card-header and fhc-secondary for the card-footer 2025-07-22 16:20:18 +02:00
ma0068 07ba21ff3e Tab Details: reload DetailHeader after update Detaisl 2025-07-22 16:03:00 +02:00
SimonGschnell 1b2d5ff6c6 update(News widget styling): makes card-header of the news content sticky so that the white left and right buttons don't appear in front of a white background 2025-07-22 15:43:03 +02:00
ma0068 a13deed13f Tab Aufnahmetermine: bugfix updateAufnahmetermin 2025-07-22 14:07:44 +02:00
SimonGschnell 6c57c17eb5 update(News Widget 1 spaltig): adds padding and updates colors of the time and content when hovered 2025-07-22 13:50:34 +02:00
SimonGschnell 9ddb9f46fd refactor(Cis4 News Widget Responsive): changes the responsive column layouts for the news widget 2025-07-22 13:30:25 +02:00
chfhtw ad080e61b2 Implementation CIS => RoomInformation 2025-07-22 13:14:56 +02:00
chfhtw 0a9f4023b3 add component class 2025-07-22 10:50:34 +02:00
chfhtw f9a45a4917 LvPlan Now-background 2025-07-22 10:45:51 +02:00
SimonGschnell 9855a0b45d fix(News widget style): updates the content style of the news when rendering new news content 2025-07-22 10:37:45 +02:00
SimonGschnell 117a284dc4 update(News Widget/Content stylings): updates the style of the news widget and single news view 2025-07-22 09:47:45 +02:00
chfhtw fa090153f2 LvPlan.js Remove unused prop 2025-07-22 09:22:03 +02:00
chfhtw b4f1a8a56c Renderer Lehreinheit: get LvMenu inside the component 2025-07-22 09:19:51 +02:00
chfhtw a0721fcd9a LvPlan.js remove unused imports 2025-07-22 09:19:00 +02:00
chfhtw 4524b9bcdc Bugfix invalid end-tag 2025-07-22 09:18:31 +02:00
Alexei Karpenko 75adcefd51 Studentenverwaltung Projektarbeit: made text input possible for all date input 2025-07-21 17:52:21 +02:00
ma0068 9d809cf843 Tab Dokumente
- Refactor Mapping for List Accepted for correct view Akzeptiertdatum and AkzeptiertVon
- Delete Testoutputs dokument_kurzbz List NotAccpeted
- Correct ColumnName for NachreichungAm
- Change Order Columns Uploaddatum, akzeptiertVon
2025-07-21 16:33:26 +02:00
Harald Bamberger 7726850193 quick fix equal-int comparison resulting in an error if search string is numeric but out of range of integer column 2025-07-21 16:14:16 +02:00
chfhtw 91bb167c42 Implementation CIS => LV Plan 2025-07-21 15:40:51 +02:00
chfhtw 20e8964274 Comment 2025-07-21 15:38:35 +02:00
chfhtw f1971659b4 Loading Events 2025-07-21 15:33:35 +02:00
chfhtw 4e4a7a3880 Bugfix handle events outside of grid bounds 2025-07-21 15:30:34 +02:00
ma0048 4a8868a709 verfasser nur noch readonly - wird im backend gesetzt 2025-07-21 15:29:57 +02:00
chfhtw ff104461af Bugfix missing template ref 2025-07-21 15:08:42 +02:00
chfhtw e25687be52 Bugfix start index of grid-line 2025-07-21 15:08:25 +02:00
chfhtw f1e28cec4e Bugfix eventloader 2025-07-21 14:10:23 +02:00
chfhtw f4f59b2fff Bugfix check textnodes 2025-07-21 13:49:52 +02:00
ma0068 5ed2595222 Tab Konto: change Dateformat to localeString
- Tabulator: column Buchungsdatum
- Modal: newCounter
- Modal: editCounter
- Tabulator: actionSlot: selected
2025-07-21 13:10:43 +02:00
chfhtw 90c30f21c1 Autoscroll 2025-07-21 11:34:58 +02:00
Harald Bamberger 4ae1ab88dc documents accepted tabulator bump persitence_id 2025-07-21 08:51:16 +02:00
SimonGschnell 07d610d60f update(PrimeVue Paginator darkmode): overwrites the background of the paginator component in primevue 2025-07-21 08:15:31 +02:00
SimonGschnell a22041007c update(Cis css): updates utility classes for primary colors 2025-07-21 08:15:31 +02:00
Harald Bamberger d122a5e72d use correct phrase for column name 2025-07-21 07:57:18 +02:00
ma0048 9fa23a1471 fixed check permission 2025-07-17 16:21:23 +02:00
Harald Bamberger 952f98de82 Merge branch 'master' into merge_C4_25999_61235_61730 2025-07-17 11:21:47 +02:00
chfhtw 8191c5e19f CSS update 2025-07-16 16:47:12 +02:00
Cristina 94e25da6c8 Added phrases for lvevaluierung 2025-07-16 16:13:27 +02:00
Alexei Karpenko 1883e8a6f1 moved default stunden for projektbetreuer (master/bachelor) to config 2025-07-16 15:19:50 +02:00
ma0068 2f5a7addbd Tab Details: Bugfix use cleanedFeedback to avoid empty alerts because of updateam, updatevon in result.data 2025-07-16 15:11:20 +02:00
chfhtw 78a735f277 Event popup inside calendar component 2025-07-16 13:52:45 +02:00
chfhtw 26b40866fc CSS updates 2025-07-16 13:51:37 +02:00
SimonGschnell 99f9509134 refactor(Cis4 Wave Accessability): adds accessability attributes to the searchbar components 2025-07-16 12:56:49 +02:00
ma0068 c36459b508 Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' of github.com:FH-Complete/FHC-Core into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-07-16 11:44:55 +02:00
ma0068 1ff3f7b66d Display current semester status in Detail Header
- adapt function get
- adapt functions getPrestudents, get Students, get Prestudent, getStudent, get Person
- add Phrase Student auswaehlen
2025-07-16 11:41:23 +02:00
Cristina 430da0b236 Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-07-16 11:22:42 +02:00
Cristina c61f87a8d5 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-07-16 11:21:58 +02:00
SimonGschnell ba3914c1c3 refactor(Cis4 Wave Accessability): adds more accessability attributes to the cis4 views 2025-07-16 11:08:00 +02:00
SimonGschnell f210bb8bbd refactor(NewsWidget responsive):updates the resonsive classes of the newsWidget 2025-07-16 11:06:47 +02:00
chfhtw 90b944a047 configureable "no-events" message 2025-07-16 09:57:03 +02:00
chfhtw 0aef00bd9e use Timezone 2025-07-16 08:58:02 +02:00
Alexei Karpenko 01a3dc1fd0 Studierendenverwaltung archiv: removed tabulator columns from computed 2025-07-15 23:08:12 +02:00
Alexei Karpenko 1f258c84d4 Studierendenverwaltung Projektarbeit: moved Beurteilung download to table actions, separate tabs for details and Betreuer 2025-07-15 18:56:49 +02:00
Alexei Karpenko caa70715ad Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-07-15 15:24:30 +02:00
SimonGschnell a737dc20dc refactor(Layout Lvplan widget): margin adjustment 2025-07-15 14:59:45 +02:00
SimonGschnell 81280a5e91 refactor(Studium accessibility): adds accessability attributes to the studium component 2025-07-15 14:29:26 +02:00
SimonGschnell 2222199b95 refactor(ProfilUpdate components accessability): adds accessability attribute to profil update components 2025-07-15 14:17:44 +02:00
SimonGschnell 133a611d0e update(Profil Modal attribute rename): refactor of attributes and styles 2025-07-15 13:35:38 +02:00
chfhtw 08404a9440 all-day-events not in scrollable part 2025-07-15 13:35:13 +02:00
SimonGschnell c69be4762e refactor(renderer components accessibility) adds the aria accessibility attributes and tooltips to the renderer components of the LvPlan 2025-07-15 13:19:47 +02:00
SimonGschnell c91b2481eb refactor(Modal component): don't pass the properies to the v-bind of the bootstrap modal (title prop was added as an attribute to modal div, creating a tooltip) 2025-07-15 13:16:39 +02:00
Harald Bamberger c3d0f03704 remove unnecessary addMetas, add table alias to fix Prestudent Filters in StvTree 2025-07-15 13:06:08 +02:00
Alexei Karpenko 325cbf9314 Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-07-15 12:44:55 +02:00
SimonGschnell 9e06f1468a refactor(Location change FHC Core Event): changes the location of the Events for the FHCore App to the original folder 2025-07-15 12:01:46 +02:00
chfhtw 77e5dfeb9a add Luxon 2025-07-15 11:18:01 +02:00
chfhtw da9f00fff0 add Calendar 2025-07-15 11:17:49 +02:00
Alexei Karpenko 4eaf71e5c6 cancel Vertrag: correct error handling 2025-07-14 17:01:16 +02:00
Harald Bamberger 4872792890 prevent cis search from searching in private email addresses and phone numbers 2025-07-14 16:19:13 +02:00
Harald Bamberger 7aa074cdf6 use uselanguge when searching cms content, remove flags from cms content results, use cms and dms searchtypes in cis4 2025-07-14 15:51:42 +02:00
ma0068 cb48c1e5e3 Tab Details: add tbl_benutzer to update logic 2025-07-14 15:48:37 +02:00
SimonGschnell 9fe7dd069f refactor(LvPlan Lektoren in LV Ansicht): passt die Ansicht der Lektoren in den LVs des LvPlan an wenn mehrere Lektoren vorhanden sind 2025-07-14 15:23:57 +02:00
Harald Bamberger 3ed2bb4d78 add uid@DOMAIN to emails result for prestudent and student, mergedperson render student only results, add searchresult_inaktiv css class to inactive users 2025-07-14 15:16:21 +02:00
Harald Bamberger a1fe2e1b4b fix SearchLib bug, add searchtypes config studentcis and active_organisationunit, use new searchtype in cis4 searchoptions and searchbar result rendering 2025-07-14 13:57:37 +02:00
ma0068 c9cced3f61 bugfix firma_id: define default as null instead of empty string 2025-07-14 13:09:52 +02:00
ma0068 9d341cc045 getFunction for Student: restrict select attributes for person, update mitarbeiter model 2025-07-14 10:23:05 +02:00
ma0068 10399db372 add handling comma in combination with titelpost 2025-07-14 09:42:41 +02:00
Harald Bamberger c89b88ec1b prevent loading huge list of lvs when deleting an lv 2025-07-11 17:46:54 +02:00
Alexei Karpenko 12cdf5a83e accepting documents: enabled accepting for all Studiengänge, not just master, added date and insertamum 2025-07-11 17:11:19 +02:00
ma0068 22afddc2ae add changes for detail header of Vertragsverwaltung 2025-07-11 14:21:56 +02:00
SimonGschnell 1bf49ad7ab fix(Profillib): data handling fix 2025-07-11 11:50:53 +02:00
Harald Bamberger 31fbaaa017 remove unnessecary 0byte files 2025-07-11 11:30:13 +02:00
SimonGschnell 28e42163a1 fix(Profil fotoStatus): changes how fotoStatus is evaluated for different views 2025-07-11 11:10:35 +02:00
SimonGschnell 75a93523e0 refactor(Profil endpoint): changes how the parameter is passed to the profil endpoint 2025-07-11 11:01:18 +02:00
SimonGschnell c2cc1c5870 fix(Profil viewData): fixes little data conversion error in the endpoint 2025-07-11 09:14:34 +02:00
ma0048 5bda4db592 unr beim kopieren setzen
gruppen anzeige direktinskription rausgefillert
datatree aufklappen bug gefixed
kurzbz bei den icons statt eigene spalte
2025-07-11 07:33:10 +02:00
Alexei Karpenko 1c8ffa786e Studierendenverwaltung Projektarbeit improvements: tabulator (supposedly) stores column changes, changed some phrases, projektarbeit download button is now shown when Projektbeurteilung extension is not installted, errors are displayed near input fields not in pop up, changed modal layout, Vertrag fields are now just text fields, validation errors are cleared 2025-07-10 16:59:58 +02:00
SimonGschnell 2deef8039d update(LvPlan color contrast): changes the colors for some of the text in the lvplan component for more contrast 2025-07-10 14:32:26 +02:00
ma0068 179b50c798 fixed js-warnings
- Extraneous non-props attributes
 - duplicate html code
 - html template error
2025-07-10 14:27:54 +02:00
ma0048 5279ac9868 pep lv entwicklung hinzugefuegt
readonly category hinzugefuegt
tags mixin erstellt
2025-07-10 13:46:20 +02:00
ma0068 ec1960e839 Bugfix: Delete Vertragsstatus if Betreuung 2025-07-10 13:33:54 +02:00
ma0068 a942423e84 remove unused code 2025-07-10 12:44:35 +02:00
SimonGschnell dba435dafb fix(VueDatepicker darkmode): updates the dark mode property of the vueDatePicker if the theme is switched to light or dark mode 2025-07-10 12:10:39 +02:00
SimonGschnell 6f3759d95d update(Wave accessability): updates aria labels for accessability 2025-07-10 11:47:51 +02:00
SimonGschnell 129b8b2e49 refactor(LvPlan Widget renderer component): adds the renderer component to the lvplan widget 2025-07-10 11:47:22 +02:00
ma0068 7039719700 Tab Messages: show reply button only if not disabled 2025-07-10 11:31:24 +02:00
ma0068 08a394cad0 add eventListener to prevent bootstrap dialog from blocking focusin in tinymce linking popup 2025-07-10 09:47:09 +02:00
ma0068 8138e23e71 set tabulator_row overflow just jor abschlusspruefung to visible 2025-07-10 09:12:01 +02:00
ma0048 153e273fec firefox check entfernt 2025-07-09 13:52:46 +02:00
SimonGschnell d526a770c5 refactor(Wave accessability changes): changes color contrasts and fixes other little bugs 2025-07-09 13:35:21 +02:00
Alexei Karpenko abbeec11fc Studierendenverwaltung Projektarbeit: date value ende and gesperrt bis can be saved, full type name is shown in Projektarbeit table, made "kontaktdaten bearbeiten" and "person anlegen" buttons less prominent, bugfix cancel contract: contract display is updated immediately 2025-07-08 15:35:46 +02:00
ma0068 3ca49c5574 refactor function getHeader, get mitarbeiter_uid as prop instead of using function getMitarbeiterUid 2025-07-08 15:01:54 +02:00
SimonGschnell 8ce672d914 refactor(Profil Library): exports Profil functions in its own library to reuse functionalities 2025-07-08 13:33:00 +02:00
Harald Bamberger 1a0374bf18 fix stv list filters 2025-07-08 11:07:07 +02:00
Harald Bamberger 3f9564b686 anrechnungen notiz layout cleanup, use tabulator layout fitDataStretchFrozen 2025-07-07 16:21:04 +02:00
Harald Bamberger e4fc936991 Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-07-07 15:52:11 +02:00
Harald Bamberger 2262169699 filter component set default height only if no height attribute is set in tabulatoroptions. remove reactivedata default setting and old todo comments 2025-07-07 15:47:34 +02:00
ma0068 ddea3afde4 Adaptions FHC-Alert
- restructure plugins Api, FhcAlert ans Phrasen to use Phrasen in Fhc-Alert
– fix behaviour alert warning: show always clossing cross, and symbol
- fix behaviour alert error: add scrolling to Text MessageError
- phrases alerts
2025-07-07 15:36:12 +02:00
kindlm 411fd8d056 Merge remote-tracking branch 'origin/master' 2025-07-07 14:25:47 +02:00
kindlm ca9eea6134 Merge branch 'TesttoolAdminOptimierungen' 2025-07-07 14:25:26 +02:00
kindlm b1ab0ddf18 Zeilenumbruch, wenn Fragen-Liste zu lang 2025-07-07 14:23:59 +02:00
Harald Bamberger cfe76e09b1 AntragJob StglSammelmail an alle Stgleiter senden 2025-07-07 11:47:06 +02:00
ma0048 7bd0b39f77 resetting currentTreeLevel 2025-07-07 11:14:02 +02:00
ma0068 4937c1190a bugfix: warning html-tags 2025-07-07 11:13:37 +02:00
SimonGschnell 5280943099 fix(Studium):checks if the query of the data in the studium endpoints returns an array otherwise return empty array to avoid breaking the endpoint 2025-07-07 10:11:10 +02:00
ma0048 aca49114be anmerkung zur bewerbung weiterleiten 2025-07-07 09:56:34 +02:00
ma0048 5b2b715a16 userstory 61241: bugs behoben 2025-07-07 08:59:36 +02:00
Johann Hoffmann 101636e9fc timeline tooltip 2025-07-04 11:31:13 +02:00
ma0068 88adb8b139 Tab Messages: fix input Variables in TinyMCE 2025-07-04 07:43:21 +02:00
kindlm d47fd105ed Merge remote-tracking branch 'origin/master' 2025-07-03 17:37:27 +02:00
kindlm a0e4c3d93b GUI-Optimierung Testtool-Admin Seite
- Vorschau vs. Derzeit
- Tab-Zeichen wird bei Tab-Taste eingefügt
- Parse-Error wird bei nicht-wohlgeformtem XML angezeigt
- Button um MathML größer anzuzeigen
2025-07-03 17:37:16 +02:00
Harald Bamberger d48865d2a1 only show lvs with lehre flag true in degree programs overview 2025-07-03 16:37:45 +02:00
Harald Bamberger c8e7adc074 alter ferien query to get overlapping events e.g. summer holidays 2025-07-03 16:17:31 +02:00
Johann Hoffmann 475290e3ef yet another phrase 2025-07-03 15:47:06 +02:00
SimonGschnell b46c0147a0 update(Filter Component): uses fhc-text instead of text-dark for the filter icon of the filter component 2025-07-03 15:30:38 +02:00
SimonGschnell e659e8e12c update(Profil Tabulator Columns):preloads phrasen for the tabulator tables, otherwise the column titles are not displayed 2025-07-03 15:30:02 +02:00
Alexei Karpenko 549f7867ae Kontakt component permission: possible to check if a person is neither student nor employee 2025-07-03 15:26:53 +02:00
Alexei Karpenko 3e924b62a6 Studentenverwaltung new person: errors are shown in fields, not as popup 2025-07-03 15:26:03 +02:00
Harald Bamberger 014a034ce8 add VB function to get last vb stunden before altersteilzeit 2025-07-03 14:53:53 +02:00
Johann Hoffmann 7fc98bd6a4 tooltip update 2025-07-03 13:23:47 +02:00
ma0068 d1e35b1851 bugfix js error after sort: take out persistance for header filter 2025-07-03 12:14:00 +02:00
Johann Hoffmann 919471d067 phrasen adjustment & error catch cases 2025-07-03 11:32:00 +02:00
ma0068 46a10bd92e page handling
- entry in main navigation menu
- import navigation component
- remove space side menu
2025-07-03 11:14:20 +02:00
Johann Hoffmann 4b26067380 moar anw phrasen 2025-07-02 15:20:17 +02:00
ma0068 ac1335a50d Notizen as Modal 2025-07-02 14:53:44 +02:00
SimonGschnell 5ddc4749fa update(Accessability changes):adds aria-label to empty buttons and more accessability changes 2025-07-02 14:35:07 +02:00
ma0068 b4d5e1c90a bugfix delete Vertragsdetails, add missing data updateamum, updatevon 2025-07-02 13:41:08 +02:00
ma0048 31f0be35c8 selbe person auch wenn nicht abbrecher 2025-07-02 12:53:54 +02:00
Cristina 0df082af1f Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-07-02 12:16:19 +02:00
Cristina b3c05f2fe1 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-07-02 12:15:21 +02:00
Cristina 56bfe46675 Added phrases for lvevaluierung 2025-07-02 12:12:44 +02:00
ma0068 411b97fa14 reload Vertragsstatus if change of mitarbeiter 2025-07-02 11:54:32 +02:00
ma0068 56e8a34d68 readd Phrasen Vertragsverwaltung 2025-07-02 09:09:33 +02:00
SimonGschnell bf1dac3fd9 update(LvPlan Feiertage): checks if the query result is array before performing array operations and returns success status instead of raw data 2025-07-02 08:55:30 +02:00
ma0068 9315503ec1 Header: use comma in name only if posttitel exists 2025-07-01 15:46:09 +02:00
ma0068 c353e854e8 Tab Anrechnungen/Exemptions
- bugfix handle overflow in textfield of Notiz
- bugfix delete: remove anrechnung_id also from lehre.tbl_anrechnung_anrechnungstatus
- redesign Notizen of Anrechnungen: header with title Lehrveranstaltungen
- add reload functionality to update count of notizen in action buttons
2025-07-01 14:32:33 +02:00
Harald Bamberger e9614e8ca8 add css classes searchbar_label and searchbar_value to improve responsiveness of results in Cis4 2025-07-01 12:12:48 +02:00
Harald Bamberger 34220a8f39 add alt text to profile picture 2025-06-30 17:10:13 +02:00
Harald Bamberger 986d1cfb5f add aria-label to skip link and raumsuche tabulator links, move skip link to html body, change raumsuche h2 to h1 2025-06-30 17:02:45 +02:00
SimonGschnell 83ac1abcf6 update(LvPlan Events): overflow css fix for the LvPlan Events 2025-06-30 15:27:15 +02:00
SimonGschnell 9c30b5438f update(StundenplanLib StundenplanQuery): removes the ort_kurzbz from the group by because the ort_kurzbz should be grouped in the aggregate function 2025-06-30 15:27:15 +02:00
Harald Bamberger ed17e87afd dbupdate create Cis40 dashboard if it does not exist, 61730_Dashboard_Anpassungen only output message if something was updated 2025-06-30 14:51:42 +02:00
SimonGschnell 5b10c87e9b update(LvPlan Feiertage):if loggedin person does not have a studiengang, only consider studiengang 0 2025-06-30 14:31:05 +02:00
Johann Hoffmann 1c73fdc83c phrasen 2025-06-30 13:12:21 +02:00
Harald Bamberger 98f1cd7465 Merge branch 'feature-61795/FHC4_STudierendenverwaltung_Mobilitaeten_Update' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-06-30 11:49:59 +02:00
SimonGschnell 1c29bcd685 feature(LvPlan Feiertage): adds endpoint to fetch feiertage and adds renderer components for the feiertage in the LvPlan 2025-06-30 11:40:18 +02:00
ma0068 414e4c9565 Tab Abschlusspruefung: add Berechtigungen Studiengang backend: insert, update, delete 2025-06-30 11:39:16 +02:00
ma0068 19ef7c2ce1 Tab Abschlusspruefung: bugfix printDocument 2025-06-30 10:32:28 +02:00
ma0068 fbb00a2616 Tab Abschlusspruefung
- set textfield protokoll readonly
- update: add updatevon, updateamum
- selectedFields vorsitz, pruefer: set default null
2025-06-30 08:52:40 +02:00
Alexei Karpenko 239eace246 registration links to Bewerbungstool: changed in infocenter and fas, studentenverwaltung so that user email is not verified 2025-06-27 23:14:56 +02:00
SimonGschnell e3fe20831e update(Profil Profilbild): changes styling layout and polishment 2025-06-27 11:36:40 +02:00
cgfhtw 0adf7ee9dc Fix "Spaltenbreite wird nicht gespeichert" for Kontakt Tabs: use Filtercomponent default layout 2025-06-27 09:52:18 +02:00
SimonGschnell 9610ca55f7 update(Profil Profilbild): first version of the profilbild upload endpoint 2025-06-26 15:21:09 +02:00
Andreas Österreicher d64f5610c9 Merge branch 'feature-55989/micro_degree_vorlage_im_fas_hinterlegen' 2025-06-26 08:13:27 +02:00
Andreas Österreicher 444f7aec48 Merge branch 'master' into feature-55989/micro_degree_vorlage_im_fas_hinterlegen 2025-06-26 08:12:13 +02:00
Andreas Österreicher 4dbffc3527 Projektliste zieht die Pflichtpuase nicht mehr automatisch ab wenn keine
Pause manuell gebucht wurde. (Task 62601)
2025-06-25 17:48:09 +02:00
cgfhtw af2aa416aa Documents: Doubleclick-Download like in Archive 2025-06-25 16:50:36 +02:00
cgfhtw c9cc86fdbd Archiv: Downloadbutton in actions column 2025-06-25 16:50:03 +02:00
cgfhtw aec0162c01 Konto: Buchungstypen order 2025-06-25 16:49:29 +02:00
Johann Hoffmann 057288a4a5 phrasen & rechte rename 2025-06-25 16:02:51 +02:00
Harald Bamberger 7c251cafc7 Merge branch 'merge_FHC4__55354_55991_55992_60874_60875_61229_61230_61231_TabAbschlusspruefung' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-06-25 15:52:09 +02:00
Harald Bamberger c2ce61d885 Merge branch 'feature-62055/FHC4_Studierendenverwaltung_Detailheader_Update' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-06-25 15:42:56 +02:00
Cristina daf9d2ea15 Added checkbox 'evaluierung' Lehrveranstaltung Details in VILESCI 2025-06-25 13:35:20 +02:00
Cristina 4b8af46a2e Added 'evaluierung' to lehrveranstaltung.class.php and updated related methods 2025-06-25 13:30:05 +02:00
SimonGschnell cbc9a87a47 update(Profil Profilbild): adds button to upload new profil foto if foto is not yet acepted 2025-06-25 11:22:14 +02:00
cgfhtw c3ec34a038 Code Quality to be compatibler with feature-40128 2025-06-25 09:39:19 +02:00
cgfhtw e385a06b73 merge_C4 compatibility 2025-06-25 09:36:47 +02:00
cgfhtw b344b5925a Use Advanced search for CIS & StV 2025-06-24 15:19:21 +02:00
Cristina fd2de106f8 Added column evaluierung to lehre.tbl_lehrveranstaltung
- evaluierung (boolean) indicates if lehrveranstaltung shall be evaluated. Default is true.
2025-06-24 15:02:45 +02:00
cgfhtw 7b627484c2 Code Quality 2025-06-24 15:01:26 +02:00
SimonGschnell e99cbc9f3d fix(lvMenu optionen):fixes click event bugs with the lv menu and changes the styling for some lvmenu options 2025-06-24 13:28:32 +02:00
cgfhtw cc40fd4393 Safetycheck FHCAPI plugin 2025-06-24 12:15:10 +02:00
cgfhtw 7233bc3cdd Bugfix missing css variable 2025-06-24 11:23:22 +02:00
cgfhtw 301818be69 Fallback "room" for "raum" searchactions 2025-06-24 11:17:00 +02:00
cgfhtw 8c1c56077e CIS: Search-Origin 2025-06-24 11:00:51 +02:00
SimonGschnell f7c03b29db refactor(Studiengang Widget Data): filters only active persons of studiengang information 2025-06-24 10:35:20 +02:00
cgfhtw b217118df4 Cleanup & Phrases 2025-06-24 10:00:35 +02:00
SimonGschnell d76e3feb2a update(LvPlan Month Event tooltip): adds a tooltip to the month lv plan events that contains more detailed information about the lv event 2025-06-24 09:32:19 +02:00
Harald Bamberger b9a920e498 Merge branch 'feature-60876/FHC4_Studierendenverwaltung_Funktionen_als_Corecomponent' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-06-23 17:37:00 +02:00
Harald Bamberger 9426ed9e59 disable headerSort for actions column 2025-06-23 17:36:37 +02:00
Harald Bamberger be6f5b6772 Merge branch 'merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-06-23 17:32:23 +02:00
Harald Bamberger ce8f0843cc calc active tab from router param when using primevue tabsview 2025-06-23 17:31:43 +02:00
Cristina 08182fe0f5 Added phrases for LV-Evaluierung 2025-06-23 15:51:30 +02:00
cgfhtw 2ec20423e9 Stv: Search-Origin 2025-06-23 14:24:20 +02:00
cgfhtw 5645f6a41f Language API Endpoint 2025-06-23 14:24:11 +02:00
cgfhtw 5bf8f647cb Cms Results 2025-06-23 14:21:06 +02:00
cgfhtw ad7e473cbd Dms Results 2025-06-23 14:14:51 +02:00
cgfhtw d00530d6d6 Organisationsunit Results 2025-06-23 13:54:36 +02:00
cgfhtw cf62563fa3 Room Results 2025-06-23 13:48:52 +02:00
cgfhtw b96a7ab180 Person Results 2025-06-23 13:28:56 +02:00
SimonGschnell 4d61cdeb91 fix(LvPlan route): changes the route on change:range instead of change:offset because the focusdate is updates in change:range 2025-06-23 11:54:42 +02:00
SimonGschnell 30e4459f67 fix(LvPlan renderer) uses Vue.nextTick to acknowledge the suspense state of the dynamically loaded component 2025-06-23 11:44:08 +02:00
SimonGschnell 1d9936757c update(LvPlan router) manages the route changes in the Calendar component instead of the LvPlan 2025-06-23 11:37:33 +02:00
cgfhtw b46da92f25 Employee Results 2025-06-23 11:16:57 +02:00
cgfhtw 04d46b39ed MergedPerson Results 2025-06-23 11:16:20 +02:00
cgfhtw 819ef7bc32 Bugfix this => this.res 2025-06-23 10:48:50 +02:00
cgfhtw 0202bb261f MergedStudent Results 2025-06-23 10:45:28 +02:00
cgfhtw 0b00e393da Student Results 2025-06-23 09:51:52 +02:00
cgfhtw bc79fe2dd6 Prestudent Results 2025-06-23 09:26:09 +02:00
cgfhtw a2250fc727 Add meta information for search mode 2025-06-23 09:01:11 +02:00
Harald Bamberger 4f56d799ac remove private attribute 2025-06-23 07:43:39 +02:00
cgfhtw 707a05f6cd Adding changes from merge_c4 branch to searchbar component 2025-06-20 12:41:20 +02:00
Harald Bamberger cac58a0fc2 Merge branch 'feature-60876/FHC4_Studierendenverwaltung_Funktionen_als_Corecomponent' into merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231 2025-06-20 11:48:11 +02:00
ma0068 cb87b072b3 Merge branch 'merge_FHC4__55354_55991_55992_60874_60875_61229_61230_61231_TabAbschlusspruefung' of github.com:FH-Complete/FHC-Core into merge_FHC4__55354_55991_55992_60874_60875_61229_61230_61231_TabAbschlusspruefung 2025-06-18 16:57:38 +02:00
ma0068 37701dbdfd disable dropdown property for pruefer 2025-06-18 16:57:22 +02:00
Harald Bamberger 96e032bad9 add missing .js file extension 2025-06-18 16:46:47 +02:00
Johann Hoffmann 913211e84d even more & better anw phrasen 2025-06-18 16:23:35 +02:00
cgfhtw 6e9650ddfa Bugfixes: Searchbar state in localStorage/sessionStorage 2025-06-18 15:19:30 +02:00
ma0068 85c16b7f5d Refactor dropdowns
- use allPersons for Dropdown Autocomplete Pruefer1, Pruefer2, Pruefer3
- use allMitarbeiter for Dropdown Autocomplete Vorsitz
2025-06-18 15:04:08 +02:00
SimonGschnell 23e32a51b2 update(LvPlan Reservierungen):renderer componente erstellt und in Events geladen + styling fixes 2025-06-18 12:26:20 +02:00
ma0068 ae10ac877f Tab Adressen: add handling selected Firma for edit and save 2025-06-18 09:02:24 +02:00
Harald Bamberger d558240459 Merge branch 'feature-61282/SearchbarLocalStorageDifferntiation' into merge_C4_25999_61235_61730 2025-06-17 12:45:33 +02:00
Harald Bamberger 52c4ac64f1 remove unused import and uuid helper 2025-06-17 12:44:24 +02:00
Harald Bamberger d3b3c9db41 fix typo 2025-06-17 11:44:26 +02:00
Harald Bamberger 1c7d339e14 stundenplan/lvplan revert changes to jobs/LVPlanJob 2025-06-17 11:06:29 +02:00
Harald Bamberger 4db21d9abb stundenplan/lvplan use reverted classes and function names again 2025-06-17 11:05:31 +02:00
cgfhtw 2b3d772a90 Both searches usable 2025-06-17 10:50:29 +02:00
Harald Bamberger 3db82aea95 stundenplan/lvplan revert changes to stundenplan_model and stundenplandev_model 2025-06-17 10:26:29 +02:00
Harald Bamberger a080daa27a stundenplan/lvplan revert changes to legacy api endpoints 2025-06-17 10:16:54 +02:00
cgfhtw e8d6d751e6 searchAdvanced in new API 2025-06-17 09:48:35 +02:00
cgfhtw fa20652fef Permissions for searchAdvanced 2025-06-17 09:48:20 +02:00
cgfhtw 0aa92debea Phrasen 2025-06-17 09:25:40 +02:00
cgfhtw f596f16255 Merge branch 'master' into feature-40128/Mehrere_Suchergebnisse_für_selbe_Person 2025-06-17 09:24:18 +02:00
Harald Bamberger b6cb9b356f Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-06-17 08:57:05 +02:00
ma0068 329da58ce6 Tab Aufnahmetermine: add validation for existing RT-Data 2025-06-16 17:14:55 +02:00
ma0068 cb2ed4696c Tab Betriebsmittel: change type of field Kaution to number, add validation if numeric 2025-06-16 16:01:41 +02:00
ma0068 5140d9de31 refactor Accepting and Unaccepting Documents, new Error Message if more than one document per type, refactor List Accepted Documents 2025-06-16 15:38:56 +02:00
Harald Bamberger 0804c5670e refactor css variables 2025-06-16 15:36:32 +02:00
SimonGschnell 66ccd83b55 refactor(LvPlan): changes the lvInfo and lvMenu component in the Page View to use the renderer components based on the event type 2025-06-16 14:14:49 +02:00
cgfhtw 688f87e2ba New Endpoint for advanced search 2025-06-16 11:57:27 +02:00
Andreas Österreicher 02df06288e Bugfix Rückstellgrund 2025-06-16 11:37:04 +02:00
Andreas Österreicher ce47579870 Merge branch 'master' into feature-55978/infocenter_electronic_onboarding_filter 2025-06-16 11:35:49 +02:00
Harald Bamberger 9ed68648f6 declare css variables per component file with fallback default 2025-06-16 11:33:15 +02:00
SimonGschnell 57b0ae12d5 update(LvPlan router):changes the route parameters when changing the week in the weeks overview 2025-06-16 10:58:23 +02:00
SimonGschnell 2aa3e7704f fix(style):adds missing border 2025-06-16 10:57:16 +02:00
cgfhtw f321e07731 Move new SearchBarLib to SearchLib 2025-06-16 10:22:28 +02:00
Cristina 1e32bc211b Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-06-16 09:36:04 +02:00
Cristina 1f8d87587d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-06-16 09:35:29 +02:00
SimonGschnell 9e0bad76ac refactor(Studium): uses link color that adjusts to dark mode and adjusts the button directions next to the select fields of the Studium View 2025-06-16 09:30:40 +02:00
Alexei Karpenko d15d27b3e1 Studierendenverwaltung Projektarbeit: added Verträge 2025-06-13 16:19:53 +02:00
ma0068 7b5b6992c7 Tab Kontakt: Adresse: use Autocomplete and Dropdown for Firma, Bankverbindung: use authUID 2025-06-13 13:02:26 +02:00
SimonGschnell e4100f5fb0 refactor(Calendar Events Layout): changes the layout of the calendar events adjusting to different renderer components 2025-06-13 12:04:31 +02:00
ma0068 44c5b1dd5e Tab Kontakt: refactor displaying of kontakttyp, add updateamum, updatevon, filter kontakttyp hidden 2025-06-12 19:29:06 +02:00
ma0068 cd26667707 refactor backend validierung 2025-06-12 18:40:01 +02:00
Harald Bamberger 3a7e14a95f update composer.lock 2025-06-12 18:07:03 +02:00
Harald Bamberger 40a0affed9 add neutral fhcomplete logo for default theme 2025-06-12 17:38:17 +02:00
Johann Hoffmann fce55e38ae more & better anw phrasen 2025-06-12 17:18:52 +02:00
Harald Bamberger 3adaf8a528 make logo configurable in theme, add fhcomplete logo as default 2025-06-12 16:57:27 +02:00
Harald Bamberger 982373d03b style StudiengangInformation 2025-06-12 15:53:35 +02:00
SimonGschnell 565925abb2 fix(typo) 2025-06-12 14:03:32 +02:00
SimonGschnell 06c822fd84 fix(foto for Studiengang information widget): adds foto property for studiengangs personen that are displayed with a foto 2025-06-12 14:01:27 +02:00
SimonGschnell aed293f93d fix(removes debug print in LvPlan): removes debug prints and changes parameter for the showModal function in LvPlan Day View 2025-06-12 13:55:50 +02:00
SimonGschnell e133f67de2 fix(LvPlan calendarComponent renderer async modal): updates the logic to display the modal for the lv information 2025-06-12 12:32:48 +02:00
Harald Bamberger f017f096f1 add missing component lvinfo, change path Stundenplan to LvPlan 2025-06-12 12:13:08 +02:00
Harald Bamberger 43c868000c LvPlanLib getLvPlan use success or error object for all returns 2025-06-12 12:05:17 +02:00
Harald Bamberger 44b538885f use additional result variable 2025-06-12 11:40:24 +02:00
Harald Bamberger 57d71be792 revert change of loaded StudienplanModel name 2025-06-12 11:39:23 +02:00
ma0068 eb35701280 Tab Gruppen: rewrite inital filter and watcher for working in firefox 2025-06-12 11:32:31 +02:00
Harald Bamberger 7d91976704 remove use of component moodleSVG 2025-06-12 11:18:54 +02:00
ma0068 bd5925e1d6 phrases for author and editor UID 2025-06-12 10:58:43 +02:00
Harald Bamberger 596535b1b9 Merge branch 'master' into merge_C4_25999_61235_61730 2025-06-12 09:51:56 +02:00
ma0068 074403abf5 Tab Notizen: show Name of verfasser and bearbeiter 2025-06-11 17:27:33 +02:00
Harald Bamberger 0f9c98dded messages add translation for tabulator pagination buttons, Tabs component add alternative rendering with primevue tabs and use it in stv details component 2025-06-11 16:56:58 +02:00
Harald Bamberger dc4f8bc640 rename Stundenplan/EventTypes/calendarEvent.js -> LvPlan/EventTypes/calendarEvent.js 2025-06-11 15:38:01 +02:00
ma0068 ab059e9099 refactored detailFilter for Mitarbeiter 2025-06-11 15:29:54 +02:00
ma0068 8c69bc1682 Headerfunctions in headerAPI auslagern 2025-06-11 15:28:19 +02:00
ma0068 2eef05e593 - refactore POST_Variablen with form_validation->set_data
- add phrase: Vertragsstatus bearbeiten
- filterActive: bugfix
2025-06-11 15:02:31 +02:00
Harald Bamberger 90273f64c1 Merge branch 'merge_C4_25999_61235_61730_testremerge' into merge_C4_25999_61235_61730 2025-06-11 15:00:48 +02:00
Harald Bamberger d6f92d23a0 Merge branch 'feature-62366/merge_C4_25999_61235_61730' into merge_C4_25999_61235_61730_testremerge 2025-06-11 14:56:57 +02:00
Harald Bamberger 7929a6b74b Merge branch 'feature-25999/C4_cleanup' into merge_C4_25999_61235_61730_testremerge 2025-06-11 14:51:09 +02:00
Harald Bamberger d83eb42a23 Merge branch 'feature-25999/C4_cleanup' into merge_C4_25999_61235_61730_testremerge 2025-06-11 14:49:26 +02:00
ma0068 a56a804692 - fix error with Event 'multiActionPrintHonorarvertrag'
- Naming components Vertragsverwaltung, MitarbeiterHeader, CoreListMitarbeiter
- link to Vorgesetzter, show Vorgesetzter without postTitel
- Foto: if foto_sperre: show foto with lock
2025-06-11 13:46:23 +02:00
kindlm 45b9bae0b0 Merge remote-tracking branch 'origin/master' 2025-06-11 13:40:01 +02:00
kindlm 77ccfa46de Task #62440 Ampelsystem Benutzercount 2025-06-11 13:39:50 +02:00
SimonGschnell 29f968f308 fix(Profil email extern):Profil endpoint does not provide the extern alias email if the benutzer has no alias defined 2025-06-11 11:24:18 +02:00
SimonGschnell 49c510537a fix(Profil Mailverteiler): adds safeguards and checks on the return value of the Mailverteiler of a person 2025-06-11 11:06:35 +02:00
SimonGschnell d2e8505689 refactor(Profil alias): checks if user has alias, creates extern alias email if available otherwise not 2025-06-10 14:49:30 +02:00
Alexei Karpenko e26bce2cf7 removed merge text from code 2025-06-10 14:14:32 +02:00
Alexei Karpenko 6f5fa9624f Merge branch 'feature-60973/komponente_fuer_lehrfaecherverteilung' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-06-10 13:58:50 +02:00
SimonGschnell 83d3f515de refactor(Modals and z-index): ensures dashboard modals are in the forground 2025-06-10 13:18:31 +02:00
ma0068 a8f47fad45 copy Component DetailHeader into Vertragsverwaltung 2025-06-10 13:10:26 +02:00
ma0068 6f60d7c99e API Refactoring, some other minor fixes 2025-06-10 11:57:43 +02:00
SimonGschnell c080d1abb2 refactor(Rename Stundenplan to LvPlan):renames all methods and files from Stundenplan to LvPlan 2025-06-10 11:46:19 +02:00
SimonGschnell a786dec9c1 fix(Dashboard grid):emit dragged item on resize and adjust z-index for overlay and dragged item 2025-06-10 10:23:28 +02:00
ma0068 7d2da9e7f6 Merge master into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2025-06-06 11:46:31 +02:00
SimonGschnell 9faccfa328 update(Url Dashboard widget): makes edit buttons always available 2025-06-06 11:27:17 +02:00
SimonGschnell 6d7f8522f3 refactor(Moodle Events DependencyInjection): resolves lazy loading bug 2025-06-06 09:57:59 +02:00
Harald Bamberger 970e950894 tune layout of new message modal, fix pagination of message table 2025-06-05 17:06:55 +02:00
SimonGschnell 2821339c0a refactor(Dashboard dragging): removes dragging flag from the draggable state 2025-06-05 11:42:21 +02:00
Harald Bamberger 68b6402981 fix height of calender exceeding viewport height 2025-06-05 11:28:37 +02:00
ma0068 826dd52450 - show Profilpicture with lock symbol if foto_sperre
- enable scrolling for multi view
- show uid beneath profile picture
- use phrases in detail header
2025-06-04 13:59:00 +02:00
SimonGschnell e89233d6ac update(LvInfo): adds the file LvInfo again because it is used in a different component 2025-06-04 09:41:33 +02:00
Alexei Karpenko fe81e7fb7c Studierendenverwaltung Projektarbeit: added button for Projektarbeit download 2025-06-03 21:18:03 +02:00
Harald Bamberger c85e902b97 Merge branch 'feature-61730/Cis4_DashboardAnpassungen' into merge_C4_25999_61235_61730 2025-06-03 16:14:59 +02:00
Harald Bamberger d1264c7e5a Merge branch 'feature-61235/Cis4_Studium_Uebersicht' into merge_C4_25999_61235_61730 2025-06-03 16:14:00 +02:00
ma0068 7da8a9ed79 refactor header as component, show uid under profilpicture 2025-06-03 10:39:22 +02:00
Harald Bamberger 96274a2a4a Merge branch 'feature-25999/C4_cleanup_testabgabe' into merge_C4_25999_61235_61730 2025-06-03 10:29:33 +02:00
Harald Bamberger fb01629ec1 Merge branch 'feature-25999/C4_cleanup_testabgabe' into feature-25999/C4_cleanup 2025-06-03 10:29:01 +02:00
Harald Bamberger 02dd466cc3 use green and red as for marking the datepickers 2025-06-03 09:44:03 +02:00
SimonGschnell 7e90771f89 refactor(Moodle Events DependencyInjection): changes the lazy loading for the moodle events in Stundenplan 2025-06-03 09:30:10 +02:00
SimonGschnell a2dee4d6ba feature(FHC Core Renderer Event): adds the FHC Core renderer Event to the loadRenderer Event 2025-06-03 09:24:54 +02:00
ma0048 3e3fa9c1eb svnr aus dem fas entfernt 2025-06-03 08:57:28 +02:00
Harald Bamberger 3ff0f55cc0 tune layout of new message modal 2025-06-03 08:05:38 +02:00
Alexei Karpenko 750b956dd2 Studentenverwaltung Projektarbeit: added button for editing contact data 2025-06-02 15:28:10 +02:00
ma0068 96fcff3ade add Event mobility_delete 2025-06-02 13:47:49 +02:00
ma0068 f233b33093 add information to header 2025-06-02 10:29:14 +02:00
SimonGschnell c62b587299 refactor(moodle Event Info):adds the component for moodle event information to the rendered components from the moodle Event 2025-06-02 09:23:14 +02:00
Harald Bamberger 8810657a61 adapt styling message modal, message newdiv, counter display in studentslist 2025-05-30 18:22:53 +02:00
Alexei Karpenko 9a7cba0717 Studentenverwaltung Projektarbeit: added possibility to create persons, added phrases 2025-05-30 17:54:51 +02:00
Harald Bamberger ba1ef83ba6 delete entry in tbl_studentlehrverband only if last prestudent status for the semester is deleted, update possibly existing entry in tbl_studentlehrverband when advancing prestudentstatus 2025-05-30 12:38:35 +02:00
Harald Bamberger 0da195810b set updateamum and updatevon, store verband, semester, gruppe in tbl_student if selected semester is current semester 2025-05-30 12:35:48 +02:00
Harald Bamberger b885a8c72d fix getting set to null if e.g. base64 images is sent in request json 2025-05-30 12:34:18 +02:00
Harald Bamberger 42b750e120 add selectedcount add phrases for counts label 2025-05-28 17:31:24 +02:00
Harald Bamberger cb1f6e2e5f allow description to be html instead of plain text 2025-05-28 17:29:54 +02:00
Harald Bamberger 9d48b6ac57 use popupModal layout of notiz component 2025-05-28 17:29:02 +02:00
Johann Hoffmann 3cebbc9fba modal optional expand to full size button - used for qr window; added missing phrase editEntschuldigung; 2025-05-28 17:04:07 +02:00
Harald Bamberger 8bcf01d1bb alter document download to use dmslib and new terminateWithFileOutput funtion of FHCAPI_Controller, render download button as link 2025-05-28 16:38:26 +02:00
Harald Bamberger 4d3d06e1d6 add function to output a file 2025-05-28 16:36:56 +02:00
Harald Bamberger cfa391677e remove duplicate tabulatorEvents in computed 2025-05-28 13:22:27 +02:00
SimonGschnell a5bb72baf6 feature(Stundenplan Moodle Events Dependency Injection): injects moodle components dependency to the Stundenplan 2025-05-28 12:30:38 +02:00
ma0068 a756881a48 refactor delete
refactor validation backend
add permission check for studiengang backend
2025-05-28 09:14:49 +02:00
Harald Bamberger c9b555db77 swap div and form-input end-tag 2025-05-28 08:22:22 +02:00
Harald Bamberger bbf0d044fd use existing phrasename 2025-05-28 08:20:33 +02:00
ma0048 f96bfbe000 lehrfächerverteilung v1 2025-05-28 07:51:10 +02:00
Cristina 5ee72fd836 Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-05-27 18:23:51 +02:00
Cristina 4f8c408a8a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-05-27 18:22:45 +02:00
Harald Bamberger 390434050e add missing end tag, add missing .js file extension 2025-05-27 17:39:33 +02:00
Harald Bamberger 0ee5cc09cd add missing .js file extension 2025-05-27 17:30:50 +02:00
SimonGschnell a0fb34420e fix(Stundenplan API):corrects little bug with if statement check 2025-05-27 14:30:34 +02:00
Harald Bamberger b40e1a2c65 fix syntax error 2025-05-27 11:05:24 +02:00
Harald Bamberger 4daf73ee6d Merge branch 'master' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-27 10:31:12 +02:00
Andreas Österreicher a52fcf1570 Merge branch 'feature-61601/Issue_Liste_hartcoded_eingeschraenkt' 2025-05-26 13:00:23 +02:00
Alexei Karpenko 5d241b050a issue list: renamed config 2025-05-26 11:16:50 +02:00
Alexei Karpenko 660f195c57 issue list: removed empty space and removed const which was moved to config 2025-05-26 11:03:33 +02:00
Andreas Österreicher 9b0e0fe135 Merge branch 'feature-61751/infocenter_absage_fuer_alle' 2025-05-26 10:59:38 +02:00
Andreas Österreicher 867afa4411 Merge branch 'master' into feature-61751/infocenter_absage_fuer_alle 2025-05-26 10:41:40 +02:00
Alexei Karpenko 69e05ccb38 Studentenverwaltung archive: switched to new api factory 2025-05-24 10:14:08 +02:00
ma0068 fa0b534471 Refactoring PrimeVue Autocomplete Dropdown Functions
Refactoring PrimeVue Autocomplete Dropdown OrganisationUnits
Change Search from Backend to Frontend Filtering
minor changes Table Functions
2025-05-23 13:27:18 +02:00
SimonGschnell b5bacbbf75 refactor(Studium): changes the query to fetch lehrveranstaltungen for the studienplan 2025-05-23 12:02:13 +02:00
SimonGschnell ad8963e5b5 refactor(Dashboard touch events): allows to scroll on mobile over widgets, fixes dragging bug on mobile 2025-05-23 11:33:58 +02:00
ma0048 fce63eb31b svnr aus dem infocenter entfernt 2025-05-23 10:35:47 +02:00
Alexei Karpenko 94f0d43c4a issues config: removed empty lines 2025-05-23 09:59:13 +02:00
SimonGschnell deec52b959 refactor(Studium): disallows to store null or undefined to the localStorage and changes the next and previous button logic for the select fields 2025-05-23 09:11:22 +02:00
Harald Bamberger 126b2d388b fix upload and adapt styling of Abgabetool Student 2025-05-22 18:55:34 +02:00
Harald Bamberger 4c6c45ceec change Layout of Notizen component to use form in modal 2025-05-22 18:50:30 +02:00
Alexei Karpenko 80faf92dc2 made issue list configurable (apps, status, functions) 2025-05-22 18:41:26 +02:00
Harald Bamberger d686ec0885 Merge branch 'feature-61730/Cis4_DashboardAnpassungen' into merge_C4_25999_61235_61730 2025-05-22 07:48:23 +02:00
Harald Bamberger a387533dc3 Merge branch 'feature-61235/Cis4_Studium_Uebersicht' into merge_C4_25999_61235_61730 2025-05-22 07:45:30 +02:00
Harald Bamberger f8438ee115 Merge branch 'feature-25999/C4_dark_theme' into merge_C4_25999_61235_61730 2025-05-22 07:44:42 +02:00
Alexei Karpenko 1ca5bd5691 Studierendenverwaltung Projektarbeit: added phrases, only necessary Projektarbeit properties are set when saving 2025-05-21 22:00:04 +02:00
Johann Hoffmann 12ca915b00 ddi/ddo text in legende old anw liste; studentdropdown order changed; email datumformat d.m.y; 2025-05-21 18:16:01 +02:00
Cristina c3e978b56e Adapted Input.js radio/checkbox label to accept HTML 2025-05-21 18:10:03 +02:00
Cristina 7e83df51a8 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-05-21 18:05:40 +02:00
Harald Bamberger 8925692dd4 Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-05-21 17:03:58 +02:00
Johann Hoffmann a99cc96682 fix missing "import VueDatePicker from '../../vueDatepicker.js.php';" statements for new cis4 pages abgabetool & raumsuche 2025-05-21 16:37:00 +02:00
Harald Bamberger f6dd79b9a3 Merge branch 'feature-61231/FHC4_Studierendenverwaltung_Aufnahmetermine' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 16:31:29 +02:00
Harald Bamberger ede656845a Merge branch 'feature-61230/FHC4_Studierendenverwaltung_LVTermine' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 16:25:36 +02:00
Harald Bamberger f5a3598c39 Merge branch 'feature-61229/FHC4_Studierendenverwaltung_GemeinsameStudien' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 16:18:43 +02:00
ma0068 66e5384de6 cleanup: remove not needed code and files 2025-05-21 16:01:37 +02:00
Harald Bamberger 55419c50f7 Merge branch 'feature-60875/FHC4_Studierendenverwaltung_Anrechnungen' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 15:42:17 +02:00
ma0068 c26bb98960 new Core Component Function
- autocomplete and dropdown field for search oes and search functions with active and non active entries
- possibility to dynamic styling of display switch, newButton in Tabulator, different editLabels
- possibility to show/hide column company
- possibility to show/hide to save function as copy
2025-05-21 15:34:43 +02:00
Andreas Österreicher d677cee1f9 Merge branch 'feature-56330/Digi-Anw-Feedback' 2025-05-21 15:27:31 +02:00
SimonGschnell a1423c33e5 update(Studium): fetches the preselect lehrverband values if the user is a student 2025-05-21 14:12:16 +02:00
Andreas Österreicher 8786b60c4c Merge branch 'master' into feature-56330/Digi-Anw-Feedback 2025-05-21 14:11:50 +02:00
Harald Bamberger 375d56960a Merge branch 'feature-60874/FHC4_Studierendenverwaltung_Dokumente' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 13:49:58 +02:00
Harald Bamberger 1faab59716 Merge branch 'feature-55992/FHC4_Studierendenverwaltung_Messaging' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 13:34:34 +02:00
Harald Bamberger 1ac6e50784 Merge branch 'feature-55991/FHC4_Studierendenverwaltung_Gruppen' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 13:30:07 +02:00
Harald Bamberger 5d7d532396 Merge branch 'feature-55354/Studierendenverwaltung_Karteireiter_Archiv' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231 2025-05-21 13:29:21 +02:00
Harald Bamberger 5ed1bae456 Merge branch 'master' into feature-61231/FHC4_Studierendenverwaltung_Aufnahmetermine 2025-05-21 13:26:47 +02:00
Harald Bamberger c861278aa8 Merge branch 'master' into feature-61230/FHC4_Studierendenverwaltung_LVTermine 2025-05-21 13:26:14 +02:00
Harald Bamberger 2297055949 Merge branch 'master' into feature-61229/FHC4_Studierendenverwaltung_GemeinsameStudien 2025-05-21 13:25:36 +02:00
Harald Bamberger bf3127d518 Merge branch 'master' into feature-60875/FHC4_Studierendenverwaltung_Anrechnungen 2025-05-21 13:24:52 +02:00
Harald Bamberger 10f731f2e2 Merge branch 'master' into feature-60874/FHC4_Studierendenverwaltung_Dokumente 2025-05-21 13:24:08 +02:00
Harald Bamberger b498da8603 Merge branch 'master' into feature-55992/FHC4_Studierendenverwaltung_Messaging 2025-05-21 13:18:43 +02:00
Harald Bamberger fc30222289 Merge branch 'master' into feature-55354/Studierendenverwaltung_Karteireiter_Archiv 2025-05-21 13:18:16 +02:00
Harald Bamberger cd99ba7fdc Merge branch 'master' into feature-55991/FHC4_Studierendenverwaltung_Gruppen 2025-05-21 13:17:34 +02:00
Andreas Österreicher 9b9351fe9b Merge branch 'bug-62088/dummy_std_beim_reinziehen_im_fas_zu_einer_lv_kommt_eine_fehlermeldung_130_std_und_zuordnung_funktioniert_nicht' 2025-05-21 10:49:49 +02:00
ma0048 02701dc0c5 fixed bug stundengrenze hinweis beim hinzufuegen eines dummy lektors 2025-05-21 10:47:55 +02:00
Harald Bamberger a2b77411cb Merge branch 'master' into feature-55991/FHC4_Studierendenverwaltung_Gruppen 2025-05-21 10:47:48 +02:00
Harald Bamberger 7d4fda4fe6 Merge branch 'master' into feature-55354/Studierendenverwaltung_Karteireiter_Archiv 2025-05-21 10:46:31 +02:00
Harald Bamberger e9a373afb8 Merge branch 'feature-61758/stv_kontakte_get_funktionen_null_abfangen' 2025-05-21 07:11:18 +02:00
Harald Bamberger 1222d33e6e Merge branch 'master' into feature-61758/stv_kontakte_get_funktionen_null_abfangen 2025-05-21 07:10:47 +02:00
SimonGschnell af1364faef update(Studium):changes layout 2025-05-20 16:56:25 +02:00
Andreas Österreicher 2db7f812ab Fehlerkurzbz korrigiert 2025-05-20 11:31:28 +02:00
Andreas Österreicher 8b89d6f1cb Merge branch 'feature-48553/UHSTAT_Meldung_fuer_Privatuniversitaeten' 2025-05-20 11:11:39 +02:00
Alexei Karpenko d1c2cf8e64 Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-05-19 13:22:05 +02:00
SimonGschnell da118cbf0a refactor(Studium):groups the studienplaene to their studienordnung, sorts the lehrveranstaltungs module and the single lehrveranstaltungen 2025-05-19 12:53:36 +02:00
Harald Bamberger 4e945648d0 Merge branch 'master' into feature-25999/C4_cleanup 2025-05-19 11:00:24 +02:00
Harald Bamberger 310bd08648 Merge branch 'feature-40430/updateamum_von_im_AntragLib' 2025-05-19 10:51:05 +02:00
Harald Bamberger bc4514b2a0 Merge branch 'master' into feature-40430/updateamum_von_im_AntragLib 2025-05-19 10:29:28 +02:00
SimonGschnell 4a10faeb25 update(Dashboard custom Section & additionalRow): the additional row is not removed when moving widgets and the custom section gets also created when created user_overrides 2025-05-19 10:28:15 +02:00
SimonGschnell df108482eb update(Dashboard additionalRow): opens tooltip when hovering over the button to add a now line to the dashboard grid 2025-05-19 09:09:48 +02:00
Alexei Karpenko 7548d7b55f Projektbetreuer: new and edit mode 2025-05-18 16:35:30 +02:00
Alexei Karpenko 168e2890c7 Studierendenverwaltung Projektarbeit: set default stunden value, correct lvs when new Projektarbeit, Projektarbetreuer form hidden by default 2025-05-18 15:55:43 +02:00
Alexei Karpenko 4cf2ef2927 removed console logs 2025-05-16 13:40:47 +02:00
Alexei Karpenko 382006aa8b Projektarbeit Studierendenverwaltung: now possible to save and edit Projektbetreuer 2025-05-16 13:37:21 +02:00
SimonGschnell 875a788476 update(Dashboard rows and columns): additional row is not removed when going out with the mouse 2025-05-16 09:54:05 +02:00
Harald Bamberger c04c08bca4 finetune datepicker and timepicker config 2025-05-16 08:22:19 +02:00
Harald Bamberger a858049e15 fix viewData prop validator, change nullish coalescing operator to logical or since optional router param is empty string and not an unset prop 2025-05-15 18:54:28 +02:00
SimonGschnell a40f304d8d update(Dashboard DataStructure Migration): also changes datastructure for the dashboard.tbl_dashboard_benuter_override 2025-05-15 12:05:34 +02:00
SimonGschnell ebcb33b316 update(Dashboard DataStructure Migration): adds migration file to change all old datastructures from the dashboard.tbl_dashboard_preset 2025-05-15 12:05:34 +02:00
Harald Bamberger b8d0037e16 Merge branch 'feature-25999/C4_cleanup' into feature-61235/Cis4_Studium_Uebersicht 2025-05-14 15:43:04 +02:00
Harald Bamberger ce2bd3c75d Merge branch 'feature-25999/C4_cleanup' into feature-61730/Cis4_DashboardAnpassungen 2025-05-14 15:33:38 +02:00
Harald Bamberger 7b9b1a762e Merge branch 'master' into feature-25999/C4_cleanup 2025-05-14 15:17:25 +02:00
Harald Bamberger 53f2776efe add CIS_REDIRECT_TO_CIS4 to cis config, add viewport meta tag and alter tw.css and mobile.css to improve layout of index.html and rendering of logos on mobile devices, add logic to redirect users to cis4 after login 2025-05-14 15:16:18 +02:00
Harald Bamberger 3c08bc12cd Merge branch 'feature-61748/FHC-Alert-Plugin_EMail-Address' 2025-05-14 09:20:47 +02:00
ma0048 6e56de1790 null werte abgefangen 2025-05-14 08:33:25 +02:00
ma0048 2417d1549e absage bewerbung abgeschickt beide fuer einzelne studiengaenge ermoeglicht 2025-05-14 08:12:47 +02:00
Andreas Österreicher a72dcdf8b0 Merge branch 'bug-61306/addfaktor_entfernen' 2025-05-13 15:31:20 +02:00
SimonGschnell dab628a72d refactor(Dashboard UX): improves user experience for dashboard 2025-05-13 11:48:01 +02:00
SimonGschnell 8e2fd6e61c refactor(searchbar local/session storage): does not use uuid for localStorage and only saves values to localStorage if searchoptions.origin is defined 2025-05-12 13:58:06 +02:00
SimonGschnell ed2a467926 refactor(Dashboard additional row): changes the UI and behavior to add an additional row to the grid 2025-05-12 13:51:20 +02:00
ma0048 419341f496 absage fuer alle und rueckstellung ueber infocenter uebersicht 2025-05-12 12:53:16 +02:00
SimonGschnell a94b52dbc6 refactor(Dashboard touch events): fixes the touch event behaviors for the widgets and the dashboard 2025-05-12 11:44:27 +02:00
ma0068 12415279d1 hide column and formular field dienstverhaeltnis_unternehmen via prop 2025-05-09 14:08:49 +02:00
Harald Bamberger 4bceddcc82 add systemerror_mailto ci config, render systemerror_mailto to FHC_JS_DATA_STORAGE_OBJECT, use FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto in FhcAlert Plugins 2025-05-09 13:58:14 +02:00
ma0068 d3dc81eae8 add missing fileendings in imports 2025-05-09 09:51:30 +02:00
SimonGschnell a99721bb22 feature(Dashboard Mobile): the modal to add new widgets distributes the space to display widgetes more evenly 2025-05-09 09:34:12 +02:00
ma0068 233e768aad copy Function files to component 2025-05-09 09:11:33 +02:00
SimonGschnell a6180b3d59 feature(Searchbar Storage): uses UUID's to store searchstr and searchtypes and warn user about missing searchoption origin property 2025-05-08 12:34:35 +02:00
ma0068 9d4568e15e client side placementtest handling, filtering Dropdowns placementtests, Phrases, show future Placementtests, open Reihungstestverwaltung 2025-05-08 09:58:08 +02:00
Alexei Karpenko 405062f549 added Projektarbeit tab to Studierendenverwaltung, adding, editing, deleting of Projektarbeiten now possible 2025-05-07 18:36:51 +02:00
SimonGschnell b62c063a43 refactor(Searchbar Localstorage): adds the origin of the searchbar to the searchbaroptions and uses it for the localStorage keys 2025-05-07 11:14:59 +02:00
SimonGschnell 7d095b4998 feature(Studium LvModal): checks whether the lv has stundenplan entries and disables menu option if not/ checks the lvevaluierung information and adds it to the lvmodal information 2025-05-07 11:03:12 +02:00
SimonGschnell b5d3bf3f1e update(Cis4 Studium): finilizes Studium feature 2025-05-06 13:30:06 +02:00
Harald Bamberger 05de9cd94a move logic processing moodle events from core to moodle addon 2025-05-06 13:24:08 +02:00
Harald Bamberger 2ee7742ada Merge branch 'master' into feature-25999/C4_cleanup 2025-05-05 16:56:00 +02:00
Harald Bamberger 6ab50654ba add activity title to moodle calender entries, render activity title as html, set overscroll behavior for all day event area 2025-05-05 16:55:06 +02:00
Harald Bamberger 0930866beb revert change introduced by merging api refactoring branch 2025-05-05 13:55:54 +02:00
Andreas Österreicher 7030d5b822 Merge branch 'feature-54827/internationalisierungsmassnahmen_optimierungen' 2025-05-05 11:32:18 +02:00
Harald Bamberger 884a5e41ac Merge branch 'master' into feature-25999/C4_cleanup 2025-05-05 11:20:13 +02:00
Andreas Österreicher 6dfa7089e7 Merge branch 'master' into feature-54827/internationalisierungsmassnahmen_optimierungen 2025-05-05 11:08:25 +02:00
SimonGschnell eae44bc634 update(Studium): loads lehrmodule and lehrveranstaltungen for studienplan and displays the ui with the lvModal 2025-05-02 11:23:39 +02:00
SimonGschnell 9b895fbd23 feature(Studium API endpoinds): adds the api endpoints for the Studium View to get the studienplan from a studiensemester/studiengang/semester 2025-04-30 13:45:01 +02:00
Andreas Österreicher 24b19a1d8b Workaround für Bug in Firefox ab Version 137 wodruch der Weiter Button nicht immer ganz
angezeigt wird
2025-04-30 10:33:37 +02:00
Harald Bamberger 7d3ffdde7b fix api endpoint http error 500 when stundenplan_events is null or empty array 2025-04-29 17:15:32 +02:00
Johann Hoffmann d791a6d3ef phrasen & change email template name to under 32 characters long 2025-04-29 15:03:10 +02:00
Johann Hoffmann 38424bc875 serientermin anlegen mitarbeiter; deadline overview mitarbeiter; 2025-04-29 14:36:40 +02:00
Harald Bamberger c24a9997a9 add function StundenplanEvents to new api factory 2025-04-29 12:13:29 +02:00
Harald Bamberger 3b7a862dbe align composer.lock with composer.json 2025-04-29 11:42:26 +02:00
Harald Bamberger 5856f1c2ae Merge branch 'master' into feature-25999/C4_cleanup 2025-04-29 11:27:27 +02:00
Andreas Österreicher edcd2aa1df Merge branch 'feature-61464/infocenter_ausbildungssemester' 2025-04-28 13:23:38 +02:00
ma0068 bf0cd8e8e3 actions new, update and delete aufnahmetermine 2025-04-25 16:15:27 +02:00
Johann Hoffmann a5ab2f1381 match abgabetool_detail student/mitarbeiter look&feel; WIP terminserie, zweitbetreuer logic etc 2025-04-25 14:30:12 +02:00
Johann Hoffmann 54e8a855f4 Merge branch 'master' into feature-25999/C4_cleanup
# Conflicts:
#	public/js/apps/Dashboard/Fhc.js
#	public/js/components/Cis/Cms/Content.js
#	public/js/components/Cis/Cms/News.js
#	public/js/components/Cis/Cms/StudiengangInformation/StudiengangInformation.js
#	public/js/components/Cis/Mylv/LvUebersicht.js
#	public/js/components/Cis/Stundenplan/Stundenplan.js
#	public/js/components/DashboardWidget/Ampel.js
#	public/js/components/DashboardWidget/News.js
#	public/js/components/DashboardWidget/Stundenplan.js
#	public/js/components/DashboardWidget/Url.js
#	system/phrasesupdate.php
2025-04-25 10:58:02 +02:00
Johann Hoffmann 97d83d3acf WIP abgabetool mitarbeiter 2025-04-25 09:59:41 +02:00
ma0068 2ab01132b1 show List Admission Dates 2025-04-24 16:30:50 +02:00
Harald Bamberger 9410388a7a tune order by to sort nearest active dv first 2025-04-24 15:40:58 +02:00
ma0068 d48a0b62fd Refactoring FhcApi_Factory 2025-04-24 12:59:47 +02:00
Harald Bamberger a196da03d2 change order by to ensure latest dv is sorted first 2025-04-24 10:52:47 +02:00
ma0068 ed6b9310ae Refactoring FhcApi_Factory 2025-04-24 08:23:24 +02:00
ma0068 a4777724dc Merge branch 'master' into feature-61230/FHC4_Studierendenverwaltung_LVTermine 2025-04-24 07:59:13 +02:00
ma0068 eaaf5de9c0 Refactoring FhcApi_Factory 2025-04-24 07:54:06 +02:00
Johann Hoffmann e28067259b WIP Abgabetool Mitarbeiter DetailComponent 2025-04-23 13:59:31 +02:00
ma0068 854223a2d7 Merge master into feature-60874/FHC4_Studierendenverwaltung_Dokumente 2025-04-23 13:37:31 +02:00
Johann Hoffmann 91910ef538 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup
# Conflicts:
#	application/libraries/dashboard/DashboardLib.php
#	public/js/components/Dashboard/Dashboard.js
#	public/js/components/Dashboard/Section.js
2025-04-23 12:49:16 +02:00
ma0068 8442a3d758 Refactoring FhcApi_Factory 2025-04-23 12:03:21 +02:00
ma0068 d780b472a6 Merge master into feature-60875/FHC4_Studierendenverwaltung_Anrechnungen 2025-04-23 11:11:35 +02:00
ma0068 3200a94d17 Refactoring FhcApi_Factory 2025-04-23 11:06:08 +02:00
ma0068 874c91e21c Merge branch 'master' into feature-61229/FHC4_Studierendenverwaltung_GemeinsameStudien 2025-04-23 09:41:50 +02:00
ma0068 65c398498f Refactoring FhcApi_Factory View Modal 2025-04-23 09:32:49 +02:00
ma0068 b9bd0e53d8 merge master into feature-55992/FHC4_Studierendenverwaltung_Messaging 2025-04-22 14:58:56 +02:00
ma0068 08b27edd64 Refactoring FhcApi_Factory 2025-04-22 14:29:45 +02:00
ma0068 2b9805aeb3 merge master into feature-55991/FHC4_Studierendenverwaltung_Gruppen 2025-04-22 13:58:27 +02:00
ma0068 2d87663841 basic structure for Tab Admission Dates 2025-04-22 13:35:31 +02:00
SimonGschnell 0c95dbad1f update(Dashboard Section description): adds phrases for the description of general/custom/other sections 2025-04-22 11:40:58 +02:00
Harald Bamberger 34eb2ab80c check permission system_change_outputformat in final exam on degree program oe_kurzbz 2025-04-22 11:11:46 +02:00
SimonGschnell 8c00158d04 refactor(Dashboard Database data structure): changes how the data for the dashboard is structured in the database, instead of having a global widgets property, each section has its own widgets property where additional properties like description can be stored 2025-04-22 09:52:07 +02:00
Alexei Karpenko da86575e65 archiv: added space in edit form 2025-04-18 13:25:00 +02:00
Harald Bamberger ced54d76d5 Merge branch 'feature-55980/gehaltsbestandteile_export_filtern_summieren' 2025-04-17 18:43:51 +02:00
Harald Bamberger 7b30869f7c make where clause more precise 2025-04-17 18:28:26 +02:00
Johann Hoffmann 47917e42c3 compare datetime timestamp for n-workdays ago calculation; more eager check on change of kontrollzeiten/termine if they match a termin; added missing phrase; fetch uploaddatum in same format as von/bis for entschuldigungen so date headerfilter can work as intended; zugangscode zeitlich abgelaufen show error message; 2025-04-17 12:07:54 +02:00
ma0048 d4012232ab ausbildungssemester hinzugefuegt 2025-04-17 11:01:33 +02:00
SimonGschnell c98d0a9c45 refactor(Dashboard Section description): updates the database structure for the dashboard information to add information about the description of a section 2025-04-17 08:52:21 +02:00
Harald Bamberger ac5e95e6b9 dbchanges: add columns lvexport and lvexport_sum to hr.tbl_gehalstyp, add gehaltstyp zulage_allin, set zulage_allin for gbs attached to vbs freitext allin 2025-04-17 08:20:30 +02:00
Alexei Karpenko 59f83c33b0 Merge branch 'master' into feature-55354/Studierendenverwaltung_Karteireiter_Archiv 2025-04-16 15:24:59 +02:00
Johann Hoffmann 3f607ec241 phrasen 2025-04-15 18:03:51 +02:00
Johann Hoffmann 5abc48f568 Merge branch 'master' into feature-56330/Digi-Anw-Feedback 2025-04-15 17:56:31 +02:00
Harald Bamberger b323f91999 Merge branch 'feature-60851/FhcApi_Factory_Refactoring' 2025-04-15 16:49:17 +02:00
Harald Bamberger 99587fd064 Merge branch 'master' into feature-60851/FhcApi_Factory_Refactoring 2025-04-15 16:20:34 +02:00
Harald Bamberger b67b19bd1a handle condition when endpoint has not been set 2025-04-15 15:38:27 +02:00
ma0068 26d7d17169 delete unneeded code, fix permission issue 2025-04-15 15:21:36 +02:00
Harald Bamberger b2a7ec6e67 add component names, Modal dynamically import new phrases plugin to created app 2025-04-15 14:52:24 +02:00
Harald Bamberger 9c5ebc902d fix typos, remove duplicate attribute 2025-04-15 14:51:10 +02:00
ma0068 af30a3408c add switch stundenplan, excel export, phrases 2025-04-15 14:22:39 +02:00
SimonGschnell 19f169aca2 feature(Dashboard Grid): adds a red border to the widget if the user tries to resize the widget over its max width/height or under its min width/height 2025-04-15 13:55:02 +02:00
SimonGschnell fc0a09180a update(Dashboard pinned animation): also triggers the pinned animation when the target area of a drag action contains a pinned widget 2025-04-15 11:16:20 +02:00
ma0048 1888c51a48 master gemerged
phrase bugfix
2025-04-15 11:09:59 +02:00
ma0048 ad93a0a84c Merge branch 'refs/heads/master' into feature-54827/internationalisierungsmassnahmen_optimierungen 2025-04-15 11:09:05 +02:00
Harald Bamberger 3669e0df40 check if entry in tbl_studentlehrverband exits and update or insert on result 2025-04-15 08:24:16 +02:00
Harald Bamberger 26bf1e33d4 close button tags 2025-04-14 17:32:13 +02:00
kindlm e8a233e503 Merge remote-tracking branch 'origin/master' 2025-04-14 17:13:15 +02:00
kindlm 1cb29ce8bb Task #61376 CIS Gesamtnote Berechtigung für OE 2025-04-14 17:13:03 +02:00
Johann Hoffmann 6b6ec311c7 Merge branch 'master' into feature-56330/Digi-Anw-Feedback 2025-04-14 15:23:31 +02:00
Johann Hoffmann 8218c915d5 anw phrasen 2025-04-14 15:14:49 +02:00
SimonGschnell 88c4a04aea fix(Dashboard widget resize position): when resizing an widget without saved position it would save it with x:0 and y:0 2025-04-14 14:57:14 +02:00
SimonGschnell a25ccd79b2 fix(Dashboard New Widget Not Draggable): adds the widgetid property to newly created widgets if it is not already present 2025-04-14 14:46:11 +02:00
SimonGschnell d4ae8b0f91 fix(Dashboard Grid Height): a bug was removed where the grid height was not correct when adding a new widget and the widget was not correctly displayed when adding a new widget 2025-04-14 14:33:49 +02:00
SimonGschnell 54bbfacf86 remove(Dashboard debugging):removes a debugging print statment 2025-04-14 11:42:03 +02:00
SimonGschnell 59ebd33ba6 feature(Dashboard resize):adds overlays to the elements when resizing widgets on the dashboard 2025-04-14 11:28:13 +02:00
Harald Bamberger 31c1b087e5 fix typo, readd showallformats lookup since isBerechtigtDocAndOdt is an array of oe_kurzbzs 2025-04-11 17:51:34 +02:00
Harald Bamberger 9f94c8fafd fix typo 2025-04-11 17:22:37 +02:00
Harald Bamberger a5b8e7dc8b fix typo 2025-04-11 17:14:54 +02:00
Harald Bamberger f7138b2cfc prevent loading old phrasen plugin when Modal component is used, only commented out since plugin is maybe needed in ModalApp in some cases 2025-04-11 17:00:39 +02:00
Harald Bamberger 7f7a423e65 prevent loading old and new FhcAlert plugin resulting in two FhcAlert Apps and showing e.g. two delete confirm Dialogs 2025-04-11 16:57:20 +02:00
Harald Bamberger 75338a89c7 fix edit modal for bankdata not opening 2025-04-11 16:55:35 +02:00
Harald Bamberger 3c3e2ae662 add name to studentenverwaltung app 2025-04-11 16:53:39 +02:00
Johann Hoffmann 4ee239dd62 entschuldigung upload without file; changed dropdowns; 2025-04-11 15:53:18 +02:00
SimonGschnell a0a2ac41bf refactor(Dashboard Grid): updates replace logic when moving widgets and fixes position detection between mousemove and mousedown 2025-04-11 12:00:38 +02:00
SimonGschnell 90ce3e0263 update(dashboard CSS): adds animation for pinned widgets and different cursor styles 2025-04-11 11:55:57 +02:00
SimonGschnell 204ae75f57 refactor(Dashboard Widget Names): adds the name property to the components of the dashboard widgets 2025-04-10 11:23:39 +02:00
ma0048 bcc712e900 addfaktor beim hinzuefuegen einer lv entfernt 2025-04-09 14:27:37 +02:00
Cristina 8788cf17e2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-04-09 12:14:51 +02:00
ma0068 419c199e84 new Tab GemeinsameStudien 2025-04-09 11:06:50 +02:00
SimonGschnell 9b9b8b1532 feature(CIS Dashboard gridsystem): allows to pin widgets in the grid and changes how widgets are positioned in different viewports 2025-04-09 10:50:19 +02:00
Harald Bamberger f45e0105b0 fix typo 2025-04-07 15:54:32 +02:00
ma0068 d75e26f8ae add basis framework for lv dates 2025-04-07 14:46:36 +02:00
Harald Bamberger 242cee2b62 Merge branch 'feature-61228/FHC4_Studierendenverwaltung_SetNameAttributes' into feature-60851/FhcApi_Factory_Refactoring 2025-04-07 13:26:49 +02:00
Harald Bamberger 48a9ca0ff4 Merge branch 'master' into feature-61228/FHC4_Studierendenverwaltung_SetNameAttributes 2025-04-07 13:23:24 +02:00
Harald Bamberger cbd3c86e59 studiensemester dropdown order desc 2025-04-07 11:44:25 +02:00
cgfhtw 49cfeddfa2 LvTemplateUebersicht: use new API 2025-04-04 12:35:51 +02:00
cgfhtw 93689e3906 $fhcApi on plugins: error => warning 2025-04-04 12:35:33 +02:00
ma0068 958577902d set name attribute to components 2025-04-04 11:07:54 +02:00
ma0068 01b3d4580e set name attribute to components 2025-04-04 11:03:00 +02:00
ma0068 b2fef71b47 added name attribute to components 2025-04-04 09:53:54 +02:00
ma0068 4d1fc5e48c added name attribute to components 2025-04-04 09:41:11 +02:00
ma0068 92a05c4711 reset config use_vuejs_dev_version 2025-04-04 09:35:37 +02:00
ma0068 bef3e88e92 name attributes for components added 2025-04-04 09:33:44 +02:00
ma0048 f826c20949 lv_id beim zeugnis.rdf.php hinzugefuegt
auf die ersten 2 lvs im microdegree eingeschränkt
2025-04-04 08:42:20 +02:00
ma0068 1991418931 New tab Dokumente 2025-04-03 16:54:56 +02:00
Harald Bamberger 8c0325b693 fix template compilation errors 2025-04-03 16:35:29 +02:00
Harald Bamberger 9572bdf3eb Merge branch 'master' into feature-60851/FhcApi_Factory_Refactoring 2025-04-03 15:58:45 +02:00
Harald Bamberger 97782b7f1d Merge branch 'feature-60863/Betragspalte_Sachaufwand' 2025-04-03 11:12:31 +02:00
Harald Bamberger 315b763380 Merge branch 'master' into feature-60863/Betragspalte_Sachaufwand 2025-04-03 11:10:52 +02:00
Andreas Österreicher b41baad89d Merge branch 'Monika70-lvgesamtnoteverwalten' 2025-04-03 07:43:02 +02:00
Andreas Österreicher cc51e7f04a Merge branch 'lvgesamtnoteverwalten' of github.com:Monika70/FHC-Core into Monika70-lvgesamtnoteverwalten 2025-04-03 07:38:03 +02:00
Andreas Österreicher 2a2e2ea193 Warteliste Message angepasst damit die Tagesgrenze korrekt vom
Wartenden-Status ermittelt wird
2025-04-02 16:55:31 +02:00
Harald Bamberger a54f7531bf add column betrag to table hr.tbl_sachaufwand 2025-04-02 16:07:09 +02:00
SimonGschnell 97e34948e5 refactor(WidgetIcon for Dashboard dragging): puts the hidden dashboard icons for the dragging image in the section component so that each section has its relative clientX and clientY positions 2025-04-02 11:23:25 +02:00
SimonGschnell 33f800fa28 fix(Dashboard Mobile Touch Events): fixes the behaviour of the touch event for the dashboard grid 2025-04-01 13:06:23 +02:00
Andreas Österreicher 7345dd258d Merge branch 'feature-56033/Beurteilungsformulare_neue_Kategorien_ab_SS2025' 2025-04-01 11:17:51 +02:00
Andreas Österreicher 8a7290359a Merge branch 'master' into feature-56033/Beurteilungsformulare_neue_Kategorien_ab_SS2025 2025-04-01 10:52:04 +02:00
SimonGschnell 702a84a25d update(Dashboard Grid Item):makes a widget only draggable if the dragAction is defined 2025-04-01 09:28:29 +02:00
Harald Bamberger e809e48262 fix order of parameters 2025-03-31 15:40:18 +02:00
SimonGschnell 232da256ac fix(Dashboard Drag Placeholder): doesn't allow placeholder items to be dragged anymore and keeps the height and width of a widget when resizing the grid of the dashboard 2025-03-31 14:56:50 +02:00
SimonGschnell 51f4e1e57d fix(Chrome overflow scroll display): changes overflow scroll to auto to change the visual in the chrome browser 2025-03-31 09:47:27 +02:00
Alexei Karpenko b4b2d8da49 added UHSTAT issue resolvers, bugfix getuhstatdata: check for empty array 2025-03-30 23:38:35 +02:00
kindlm 86158e6f28 Merge remote-tracking branch 'origin/master' 2025-03-30 00:40:14 +01:00
kindlm 7c61ee55c2 Fragensumme in Übersicht eingefügt 2025-03-30 00:40:08 +01:00
Andreas Österreicher 5197037126 Merge branch 'feature-60880/pep_finetuning_spring_231' 2025-03-28 08:59:00 +01:00
Johann Hoffmann ba806c13fb assistenz edit entschuldigung modal for editing von/bis date (on open excuse notes) & textarea for notiz - which is still limited to 255 characters; added student semester column to assistenz table; removed column width constraints & layout changed to fitData, persistence option is TRUE now; WIP von/bis/uplaoddate headerfilter; automatically send email to students on entschuldigungn status changed; added minimum time range for Kontrolle to be at least the length of 1 teaching unit(per config) - currently 45minutes; start new kontrolle modal more clearly shows when time & date values have been read from stundenplan; increased qr degeneration timer from 200 to 5000ms to avoid "missed" checkins due to network time; lektor can retrieve all entschuldigungen ranges & statuses of students when hovering their row; lektor can show anw qr window seperately now; into externalzuordnung admin/person_id fix in deleteEntschuldigung; moved fetch semesterinfo into global setup; fixed some vue template warnings; 2025-03-27 17:15:37 +01:00
Harald Bamberger 95856c9e4d bootstrap5 version 5.3.3 2025-03-27 15:14:56 +01:00
kindlm 1e2a4d202f Fix Typo PrueferIn 2025-03-27 13:57:44 +01:00
Cristina 0113c9d97a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-03-27 13:42:48 +01:00
kindlm b32f60874c Merge remote-tracking branch 'origin/master' 2025-03-27 11:55:58 +01:00
kindlm 78c23699d5 TinyMCE-Editor bei Ampeldetails 2025-03-27 11:55:41 +01:00
Andreas Österreicher 8178368113 Merge branch 'feature-40953/LV-Template_Uebersichtsseite' 2025-03-27 09:34:06 +01:00
Andreas Österreicher 392c15da77 Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2025-03-27 09:32:59 +01:00
SimonGschnell 727b951bbc update(Dashboard Grid): does not show the overlay when resizing the widget and adds different grid sizes for different viewports 2025-03-26 14:59:28 +01:00
SimonGschnell 08cb4a7970 refactor(color update): switches fhc-secondary with fhc-tertiary 2025-03-26 13:17:08 +01:00
SimonGschnell b52993f7cc refactor(Grid Widgets drag): shows a placeholder item in the space where the new widget position would be when dragging a widget on the dashboard 2025-03-26 13:02:48 +01:00
cgfhtw c780b29732 load new API in old API 2025-03-26 09:20:58 +01:00
kindlm f55c309692 Fehlende Tabellen beim Löschen von Personen ergänzt 2025-03-25 16:33:13 +01:00
kindlm c569af6d0f Löschen bei Personensuche löscht auch Testtooleinträge 2025-03-25 16:07:42 +01:00
kindlm ce54cf3c9c Bugfixes Studentenmeldung 2025-03-25 16:07:09 +01:00
kindlm fae299847e Messaging-Fenster scrollt automatisch nach oben 2025-03-25 15:56:55 +01:00
kindlm 742ae40d98 Link Zugangscode öffnet nicht sondern kopiert in zwischenablage 2025-03-25 15:56:30 +01:00
SimonGschnell 1cdf89e405 fix(Dashboard drag event): fixes bug where widget wouldn't drag to new position 2025-03-25 13:18:00 +01:00
SimonGschnell ab36d567b8 refactor(Url Widget): fixes add link button inside the widget 2025-03-25 12:47:58 +01:00
Andreas Österreicher 4c38d88840 Merge branch 'feature-61109/infocenter_anzahlung_auf_kaution_aendern' 2025-03-24 16:45:49 +01:00
SimonGschnell 75ad88eb24 update(Plugin Theme):changes the way the primevue theme is replaced if the theme is not dark or light 2025-03-24 15:05:07 +01:00
ma0048 7126ab4561 - "Kaution" - column: buchungstyp von anzahlung auf kaution geandert 2025-03-24 14:33:34 +01:00
SimonGschnell 5d39d5ec46 feature(FHC Theme plugin): adds a plugin that provides functionality and information of the current theme 2025-03-24 14:29:21 +01:00
ma0048 45b7a56c3a - zeugnis vorlage fuer micro degree 2025-03-24 14:00:14 +01:00
cgfhtw 9f06fbcf93 refactor fhcApi 2025-03-24 13:38:49 +01:00
SimonGschnell 80c326360f update(FHC Color Themes): makes the css variables and color modes configurable through the config for different fh's 2025-03-24 11:59:03 +01:00
Andreas Österreicher a6ee6a8c0f ReihungstestJob angepasst damit Drittstaatenkaution berücksichtigt wird.
Fehler behoben beim setzen des Abgewiesenen Status das nicht in allen
Fällen funktioniert hat
2025-03-24 11:45:58 +01:00
Cristina 92db886a9f Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-03-24 11:18:53 +01:00
Andreas Österreicher 45f3acf922 Merge branch 'feature-37620/reihungslisten' 2025-03-24 10:24:01 +01:00
Andreas Österreicher 08e38078a0 Removed duplicate Confirm 2025-03-24 09:57:46 +01:00
SimonGschnell ff311ddaa8 fix(News widget autoscroll): removes the ride attribute from the bootstrap carousel to remove the autoscrolling of the news widget 2025-03-24 09:34:52 +01:00
Andreas Österreicher 410231a427 Merge branch 'master' into feature-37620/reihungslisten 2025-03-24 09:18:26 +01:00
SimonGschnell 0735c61361 update(UrlWidget addUrl Action):adds the transition animation to the action button of the url widget 2025-03-24 08:53:15 +01:00
SimonGschnell 7936e08d3d refactor(Dasboard Item): adds container for actions events from Dashboard widgets 2025-03-21 12:49:29 +01:00
SimonGschnell 3f605e7051 feature(Cis Color Themes): makes it possible to change color theme of the application 2025-03-21 11:42:09 +01:00
Johann Hoffmann a3e22da633 calcEntschuldigungen minDate as workdays in config; updatevon/um anwCheckIn; Orgform dual in sancho mail; zusatz (d.d.i)/(d.d.o) & (o) auch wenn bis datum leer ist aber von bereits eingetragen 2025-03-20 17:21:42 +01:00
Alexei Karpenko fb2f8d5c53 added function for getting UHSTAT1 person data (centralizing...) 2025-03-20 14:41:28 +01:00
Cristina b18b3b62a7 Merge remote-tracking branch 'origin/feature-40953/LV-Template_Uebersichtsseite' into feature-40953/LV-Template_Uebersichtsseite
# Conflicts:
#	system/phrasesupdate.php
2025-03-20 13:29:49 +01:00
Cristina 2a4f1af69f Added phrase lizenzkategorie to Softwarebereitstellung app 2025-03-20 11:41:47 +01:00
Cristina b8417869b5 Added phrase lizenzkategorie to Softwarebereitstellung app 2025-03-20 11:18:26 +01:00
ma0068 b75c9cc524 portation of tab Anrechnungen
- switch version edit / non edit in config
2025-03-20 11:16:05 +01:00
Johann Hoffmann 2759bb0309 cis4 abgabetool student uploads/signature check/emails working; TODO: - testing with diff users, styling & mobile layout; 2025-03-19 15:57:08 +01:00
Cristina d4feee8914 Fixed wrong param causing wrong Notenliste for Wiederholer 2025-03-18 14:30:19 +01:00
ma0048 0a2bd1bdde - stundengrenze bei dummy nicht beruecksichtigen 2025-03-18 14:02:23 +01:00
Cristina 19fdefc398 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-03-18 10:42:15 +01:00
Harald Bamberger f6352211f2 Merge branch 'feature-55614/Uebersichten_LV_TPL_QK_OP' 2025-03-17 12:56:59 +01:00
SimonGschnell 0dd1e4a628 refactor(RoomInformation): updates the roomInformation endpoint to use the Stundenplan library functions 2025-03-13 10:29:23 +01:00
ma0068 3b8b8d7882 remove testdata in getFunction 2025-03-13 09:34:06 +01:00
ma0068 7b4f0f9dff Adaptions
- bugfix personFields
- validation for sendmessage for openmode inSamePage, newTab, window
- restyling div for enable scrolling in openmode InSamePage
2025-03-13 09:05:53 +01:00
Szabo Mónika 2901847788 Update lvgesamtnoteverwalten.php
Der Lehrveranstaltungstyp wurde in der E-Mail über die freigegebenen Noten hinzugefügt.
2025-03-12 15:11:00 +01:00
ma0068 a0ce635c7e Refactor and Cleanup
- adapt tabulator and queries for remote pagination
- use formatterParams for messageStati to enable phrase logic
- adapt logic for mitarbeiter_uid
- refactor logic to use new Page, new Tab and newDiv with one child component
- add phrases
2025-03-12 15:04:37 +01:00
Johann Hoffmann 669752dd90 WIP cis4 abgabetool student 2025-03-12 13:41:01 +01:00
Andreas Österreicher dc51e9bd85 Merge branch 'bug-56084/PHP_Notice_bei_Lehrauftrag_Erteilen_Bestellen' 2025-03-12 12:08:49 +01:00
Harald Bamberger 129637cf4f add phrases for lvdev overviews 2025-03-12 12:05:34 +01:00
Paolo bb476bb257 Merge branch 'master' into bug-56209/is_valid_date_vs_isValidDate 2025-03-12 11:54:50 +01:00
Harald Bamberger ff65852643 neues recht basis/verwaltet_oe 2025-03-12 08:21:03 +01:00
ma0068 ea2be8026b filter hidden from kontakttyp, show typ.beschreibung in dropdown 2025-03-12 08:06:23 +01:00
Cristina ed2f895d8b Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2025-03-11 17:35:34 +01:00
Cristina f219a19dec Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-03-11 16:31:48 +01:00
Alexei Karpenko 639c7d7e41 Studentenverwaltung Archiv: added phrases for table headings 2025-03-10 22:50:04 +01:00
Alexei Karpenko f8eb265eb0 Studentenverwaltung Archiv: non-signable documents can be archived, set correct default Vorlage (Zeugnis) 2025-03-10 22:35:14 +01:00
Harald Bamberger 1f5925e860 searchbar restults mobile improve css selector, alter student result view 2025-03-10 17:11:03 +01:00
Harald Bamberger b9823a0278 set overscrollbehavior none for all dashboard-items 2025-03-10 14:39:31 +01:00
Harald Bamberger 2b4ccab2f1 studiengang info widget decrease size of headings 2025-03-10 14:30:28 +01:00
Harald Bamberger fad5f8b9d0 increase height of iframe especially for mobile view 2025-03-10 11:28:29 +01:00
ma0068 1989e65d72 Tree structure for messages, preview in NewDiv, Note to close window, check recipient_id, save relationmessage_id 2025-03-10 07:51:53 +01:00
Johann Hoffmann d349a64ca8 fix news widget carousel (re)initialization after resize 2025-03-06 16:19:49 +01:00
Andreas Österreicher 21e3169d8d Merge branch 'bug/pep_suche_lehre' 2025-03-06 11:58:56 +01:00
ma0048 740a473c8d tagheaderfilter fix 2025-03-06 11:55:25 +01:00
Cristina 83fe68c04e Removed 2 methods getNonQuellkursLvs and getNonQuellkursLvsAutocompleteSuggestions from Lehrveranstaltung_model.php 2025-03-06 10:39:00 +01:00
Andreas Österreicher c84ffdf893 Merge branch 'pep_deploy_2025_03_06' 2025-03-06 10:36:26 +01:00
Cristina eedbab21a2 Added phrases for Softwarebereitstellung 2025-03-06 09:58:15 +01:00
Cristina 3a83d468ef Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2025-03-06 09:50:55 +01:00
Cristina 85ef49bb62 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-03-06 09:48:58 +01:00
Cristina aab0dd7fc7 Added / Adapted Model queries and api Controller regarding for Lehrveranstaltung- and Studienjahr Model 2025-03-06 09:40:40 +01:00
Harald Bamberger bd7669ff5b Merge branch 'merge_FHC4_C4' 2025-03-05 17:37:16 +01:00
Harald Bamberger 00b766cb69 tweak mobility form behavior 2025-03-05 17:35:27 +01:00
ma0048 663ff947b0 prepare for deploy 2025-03-05 15:19:24 +01:00
ma0048 11ba9c9911 Merge branch 'refs/heads/feature-55289/pep_fine_tuning' into pep_deploy_2025_03_06
# Conflicts:
#	system/dbupdate_3.4.php
2025-03-05 15:15:57 +01:00
ma0048 f942836453 Merge remote-tracking branch 'origin/feature-54945/filtercomponent_custom_headerfilter_datum' into pep_deploy_2025_03_06
# Conflicts:
#	public/js/tabulator/filters/defaultHeaderFilter.js
2025-03-05 15:14:49 +01:00
Alexei Karpenko 2cbbcc9039 changed Projektarbeitsbeurteilung phrase 2025-03-05 14:52:55 +01:00
Johann Hoffmann 14f64401e5 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-03-05 14:24:24 +01:00
Johann Hoffmann a4d2a2cace fix news widget carousel (re)initialization after resize 2025-03-05 14:23:35 +01:00
SimonGschnell 97ee1f8144 fix(News Widget animation): fixes the animation bug when changing the width of the News widget from 1 to >1 2025-03-05 13:42:37 +01:00
SimonGschnell ba2014b1a3 fix(News Widget animation): fixes the animation bug when changing the width of the News widget from 1 to >1 2025-03-05 11:21:49 +01:00
SimonGschnell c22118a26c fix(VueRouter News Ansicht):News ansicht konnte nicht geladen werden weil viewData im Cms controller nicht uebergeben wurde aber im CisRouterView verwendet wird 2025-03-05 10:49:03 +01:00
SimonGschnell c677c48b00 fix(StudiengangsInformationen API data): fixes little error when checking if the uid is a mitarbeiter or not 2025-03-05 10:47:45 +01:00
SimonGschnell 44777e2f1b fix(VueRouter News Ansicht):News ansicht konnte nicht geladen werden weil viewData im Cms controller nicht uebergeben wurde aber im CisRouterView verwendet wird 2025-03-05 09:20:35 +01:00
SimonGschnell 415e759586 fix(StudiengangsInformationen API data): fixes little error when checking if the uid is a mitarbeiter or not 2025-03-05 08:54:26 +01:00
ma0068 188e6db759 bugfix: update sqls with LEFT condiiton 2025-03-05 08:49:42 +01:00
ma0068 588834d73f add click event to enable new choice for lehreinheit dropdown 2025-03-04 15:11:22 +01:00
Harald Bamberger fe4c14f75f Merge branch 'merge_FHC4_C4' 2025-03-04 14:40:13 +01:00
ma0068 45fd48a50e add watcher for resetting lehreinheit 2025-03-04 14:33:20 +01:00
ma0068 d39dfbc41b use loadItems with second condition 2025-03-04 14:11:40 +01:00
ma0068 e69a9eeadb set 1st condition to not disabled 2025-03-04 14:02:50 +01:00
ma0068 eb958d19c8 set 3rd condition to not disabled 2025-03-04 14:00:13 +01:00
ma0068 358480600e add condition existing lehreinheit and not existing lv_id 2025-03-04 13:58:02 +01:00
ma0068 d5eae17ba5 extend queries for lehrveranstaltung_id to see dropdown 2025-03-04 13:49:39 +01:00
SimonGschnell b1b0d5edd0 remove(Calendar Week Page Style): removes not needed style check in component 2025-03-04 12:05:24 +01:00
Harald Bamberger 93ff868501 ensure student_uids is an array even if only one uid is passed 2025-03-04 11:23:46 +01:00
cgfhtw 825ccfcc37 Calendar: Get rid of Warnings 2025-03-04 11:15:51 +01:00
ma0068 701c57966f tab contact - field plz: numberformat validation only for Austria 2025-03-04 10:53:03 +01:00
ma0068 c2691f867d form Abschlusspruefung as modal 2025-03-04 09:57:25 +01:00
ma0068 8320de66bc redesign dropdown mobility-support with overriding filtercomponent 2025-03-04 08:26:07 +01:00
ma0068 815307e392 Reply functionality and Pagination 2025-03-04 07:32:14 +01:00
Johann Hoffmann 2b16d8940f fhc header skiplink; cis4 skiplink css; 2025-03-03 17:57:42 +01:00
Harald Bamberger 091aa1917b set maxwidth for frozen actions column 2025-03-03 17:17:25 +01:00
ma0068 f471321b98 Merge branch 'merge_FHC4_C4' of github.com:FH-Complete/FHC-Core into merge_FHC4_C4 2025-03-03 16:40:15 +01:00
ma0068 1944152d13 redesign dropdown mobility-properties with overriding filtercomopnent actions 2025-03-03 16:40:05 +01:00
Johann Hoffmann e4317f7a94 mobile breakpoints & form validation; 2025-03-03 15:57:55 +01:00
Harald Bamberger 9aa8c33e83 fix use of confirm dialog with rewritten factory calls 2025-03-03 15:26:54 +01:00
ma0068 20fc528107 Use Modal for Mobility Tab 2025-03-03 15:10:01 +01:00
SimonGschnell b8239b0842 update(LvInfo Phrasen): adds some phrasen for the LvInfo View for the moodle events 2025-03-03 14:38:23 +01:00
SimonGschnell 20f22d5a7b fix(Calendar selectedEvent and Scrolling): sorts the events before selecting the first as the selectedEvent and adds some scrolling checks 2025-03-03 14:15:50 +01:00
Johann Hoffmann 225d6b0a83 raumsuche student config for allowed roomtypes 2025-03-03 13:51:43 +01:00
Paolo c028a769cc TableWidget bug: the bootstrapVersion was provided with the tableUniqueId, not needed 2025-03-03 13:44:40 +01:00
ma0068 50ec93f5c1 extend function getLesFromLvIds for studiensemesterkurzb and aggregation lehreinheit_id 2025-03-03 13:43:19 +01:00
Alexei Karpenko e61b6b447c Abgabetool: removed hyperlink from benoten button quickinfo 2025-03-03 13:37:33 +01:00
SimonGschnell a408c85fd4 fix(Calendar Day SelectedEvent): fixes the watcher on the property active to additionally look at the events property and set the selectedEvent accordingly to the situation 2025-03-03 13:29:31 +01:00
SimonGschnell 98fa76ca1d fix(Calendar Month setSelectedEvent): selects the clicked lehrveranstaltung as selectedEvent in the click handler of the Month/Page View 2025-03-03 13:04:52 +01:00
Alexei Karpenko 037811c24c Paarbeitsabgabe: replaced num_rows_sem with new paiscurrent variable 2025-03-03 12:39:07 +01:00
ma0068 da9afa5c67 Merge branch 'merge_FHC4_C4' of github.com:FH-Complete/FHC-Core into merge_FHC4_C4 2025-03-03 11:54:13 +01:00
Harald Bamberger 409a70bdf9 add form as first param 2025-03-03 11:47:30 +01:00
ma0068 05a6109c27 Merge branch 'merge_FHC4_C4' of github.com:FH-Complete/FHC-Core into merge_FHC4_C4 2025-03-03 11:46:12 +01:00
ma0068 b50a4a16d1 change form parameter mobility and add param studiensemester_kurzbz to function get LVsandLesByStudent 2025-03-03 11:45:31 +01:00
SimonGschnell b8c45cf244 update(Moodle Events):adds additional fields for Moodle Events and disables the automatic scrolling for moodleEvents 2025-03-03 11:07:54 +01:00
Harald Bamberger 1fbc552d30 fix factory losing enpoints when person search is called before 2025-03-03 10:45:02 +01:00
Johann Hoffmann bc7dba1c14 legacy raumsuche.php -> cis4 vue component 2025-02-28 16:41:18 +01:00
SimonGschnell 4a01198e10 refactor(Stundenplan Endpoint):puts methods used to fetch Stundenplan and Reservierungs Events in its own library and dynamically merges the moodle events if plugin is present 2025-02-28 14:52:02 +01:00
Harald Bamberger 28f11d7550 Merge branch 'bhdev_tabulator6' into merge_FHC4_C4 2025-02-28 14:35:17 +01:00
Alexei Karpenko a63c321f97 added Projektarbeitsbeurteilung phrases 2025-02-28 12:09:26 +01:00
Alexei Karpenko c07c4ef4c9 Merge branch 'master' into feature-56033/Beurteilungsformulare_neue_Kategorien_ab_SS2025 2025-02-27 15:46:09 +01:00
SimonGschnell 45c929cb90 refactor(LvInfo): refactors template layout of LvInfo for lehrveranstaltungen and moodle events 2025-02-27 14:47:45 +01:00
Alexei Karpenko b348119488 added comment to Documents api controller 2025-02-27 14:45:57 +01:00
ma0068 f9f185bfef Views modal, new tab, new page, app and controller for newMessage to open in tab or window 2025-02-27 14:06:25 +01:00
Paolo 7b74c36952 - Removed public method isValidDate from controller api/frontend/v1/studstatus/Unterbrechung
- Replaced callback_isValidDate with is_valid_date
- Removed global function isValidDate from helpers/hlp_common_helper
2025-02-27 12:09:30 +01:00
SimonGschnell e2b1dad776 fix(Plugin Moodle Event.php) adds the moodle calendar events integration through the Events instead of having a fixed dependency 2025-02-27 12:06:43 +01:00
Johann Hoffmann 9b68bfd336 focus day highlight css animation 2025-02-27 11:49:57 +01:00
Harald Bamberger 80b67ad416 add tabulator6 2025-02-27 11:35:21 +01:00
Johann Hoffmann 9acc2a8a9d revert router.replace strategy in month page; added weeks component without header into modal when week page header is clicked to enable week selection but without leaving the week carousel page 2025-02-27 11:16:35 +01:00
ma0048 55312848a3 Merge remote-tracking branch 'origin/feature-55289/pep_fine_tuning' into feature-55289/pep_fine_tuning 2025-02-27 09:08:29 +01:00
ma0048 737c9937c9 - namen bei tags
- phrasen hinzugefuegt
2025-02-27 09:07:23 +01:00
ma0048 30c4245861 - international skills -> diplomasupp
- notenuebernahme mail
- student uebersicht ueberarbeitet
- phrases angepasst
2025-02-27 08:35:05 +01:00
Alexei Karpenko 9bd5f6dcb6 Studierendenverwaltung Archiv: enabled download of documents 2025-02-26 19:38:09 +01:00
Alexei Karpenko 00b77d726c Studverwaltung Archiv: update of archived documents is possible, enabled archiving via multi-select 2025-02-26 18:11:07 +01:00
Johann Hoffmann 8e697515bc added vue datepicker11 option; month page header click show months in modal instead of switching page & mode; 2025-02-26 17:04:59 +01:00
Andreas Österreicher 1cecdcb8ef Berechtigung fuer begrenzte Reports umbenannt 2025-02-26 16:24:46 +01:00
Harald Bamberger fe98eb2784 add missing .js file extension to import statement 2025-02-26 15:34:49 +01:00
Johann Hoffmann c833b40527 merge fix 2025-02-26 15:11:05 +01:00
SimonGschnell 973b011f36 merge C4 cleanup 2025-02-26 14:42:52 +01:00
SimonGschnell e635d5e0e1 update(Dashboard Calendar Moodle): adds the moodle Calendar Events in the Dashboard Stundenplan both for the minimized view and the month view 2025-02-26 13:43:28 +01:00
SimonGschnell fe1971a1d3 update(Calendar Moodle): adds background color to full day events, adds the link to the moodle activity, sorts the events based on type 2025-02-26 13:05:17 +01:00
Johann Hoffmann ecd5e95f2d access computed grade phrase defensive; avoid pushing redundant mode changes; replace current state with new params when a different day is selected in the current month -> beforeEnter guard creates redundant navigation history entry which is currently being blocked but produces the possibility to infinitely "rego forward"; 2025-02-26 11:42:32 +01:00
SimonGschnell bad19ccde7 feature(Calendar Scroll Behavior): only scrolls an entire hour at the time when scrolling with the mouse wheel 2025-02-26 09:40:42 +01:00
Johann Hoffmann 881b7fb789 fix loadEvents race condition; normalize route pushes; WIP getting route.replace to work; 2025-02-24 17:53:56 +01:00
ma0048 ab20943493 - filter aus dem defaultfilter entfernt
- tagfilter hinzugefuegt
- clear filter hinzugefuegt
- persistence default auf false gesetzt
2025-02-24 08:58:35 +01:00
Harald Bamberger ba594a320b Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-24 08:50:04 +01:00
Harald Bamberger 9876976c70 Merge branch 'master' into merge_FHC4_C4 2025-02-24 08:46:48 +01:00
ma0068 3c34b17d2d add Preview-logic, update function sendMessage 2025-02-21 14:58:59 +01:00
SimonGschnell ebbec03de4 feature(Calendar Moodle): adds moodle svg and adopts month page view for moodle events 2025-02-21 14:21:38 +01:00
Johann Hoffmann 7a0a2d756d load lv entry as meta info when querying stundenplan by lva & show titel in ger/eng; also show currently active Studiensemester; roomInfo constant defined aswell; 2025-02-21 14:16:11 +01:00
Alexei Karpenko b989eae461 added archive tab to Studierendenverwaltung, possibility to archive documents 2025-02-20 20:07:07 +01:00
Johann Hoffmann 844c31885e defined row min height & event max height props; month event click opens lv modal; fixed off by one date state; 2025-02-20 16:25:57 +01:00
Johann Hoffmann 3d467524e4 change Stundenplan/Rauminfo currentDay on prev/next event by certain offset and update url/browser history 2025-02-20 12:59:28 +01:00
SimonGschnell 400ba2d7f9 fix(Calendar All Day Events): positions the all day Events in its own container above the events 2025-02-20 12:10:48 +01:00
Johann Hoffmann 1d9ea5d091 router click intercepter does not resolve internally when only matched route was the Fallback matchAll route; cleanup routes.php & Stundenplan controller from viewData and verbose reroutes; overflow setting on years page; 2025-02-20 11:22:30 +01:00
kindlm dd2a13d92d Korrektur DMS-Link 2025-02-19 18:02:30 +01:00
kindlm 2946d59e7a Merge remote-tracking branch 'origin/master' 2025-02-19 18:01:46 +01:00
ma0068 31af28a7c4 Merge branch 'feature-52533/PV21_Karteireiter_Vertraege' of github.com:FH-Complete/FHC-Core into feature-52533/PV21_Karteireiter_Vertraege 2025-02-19 16:37:47 +01:00
ma0068 f3527dc8ff bugfix function getMitarbeiterUid 2025-02-19 16:37:30 +01:00
Andreas Österreicher 7c57a145bd Merge branch 'hotfix-55802/Composer_dead_github_repository' 2025-02-19 15:49:48 +01:00
Andreas Österreicher 661be92fed Merge branch 'bug-54831/Logs_Viewer_Filter_Error' 2025-02-19 15:40:25 +01:00
Paolo 37f86f651e Fixed string casting of the condition for the filter component
Fixed CSS for the error box in the logs viewer filter
2025-02-19 15:37:51 +01:00
SimonGschnell 40f64cc979 feature(Calendar Moodle): adds and modifies the week and day view for moodle events 2025-02-19 14:52:51 +01:00
SimonGschnell 5cb09c8e7b fix(LvMenu): fixes the highlighting styles for the lvMenu, instead of using fhc-entry it uses its own class 2025-02-19 14:50:19 +01:00
Harald Bamberger 11e8ffb22c Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-19 14:25:04 +01:00
Harald Bamberger 157ffd00f2 Merge branch 'master' into merge_FHC4_C4 2025-02-19 14:24:14 +01:00
Andreas Österreicher bbd70749fe Projektexport angepasst damit die Überschriften aufgrund der
Beschreibung erstellt werden anstatt auf Basis der Bezeichnung da diese
öfter abgeschnitten werden und es dadurch gleich benannte Spalten gibt
und dadurch eine nicht korrekt angezeigt wird
2025-02-19 11:41:46 +01:00
ma0068 f89c194d32 add Vorlagendropdown Component and Listboxes for Messaging Variables 2025-02-19 11:36:00 +01:00
Johann Hoffmann 714d74d9aa url widget template fix 2025-02-19 11:25:29 +01:00
Johann Hoffmann b817458222 lv menu events send phrasenkey to enable responsive localization in myLv 2025-02-18 17:36:48 +01:00
Johann Hoffmann cb42ba110e adapt new calendar url format for rauminfo page; readded vue router dashboard fallback since there are possible url combinations that can not be resolved properly; 2025-02-18 16:31:05 +01:00
Johann Hoffmann 8e76d93a5a consistent naming of calendar modes in english; fixed routerguard to work with router.push on mode or date changes inside stpl component; 2025-02-18 14:48:14 +01:00
SimonGschnell e086da2274 feature(Calendar Moodle Events): displays moodle events as allDayEvents in the Calendar 2025-02-18 14:23:56 +01:00
Johann Hoffmann e2e537b09c fix calendar mode watch/emit handling; WIP roomInfo routes 2025-02-18 10:55:46 +01:00
Johann Hoffmann d45a41b949 defined new CI routes to differentiate between 5 cases CI doesnt handle anymore but vue router does; define Stundenplan/:lv_id? route for old links to redirect to new route Stundenplan/:mode/:focus_date/lv_id; new route with props route param handling to put them into viewData to always check for the same object; define day as allowed init mode; WIP same thing for raum calendar page; 2025-02-18 10:18:39 +01:00
Alexei Karpenko 9fb2ea4ae3 Projektarbeitsbeurteilung: added authorization (Berechtigungen) check to document export 2025-02-17 19:03:53 +01:00
kindlm a557cd8d7c Merge remote-tracking branch 'origin/master' 2025-02-17 16:50:26 +01:00
kindlm b89eef0525 Minor Bug/Typo-fixes in testtool
- Soundtest aus testseite.php ausgeblendet
- Studiengangsname nach Login aus Studienordnung
- Bei Übersicht wird nun auch Text angezeigt, wenn ein Bild ausgegeben wird
2025-02-17 16:50:07 +01:00
SimonGschnell c960b4832d test 2025-02-17 14:40:24 +01:00
Alexei Karpenko 57eec9b940 adapted document export to new Projektarbeit version (percent assessment) 2025-02-14 23:47:19 +01:00
Alexei Karpenko 7083955702 changed Proektarbeitsbeurteilung phrases 2025-02-14 16:44:33 +01:00
Harald Bamberger 48ef35c0e9 Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-14 14:58:46 +01:00
Harald Bamberger f6f06c4d5e use attribute binding since value should be boolean 2025-02-14 14:58:12 +01:00
Harald Bamberger b01400d21c remove unused data declaration 2025-02-14 14:55:57 +01:00
Harald Bamberger 92ba4aea9a return year as number not as string 2025-02-14 14:53:19 +01:00
Johann Hoffmann 7fed1d231c p.t( -> $p.t( in stundenplan & mylv components, added missing phrasen; WIP adding phrasen keys for noten, maybe for lva titles 2025-02-14 14:49:28 +01:00
Johann Hoffmann 3a1055d87e computed phrasen in column titles student profil for zutrittsgruppen/betriebsmittel; samilar to mitarbeiter profil 2025-02-14 13:54:02 +01:00
Johann Hoffmann bb69e07340 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-02-14 13:35:48 +01:00
Johann Hoffmann ff8d1c78fd funktionen/betriebsmittel table in profil & viewprofil got computed phrasen title; provide computed language reference in fhc app from phrasen plugin to watch for language changes to reevaluate computed phrasen in columns with; added some phrasen; 2025-02-14 13:34:52 +01:00
Harald Bamberger 350980c5df Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-14 13:33:52 +01:00
Harald Bamberger cff606815e fix TransitionGroup children have to be keyed when adding a new widget to dashboard 2025-02-14 13:33:29 +01:00
Harald Bamberger ee0e5fe40e Merge branch 'master' into merge_FHC4_C4 2025-02-14 13:25:14 +01:00
Johann Hoffmann ff60de5772 anrechnungen reload page on languageChange in php template site with cis4Reload attribute set; 2025-02-14 11:26:14 +01:00
ma0068 660f9076ce delete commented out sections 2025-02-14 09:38:33 +01:00
Andreas Österreicher 470eac7d3c Merge branch 'feature-46784/cronjob_reihungstest_warteliste_anpassen' 2025-02-14 08:18:16 +01:00
Johann Hoffmann 40db480489 stundenplan widget header format as per fhc locale 2025-02-13 17:46:28 +01:00
Johann Hoffmann 43e3fdcc46 remove log 2025-02-13 17:28:34 +01:00
Johann Hoffmann 4de9441699 fix accessing fhc language locale .locale -> .LC_TIME 2025-02-13 17:25:24 +01:00
Johann Hoffmann 47293a81d3 avoid persisting invisible column definitions on funktionen table 2025-02-13 13:40:24 +01:00
Johann Hoffmann 139a2f900f watch for changing betriebsmittel & funktionen data; wait for loaded viewData before rendering greeting; 2025-02-13 12:41:24 +01:00
Johann Hoffmann 2d5309f97d fix invisible funktionen/betriebsmittel tabulator columns; fix phrasen roleInfo studentViewProfil; 2025-02-13 12:06:41 +01:00
Alexei Karpenko de895362be changed Projektarbeitsbeurteilung phrases even more 2025-02-12 19:28:27 +01:00
Alexei Karpenko 92f3f0d89c changed Projektarbeitsbeurteilung phrases 2025-02-12 19:15:43 +01:00
Harald Bamberger 2f47cc7966 Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-12 17:58:37 +01:00
Harald Bamberger 9bcd566bee fix TransitionGroup children have to be keyed and duplicate attribute v-bind 2025-02-12 17:57:53 +01:00
Harald Bamberger a6e0f10f32 use correct path to searchbar.css 2025-02-12 17:56:10 +01:00
Johann Hoffmann 480bef3b0d student profile role info verband/gruppe/semester links to old cis list; reworked role info data to also work in english lol; 2025-02-12 17:24:37 +01:00
ma0068 24682fb559 changeFormat Dates, use different select for MitarbeiterHeader before PV21, adapt condition for multiselect addon 2025-02-12 17:05:18 +01:00
Johann Hoffmann e6edd42737 profil remove console.log, added missing phrase 2025-02-12 14:34:52 +01:00
Johann Hoffmann 60e12e1ab7 dont load any studiengang related infos for mitarbeiter 2025-02-12 14:04:23 +01:00
Harald Bamberger 09aae4c82b Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-12 13:47:24 +01:00
Harald Bamberger d8438b4f4c Merge branch 'master' into merge_FHC4_C4 2025-02-12 13:44:39 +01:00
Johann Hoffmann a9e3a85d99 format gebdatum for profil in sql; fix show telefonnummer in profil; 2025-02-12 13:44:32 +01:00
Johann Hoffmann 8525c82305 set menuEntry href based on link form -> no href on menus without full url, hash links on menus dont trigger routing anymore; news widget check if carousel exists on mounted nextTick; 2025-02-12 11:56:12 +01:00
SimonGschnell bcb88c0cb7 refactor(Calendar Month View): instead of using border when highlighting the current day, uses box-shadow so that the content inside the highlighted day does not shift because of the width of the additional border 2025-02-12 11:11:23 +01:00
ma0068 ca187efce4 bugfix: deleted outputJson returns 2025-02-11 15:58:31 +01:00
Johann Hoffmann bdb312cf56 img parse only after usual procedure failed 2025-02-11 15:16:07 +01:00
Johann Hoffmann 2b27b55f40 attempt sanitizing raum content when content is just h1 + img tag; sanitize tables on raum contents sites 2025-02-11 15:05:22 +01:00
Andreas Österreicher f25a969a6b Merge branch 'feature-33683/digi_anw_core_ss2025' 2025-02-11 13:19:30 +01:00
Johann Hoffmann fe4351fc87 lv info ort content link when content_id was expanded 2025-02-11 11:23:50 +01:00
Johann Hoffmann eabe8ef401 CalendarDate patch schaltjahr 2025-02-11 10:15:22 +01:00
Harald Bamberger 36d3af91f1 Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-11 09:44:38 +01:00
ma0068 ae3072be92 listTables with preview in two layouts 2025-02-11 09:02:56 +01:00
ma0048 df685133b5 - date filter 2025-02-11 08:58:00 +01:00
Johann Hoffmann 4936cfd61c added roomInfo to app routes & remove old views; stundenplan reservierungen for MA working WIP roomInformation/roomContent link from lvinfo event ort_kurzbz; 2025-02-10 17:05:27 +01:00
Johann Hoffmann deea005f5b recommit anw related core changes without wrongfully merged branches tail of feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp 2025-02-10 14:24:15 +01:00
Alexei Karpenko 4ccbdecc48 added phrases for new Beurteilungsformular 2025 2025-02-10 13:37:53 +01:00
ma0048 bc48445304 - infocenter filter fuer electronic onboarding hinzugefuegt 2025-02-10 13:05:44 +01:00
ma0048 83baa0ed8b - fehlende phrase 2025-02-10 12:59:18 +01:00
ma0068 bca95bcb66 change dateFormat Tab Notizen 2025-02-10 11:04:02 +01:00
ma0068 f653c2c054 change dateFormat Tab Mobility 2025-02-07 14:06:48 +01:00
ma0068 72649f4177 change dateFormat Tab Contact 2025-02-07 13:52:17 +01:00
ma0068 5ae9a99de4 change dateformats Tab Status 2025-02-07 13:39:51 +01:00
ma0068 5ec886e815 Tab Abschlusspruefung: return nothing in case of null date 2025-02-07 13:21:58 +01:00
ma0068 21ecbf482f change dateformate Betriebsmittel 2025-02-07 13:16:59 +01:00
Harald Bamberger acc57bbebd fix problem with vanishing factory entries when called via Form.js computed factory 2025-02-07 11:46:02 +01:00
ma0068 3db367b255 bugfix Uhrzeit, datumsformat for tab abschlusspruefung 2025-02-07 09:34:07 +01:00
Harald Bamberger 6ac91dc016 add mustache brackets to phrases in template 2025-02-06 16:26:28 +01:00
Harald Bamberger cb46dff548 fix props declarations 2025-02-06 16:25:41 +01:00
Harald Bamberger 83321ac2ab fix props declarations 2025-02-06 16:25:00 +01:00
Harald Bamberger 4fe801ddf9 fix props declarations 2025-02-06 16:24:34 +01:00
Harald Bamberger a507533f40 use getStudiengangByKz to get stgtyp and stg_oe_kurzbz for checking showallformats permission, add and use phrase notekommpruefung 2025-02-06 16:23:42 +01:00
Harald Bamberger 0cca508881 add Studiengang Endpoint getStudiengangByKz 2025-02-06 16:19:27 +01:00
Johann Hoffmann fc06ffe0e5 fix jumping into march 01 from january 29 2025-02-06 13:18:19 +01:00
Harald Bamberger 3ce803684a change prop type to String since an uid is passed 2025-02-06 11:33:38 +01:00
Harald Bamberger e4e6849351 cleanup duplicate attribute definition 2025-02-06 11:31:25 +01:00
Harald Bamberger 2008fc2a15 remove duplicate attribute definition 2025-02-06 11:26:35 +01:00
Harald Bamberger 422ce28703 use correct phrases category 2025-02-06 11:25:57 +01:00
ma0068 018220594a prepare basic framework 2025-02-06 08:34:34 +01:00
Harald Bamberger 9d0e365516 use tabulator header filters 2025-02-05 18:49:46 +01:00
Harald Bamberger 3fff535713 prevent custom defaultHeaderFilter breaking tristate built-in filter 2025-02-05 18:49:07 +01:00
Harald Bamberger 9745621975 remove duplicate pharse bankverbindung category person 2025-02-05 17:08:20 +01:00
Johann Hoffmann a0ddde4978 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-02-05 17:02:55 +01:00
Johann Hoffmann e901d414a0 lane overlay div up to certain % instead of all day opaque or not; defined hours length and calculating accurate lane width from that; 2025-02-05 17:02:21 +01:00
Harald Bamberger 61ec4ce6c1 Merge branch 'master' into merge_FHC4_C4 2025-02-05 16:58:20 +01:00
Harald Bamberger 4410baf7ac Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-05 16:57:52 +01:00
Harald Bamberger 99c3403009 check against information schema if column exists 2025-02-05 16:55:48 +01:00
Johann Hoffmann b198b6a961 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-02-05 16:05:04 +01:00
Johann Hoffmann b8823052f5 deactivate old month page css for day number and events in favor of new computed style (can be redesigned but is being handled in js instead of css class); save & inject/provide observed resize from already existing ResizeObserver to be able to access concrete container width/height values we already had all the time anyway; added some comment to 2year old TODO concerning calendar breakpoints; check if navbar is showing before toggling programmatically; remove some unused code; week time line spawns in dayLane which is representing today to avoid caluclating left/right offsets -> WIP accurately retrieving lane width somehow else, currently approximated; 2025-02-05 16:03:20 +01:00
Andreas Österreicher 40d2a657c6 Merge branch 'feature-28394/zeiterfassung_50_tage_ansicht_als_vorgesetzter_fuer_mitarbeiter' 2025-02-05 14:07:44 +01:00
SimonGschnell 7c8508da0e update(Infoterminal authentification): adds a query parameter to the infoterminal view that enables authentification 2025-02-05 12:50:23 +01:00
Harald Bamberger d038119a3b adapt infoterminal page so that login can be forced 2025-02-05 11:41:02 +01:00
SimonGschnell d889756302 update(Calendar exports): viewdata update 2025-02-05 11:03:19 +01:00
SimonGschnell 9ec57b6ce7 update(calendar exports): adds icons to the calendar exports buttons 2025-02-05 09:26:00 +01:00
Johann Hoffmann d70cd58698 past shadow on day page if it is today; current time line on day & week page; mobile checkup; close lvInfoModal on stundenplan unmount; 2025-02-04 18:04:41 +01:00
Andreas Österreicher a1841a0071 Merge branch 'Monika70-AnzahlStudenten' 2025-02-04 17:05:17 +01:00
Andreas Österreicher 1436d12a53 Added Default Config NICHT_ZUGELASSENE 2025-02-04 17:03:19 +01:00
Andreas Österreicher b177420cb1 Merge branch 'AnzahlStudenten' of https://github.com/Monika70/FHC-Core into Monika70-AnzahlStudenten 2025-02-04 16:56:44 +01:00
Andreas Österreicher faeb0fbf4b Merge branch 'master' of github.com:FH-Complete/FHC-Core 2025-02-04 16:48:27 +01:00
Andreas Österreicher 749c147f8e Phrase für Unruly angepasst 2025-02-04 16:48:01 +01:00
ma0068 6eb9c2ac22 update filtering 2025-02-04 14:57:35 +01:00
ma0068 7fbff20dd9 new Tab Gruppen 2025-02-04 14:49:41 +01:00
SimonGschnell 9082c3cb8c feature(Calendar Exports): uses the old enpoints to export excel,csv,ical1,ical2 documents 2025-02-04 14:37:34 +01:00
SimonGschnell cc5a14ea02 update(Sprachen.js): switches colors for the currently active sprache 2025-02-04 14:37:34 +01:00
ma0048 c56c71a508 - fixed bug 2025-02-04 12:05:15 +01:00
ma0048 50fa3d6f94 - faktor in eigener spalte 2025-02-04 10:42:59 +01:00
Harald Bamberger 03c192cbbf Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-03 16:58:45 +01:00
Harald Bamberger b10ee208ff pad only in y direction 2025-02-03 16:58:25 +01:00
Harald Bamberger 63239b3fb6 Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-02-03 16:14:23 +01:00
Harald Bamberger 1a0601ebc0 Merge branch 'feature-54856/FHC4_Studierendenverwaltung_In_Out' into merge_FHC4_C4 2025-02-03 16:06:06 +01:00
Harald Bamberger 5843d1d58e Merge branch 'master' into merge_FHC4_C4 2025-02-03 15:53:55 +01:00
kindlm 0059bc11f3 Merge remote-tracking branch 'origin/master' 2025-02-03 10:42:06 +01:00
kindlm fbd02e02f1 Rufzeichen bei Phrase entfernt 2025-02-03 10:41:41 +01:00
Cristina ac98420130 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-02-03 10:39:45 +01:00
Johann Hoffmann 11ad8ae1c8 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-01-31 14:10:26 +01:00
Johann Hoffmann c1918726df Stundenplan Week Page smaller breakpoints style handling; searchbar emit action finished on default link click; month stundenplan past days use opacity-50 class; Day page height fix of right col; 2025-01-31 14:09:05 +01:00
ma0068 dbd7adc96c adapt inline form validations, edit validation in final exam tab 2025-01-31 12:55:34 +01:00
SimonGschnell 0892b94c93 update(legacyLinkHelper): fixes little regex bugs 2025-01-31 12:08:40 +01:00
ma0068 ec46dbd10d Validation during delete for extension mobility, add field lehreinheit to dropdown and backend 2025-01-30 14:56:48 +01:00
Andreas Österreicher ecbc1c8d09 Merge branch 'sonstiges-55231/bfi-anrechnung-infobox-ausblenden' 2025-01-30 14:56:24 +01:00
Andreas Österreicher 07194cfaff - Index für lehre.tbl_anrechnungen hinzugefügt um Ladezeiten zu verbessern
- Bugfix fuer Detailseite der Lehrenden
2025-01-30 14:54:16 +01:00
Cristina 3eb1f7b06b Added array 'display_infobox' to config file anrechnung.php and adapted code to display only if set to true 2025-01-30 12:08:28 +01:00
ma0068 304433d76f Merge branch 'merge_FHC4_C4' of github.com:FH-Complete/FHC-Core into merge_FHC4_C4 2025-01-30 11:07:17 +01:00
ma0068 7cf0060e40 delete testoutputs 2025-01-30 11:07:03 +01:00
Cristina f2917b9ed7 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-01-30 10:23:56 +01:00
Szabo Mónika 51ba1d3fb9 Update lehrstunde.rdf.php
Studenten mit den in der vilesci.config.inc.php hinterlegten Noten sollten nicht zur AnzahlStudenten im Tempus gezählt werden.
Config Eintrag:
//Studierende mit diesen Noten werden von der AnzahlStudenten im Tempus abgezogen
define('NICHT_ZUGELASSENE',serialize(array(6, 20, NULL)));
2025-01-30 09:35:06 +01:00
ma0048 9cd7caa6ba added missing file 2025-01-30 09:08:53 +01:00
ma0048 42a09ffa9e - lehrform beim faktor hinzugefuegt
- indexes
- delete restrict -> delete cascade bei der faktor tabelle
- neues recht fuer reports -> direktzugriff
2025-01-29 15:21:01 +01:00
SimonGschnell b855c404e4 update(Cis Profil picture): instead of using cover, uses contain for the cis profile picture and adds a black border and background color 2025-01-29 14:33:42 +01:00
SimonGschnell 062e6e5f90 update(Sprachen.js): updates the usage of the classes fhc-entry in the Sprachen.js component 2025-01-29 14:04:36 +01:00
SimonGschnell 10c718b78c update(CalendarDate):changes the stop watcher function 2025-01-29 12:10:16 +01:00
ma0068 06dcad755b Backendvalidation insert and update, validation local tabulator array 2025-01-29 07:38:21 +01:00
Harald Bamberger 5b12e5eea7 Merge branch 'feature-5534/Gehaltsgraph_Valorisierung' 2025-01-28 18:37:18 +01:00
Harald Bamberger e068abd124 rename functions since they manipulate data for using it in a chart 2025-01-28 18:35:25 +01:00
Harald Bamberger d7cbe475bf Merge branch 'master' into feature-5534/Gehaltsgraph_Valorisierung 2025-01-28 17:39:19 +01:00
Harald Bamberger 7f645b363f Merge branch 'master' into merge_FHC4_C4 2025-01-28 16:54:08 +01:00
Harald Bamberger 402691b5cd Merge branch 'feature-53903/PV21_Valorisierungs_akutelle_Liste_ausgeben_ohne_Valorisierungskonfiguration' 2025-01-28 16:40:35 +01:00
Harald Bamberger 6a2a4c22b3 Merge branch 'master' into feature-53903/PV21_Valorisierungs_akutelle_Liste_ausgeben_ohne_Valorisierungskonfiguration 2025-01-28 16:14:39 +01:00
Paolo 0426e3498f Hotfix: replaced the dead github repository from https://github.com/tomazdragar/SimpleCropper.git to https://github.com/deveshsinghal22/SimpleCropper.git 2025-01-28 15:45:40 +01:00
Cristina 9a53880b9d Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2025-01-28 13:58:58 +01:00
Cristina 9a4211c980 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-01-28 13:58:14 +01:00
ma0068 dacde5f5fd Merge branch 'merge_FHC4_C4' of github.com:FH-Complete/FHC-Core into merge_FHC4_C4 2025-01-28 13:31:44 +01:00
ma0068 d906e9b4a3 edit missing fileextensions 2025-01-28 13:31:24 +01:00
SimonGschnell bd3eeff684 update(Stundenplan Style): changes the background/color styles for Calendar events in the different views 2025-01-28 13:22:57 +01:00
Harald Bamberger ad0fccab6a Merge branch 'master' into merge_FHC4_C4 2025-01-28 13:20:32 +01:00
SimonGschnell 9a3221e88e update(Fhc.js): installs font contrast directive in the global app 2025-01-28 13:13:02 +01:00
Harald Bamberger 4cd1bc3d63 Merge branch 'feature-18073/No-Reply-for-Sanchomails' 2025-01-28 13:05:53 +01:00
SimonGschnell 8991ab86a5 update(fhc-entry css class): instead of hard coding the color the css rules uses the filter:brightness function to highlight or darken elements 2025-01-28 13:04:43 +01:00
Harald Bamberger 4258e60b8b Merge branch 'master' into feature-18073/No-Reply-for-Sanchomails 2025-01-28 13:03:53 +01:00
SimonGschnell 9816521291 directive(text color contrast): adds a directive that determines a suitable font color based on the background color of the element through a directive 2025-01-28 13:01:24 +01:00
Harald Bamberger 7f6744047f check in ci mail config if constants in global config are defined 2025-01-28 11:26:01 +01:00
Harald Bamberger 39c2e44719 sancho default sender konfigurierbar machen 2025-01-28 10:22:30 +01:00
Harald Bamberger a89ca4e143 Merge branch 'feature-53938/StV_Tab_Noten_fertigstellen' into merge_FHC4_C4 2025-01-28 09:49:53 +01:00
ma0068 d96cc5672e child components Zweck/Purpose and Aufenthaltsfoerderung/Support 2025-01-28 09:39:24 +01:00
Harald Bamberger 519aa2f9b2 Merge branch 'feature-25999/C4_cleanup' into merge_FHC4_C4 2025-01-27 18:34:42 +01:00
Harald Bamberger 872f883ce1 Merge branch 'bug-52531/Studierendenverwaltung/Adressenhandling' into merge_FHC4_C4 2025-01-27 18:29:48 +01:00
Harald Bamberger 637a7b1d17 Merge branch 'feature-53936/StudierendenVerwaltung_Studierendenliste_Anzahl_einblenden' into merge_FHC4_C4 2025-01-27 18:20:31 +01:00
Harald Bamberger db70a7869c Merge branch 'feature-54564/FHC-4_Studierendenverwaltung_Abschlusspruefung' into merge_FHC4_C4 2025-01-27 18:17:50 +01:00
Harald Bamberger a60ce78d18 Merge branch 'feature-40280/FHC4_Studierendenverwaltung_Pruefung' into merge_FHC4_C4 2025-01-27 17:39:47 +01:00
Harald Bamberger 2b5d23782b Merge branch 'feature-47784/FHC-4/CleanupTasks' into merge_FHC4_C4 2025-01-27 17:13:15 +01:00
SimonGschnell ec23974129 update(searchbar): makes the searchbar more visible by adding additional border and adding a search icon at the beginning of the searchbar 2025-01-27 15:13:27 +01:00
SimonGschnell e53dae24e6 update(Calendar Locale): updates the locale used by the english language to en-GB instead of en-US 2025-01-27 13:24:47 +01:00
SimonGschnell 8afc2ab433 addition(InfoTerminal): adds the Infoterminal page to the cis4 2025-01-27 11:50:51 +01:00
ma0048 b079d22e8d - filter hinzugefuegt
- db index hinzugefuegt
- sqls optimiert
- diplomand wird nun auch angezeigt
2025-01-27 09:37:02 +01:00
SimonGschnell 467072b94e update(Stundenplan.js): adds event beginn & ende time to the event display in Wochen/Tages Ansicht 2025-01-24 12:17:31 +01:00
SimonGschnell 38a083742d update(MyLv Noten farbe): uses db positiv column to determine the color of the grade in the MyLv component 2025-01-24 11:18:46 +01:00
ma0068 c69910a338 Child component Purpose.js for tableview 2025-01-24 11:00:50 +01:00
Harald Bamberger d6abfbbc23 fix typo 2025-01-23 16:33:03 +01:00
Harald Bamberger 87220e1789 move tbl_valorisierung_* to core since they are used in vertragsbestandteillib and gehaltsbestandteillib 2025-01-23 16:13:47 +01:00
Paolo d2cce86131 - controllers/api/frontend/v1/Filter->applyFilterFields validate filterFields as an array
- FilterCmptLib->applyFilterFields evaluate each elements of filterFields as an array
2025-01-23 15:40:56 +01:00
Harald Bamberger c5d79f750e add parameter withvalorisationhistory to use valorisation history or not 2025-01-23 15:31:17 +01:00
SimonGschnell 9b348aed11 fix(Dashboard News): fixes carousel animations when skipping news 2025-01-23 13:20:57 +01:00
SimonGschnell e7df262cc5 update(News Dashboard): next and previous icons don't stay active after clicking them 2025-01-23 10:41:55 +01:00
Harald Bamberger af79090de0 modify to consider valorisation history, TODO cleanup valorisation tables dependency on FHC-Core-Personalverwaltung Extension 2025-01-22 17:18:22 +01:00
Harald Bamberger 8ce4b452ec use encryption parameters in lamda function and return replacement string 2025-01-22 17:16:47 +01:00
Johann Hoffmann 8133d73cff remove route logging & catchAll fallback 2025-01-22 16:47:14 +01:00
Johann Hoffmann 9350838ebc set menu entry active when clicked 2025-01-22 16:43:37 +01:00
Alexei Karpenko 39ada20277 Electronic Onboarding: added phrases 2025-01-22 15:26:25 +01:00
Johann Hoffmann 10e4032718 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-01-22 15:16:59 +01:00
Johann Hoffmann de8a206f27 delete cms app and move dom magic to respective components; profil vue router integration; profil component reloads with watcher on uid property; profiLUpdateRequest app->comp TODO; deleted profil app; 2025-01-22 15:16:15 +01:00
Harald Bamberger 4c46a5f5c7 modify regex to match optional table alias and ignore column alias equal to column name 2025-01-22 15:09:20 +01:00
SimonGschnell 065f6bdede update(News Dashboard): updates the stylesheet so that the layout of the news is responsive 2025-01-22 13:36:59 +01:00
ma0068 295e2aa3e5 adaptions styling 2025-01-22 11:17:09 +01:00
Johann Hoffmann bb8ebdd465 initial route through router implicit; ci route tag only for debugging purposes. 2025-01-22 10:49:53 +01:00
ma0068 0d0071e8bf refactoring and codesniff 2025-01-22 07:57:39 +01:00
Johann Hoffmann c7f3398b11 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-01-21 16:42:58 +01:00
Johann Hoffmann e9b01b7fa8 vue router merge cms & fhc app; viewData check and fetch in dashboard and widgets if not originating from that php controller; lvinfo app delete; code cleanup profil; WIP profil routing; 2025-01-21 16:42:23 +01:00
ma0068 9c0baeacf2 Add Logic Permission and Phrases 2025-01-21 15:34:43 +01:00
Harald Bamberger 781e2dbd15 Merge branch 'feature-54841/DVs_Abhaengigkeit_zu_SAP_Extension_beseitigen' 2025-01-21 14:29:05 +01:00
SimonGschnell d72bc4fa44 update(News DashboardWidget): updates how to betreff is queried from the XML 2025-01-21 14:20:40 +01:00
Harald Bamberger d9532d7607 Merge branch 'master' into feature-54841/DVs_Abhaengigkeit_zu_SAP_Extension_beseitigen 2025-01-21 13:40:26 +01:00
Werner Masik 1853e44cf3 add valorized data for chart display 2025-01-21 12:58:09 +01:00
SimonGschnell 381b6a75db update(News DashboardWidget): doesn't render news which don't have a topic 2025-01-21 09:40:22 +01:00
Alexei Karpenko e65322965f sancho mail: added config for haeder/footer image path, renamed custom mail config entries to sancho mail config entries, images are always attached inline (when using Code Igniter) 2025-01-20 16:24:56 +01:00
ma0068 ffc99379ae Injection ADDON KU for Multiselect and Print Honorarvertrag 2025-01-20 15:25:06 +01:00
Harald Bamberger 899c36c52c default sancho image comes from global config now 2025-01-20 15:10:52 +01:00
Harald Bamberger 71d1a808f8 Merge branch 'master' into feature-18073/No-Reply-for-Sanchomails 2025-01-20 13:36:17 +01:00
SimonGschnell ff0ee68229 refactor(BookmarkWidget) 2025-01-17 12:47:04 +01:00
Alexei Karpenko 08cb3d3809 electronic onboarding phrase typo fix 2025-01-16 21:02:01 +01:00
ma0048 0d99cc35d4 - phrasen angepasst 2025-01-16 15:59:36 +01:00
Johann Hoffmann 0ec3ba8e69 intercept a tag clicks and attempt vue routing to avoid having to know about vue router configuration; routes include Stundenplan, MyLv; 2025-01-16 15:16:33 +01:00
Andreas Österreicher 1489706027 Merge branch 'Monika70-Export' 2025-01-16 13:22:51 +01:00
Andreas Österreicher 103df5afe5 Merge branch 'Export' of https://github.com/Monika70/FHC-Core into Monika70-Export 2025-01-16 13:21:14 +01:00
Andreas Österreicher ba2b41f63a Merge branch 'feature-55289/pep_fine_tuning' 2025-01-16 13:12:26 +01:00
SimonGschnell 4b2a1cd7f6 update(Url.js): adds scrolling behavior to the Bookmark widget 2025-01-16 11:32:19 +01:00
SimonGschnell 46c033ad77 update(NewsWidget):reduces z-index so that it does not overlap modals, add light background to the next/prev buttons for visibility 2025-01-16 11:10:03 +01:00
SimonGschnell aef0e34b93 update(Calendar/Header.js):icon reihenfolge sowie icon fuer Tagesansicht wurden angepasst 2025-01-16 10:41:21 +01:00
ma0048 f381ef229e - index tbl_lehrveranstaltung_faktor_lvid hinzugefuegt
- sortierung gleichgezogen
2025-01-16 10:38:01 +01:00
Alexei Karpenko ece4f4a8b5 sancho mails: enabled removing of header/footer and custom header/footer images in code igniter code, legacy code: global ids for images are created only if config is set 2025-01-15 16:52:11 +01:00
SimonGschnell 09b2615d82 update(FhcAlert.js): if the request was aborted, no error message is shown to the user 2025-01-15 14:42:13 +01:00
Szabo Mónika f1234c0b99 Update studentenexportextended.xls.php
Zusätzliche Spalte Person_id hinzufügen
2025-01-15 14:37:06 +01:00
SimonGschnell 7b46db7100 update(LegacyLinkReplaceHelper.js):adds constants for the replacement strategies when the pattern has groups that should be added as path_segements or query_parameters 2025-01-15 14:15:03 +01:00
Johann Hoffmann f60f735fa8 FhcApp uses vueRouter4; CisApp checks for global router instance and routes internally as long as a path/routename/component setup is defined, if that is not the case use the provided href link; WIP moving apps like Profil, MyLv etc into components to be navigated by FhcApp; 2025-01-15 14:10:08 +01:00
ma0068 35d8f0524d new page vertragsverwaltung with employee header and details components 2025-01-15 13:56:00 +01:00
Harald Bamberger fd67974d55 fix typo 2025-01-15 13:35:58 +01:00
SimonGschnell bae7b330f8 feature(LegacyLinkReplacementHelper.js): adds a helper file with multiple functions that replace relative or absolute legacy links with new links that use the new app_root and ci_router 2025-01-15 13:34:54 +01:00
Harald Bamberger a1a9e96bc0 permission basis/gehaelter 2025-01-15 13:34:16 +01:00
Andreas Österreicher aab0f339ab Merge branch 'feature-55316/international_skills_credits_entfernen_neue_massnahmen' 2025-01-15 13:06:04 +01:00
SimonGschnell cf57fe5086 replaces the old relative paths inside the content html with absolute paths that use the new app_root path 2025-01-15 09:45:03 +01:00
Harald Bamberger d4bb06c4f6 Merge branch 'feature-54920/DB_Model_encrypted_columns_spaltenname_enthaelt_anderen_spaltennamen' 2025-01-15 09:20:54 +01:00
Harald Bamberger 0770ec2bd8 Merge branch 'master' into feature-54920/DB_Model_encrypted_columns_spaltenname_enthaelt_anderen_spaltennamen 2025-01-15 09:03:41 +01:00
Alexei Karpenko 13d86edcfc sancho mails: added CUSTOM_MAIL_USE_IMAGES config for sending mails without header/footer, removed option to hide mail html 2025-01-14 17:24:40 +01:00
SimonGschnell 516554c1e3 update(CalendarDate.js): uses phrasen.user_locale for calculations and watches for changes on the user_locale 2025-01-14 11:43:50 +01:00
ma0048 50aca4a545 - umbenennung auf internatinal credits 2025-01-14 11:00:26 +01:00
Johann Hoffmann cf32974652 fhc chart just accepts chartOptions to maximize highcharts usability; statsComponent multiselect ux improvement; 2025-01-13 17:36:09 +01:00
Alexei Karpenko 6c858141fd deleted mailtest file 2025-01-13 16:22:45 +01:00
SimonGschnell 907107d78d update(searchbar.js): adds the search text to the sessionStorage and the searchOption to the localStorage 2025-01-13 14:45:41 +01:00
SimonGschnell 16097edfca refactor(CalendarDate.js): sets the locale for every new instance of CalendarDate that gets created in the CalendarDate.js class 2025-01-13 09:41:58 +01:00
SimonGschnell 05cbe495fe fix(Calendar Weeks View): updates the number of weeks in the weeks View when going to the next or previous year 2025-01-13 09:29:54 +01:00
Alexei Karpenko 6b169d4183 sancho mail: configuration of header/footer and sender is possible 2025-01-11 15:43:30 +01:00
SimonGschnell 14d4e103a3 update(Calendar Tages Ansicht): doesn't how the hour indicator if there are no events that day 2025-01-10 13:50:47 +01:00
SimonGschnell 478588aef0 fix(Calendar Date Issues):fixes a variety of user_locale calendar bugs 2025-01-10 13:46:24 +01:00
ma0068 03ad3116f7 temp formular 2025-01-10 07:16:56 +01:00
SimonGschnell d9375e2c8b comment(CalendarDate.js): adds comments to the functions: firstDayOfCalendarMonth, lastDayOfCalendarMonth, firstDayOfWeek, lastDayOfWeek 2025-01-09 15:04:56 +01:00
Johann Hoffmann 848d50ec93 Graph has reactive state over several types; WIP seperating data UI from graph component 2025-01-09 14:35:17 +01:00
Johann Hoffmann 036aeb5215 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2025-01-08 16:13:50 +01:00
Johann Hoffmann 2fdca1f09f WIP stats Tab in anw extension & FhcChart component in fhcore; 2025-01-08 16:12:30 +01:00
Alexei Karpenko 115b35ad7b electronic onboarding: changed phrase for error display 2025-01-08 14:52:32 +01:00
SimonGschnell b20965fcff refactor(CalendarDate.js): adds comments and restructures some conditionals 2025-01-08 13:31:38 +01:00
SimonGschnell 50f55eed1a Merge remote-tracking branch 'origin/bhdev' into feature-25999/C4_cleanup 2025-01-08 11:20:33 +01:00
SimonGschnell a67cc8cc4e Merge branch 'master' into feature-25999/C4_cleanup 2025-01-08 11:17:29 +01:00
SimonGschnell 26348bed80 update(FHC_JS_DATA_STORAGE_OBJECT/Sprachen.js): adds server_languages and their locale to FHC_JS_DATA_STORAGE_OBJECT and updates Sprachen.js accordingly 2025-01-08 11:15:55 +01:00
Harald Bamberger e432501a1f possible fix for kw 1 issue 2025-01-07 17:09:07 +01:00
SimonGschnell 6361d40356 update(WeekCalendarHeader):uses the last day of the week instead of the first day of the week for the calendar title 2025-01-07 15:26:08 +01:00
Harald Bamberger 46914e8a65 bugfix wenn mehrere karenzen im abgefragten zeitraum vorhanden sind 2025-01-07 14:38:08 +01:00
SimonGschnell c7ee2934a7 fix(Stg 0 not found bug): displays the LV in the lvMenu differently if the stg_kurzbz is 0, which is the case for lv's that are organisational 2025-01-07 11:17:29 +01:00
SimonGschnell 5a45b29bcd comment(Profil Quick links): comments the quick links of the profil views away because there is no idea of implementation yet 2025-01-07 09:10:41 +01:00
cgfhtw b43df5aea0 NotenTab: Phrases 2024-12-27 14:44:53 +01:00
Alexei Karpenko 0a97b39efb added phrases for electronic onboarding verification page 2024-12-24 19:14:04 +01:00
SimonGschnell 574301d9e2 fix(Calendar Language): also update the tooltips of the calendar by using the client lannguage 2024-12-20 15:03:05 +01:00
cgfhtw 469c01c9e6 Comments 2024-12-20 14:15:28 +01:00
cgfhtw e13e612ad9 Merge branch 'master' into feature-53938/StV_Tab_Noten_fertigstellen 2024-12-19 16:48:15 +01:00
cgfhtw 174816e652 Cleanup & existing phrases 2024-12-19 16:42:02 +01:00
cgfhtw d899bf3393 NotenTab: Document download/archive 2024-12-19 16:20:14 +01:00
cgfhtw 14eb27ae24 add PrimeVue TieredMenu 2024-12-19 16:19:46 +01:00
cgfhtw de9e3d079c Endpoints for document download/archive (content/pdfExport.php with "archivdokument" not set) 2024-12-19 16:18:51 +01:00
Johann Hoffmann 551fd3a860 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-12-19 16:08:25 +01:00
Johann Hoffmann 64ff94882b stats enabled config flag; using highcharts plugin in new Tab & Component for (anw)Statistics; currently able to show old pie charts from old landing page; wip building setup UI for configurable graphs depending datasets and chart types; 2024-12-19 16:07:56 +01:00
ma0068 c980dee96b edit select 2024-12-19 15:25:21 +01:00
SimonGschnell 114562909f update(Calendar.js): uses the user_language for the different day formattings in the calendar views 2024-12-19 12:12:13 +01:00
Johann Hoffmann e2af00e41d highcharts consolidation -> add plugin, import switch to footer and repository requirement in composer.json 2024-12-19 11:24:31 +01:00
ma0068 39a23693ba start Table Mobility 2024-12-18 16:31:39 +01:00
ma0068 ba62abc19b bug stv 2024-12-18 14:57:18 +01:00
ma0048 8bc1aec764 - info mail auch senden, wenn in niedriger Prio bereits student ist 2024-12-18 14:46:26 +01:00
SimonGschnell 1094219a58 helper(Json.js):adds new helper component to display JSON data in the template, that can be used globally inside a vuejs app 2024-12-18 14:26:45 +01:00
SimonGschnell 313a6a6030 fix(Profil Views): corrects the title of the web tab from Stundenplan to Profil 2024-12-18 13:47:52 +01:00
ma0068 faa705408d Merge master into feature-54564/FHC-4_Studierendenverwaltung_Abschlusspruefung 2024-12-18 13:12:57 +01:00
ma0068 9f5b3b6f32 Print Functionality and Phrases 2024-12-18 12:56:51 +01:00
cgfhtw e1327453f7 DocumentExportLib: CI version of dokument_export.class 2024-12-18 09:43:16 +01:00
cgfhtw 636a331ca6 add Vorlagestudiengang_model->getCurrent similar to vorlage.class->getAktuelleVorlage 2024-12-17 14:29:37 +01:00
SimonGschnell e3f91003b3 phrasen(Profil.js): adds dynamic phrasen for the various Profil Views 2024-12-17 11:29:05 +01:00
SimonGschnell d247150fd6 phrasen(StudiengangInformationen.js): adds Phrasen to the StudiengangInformationen Component and all its subcomponents 2024-12-17 10:55:13 +01:00
cgfhtw b78382f1ba Add extra fields/joins to getZeugnisnoten 2024-12-17 09:27:18 +01:00
Andreas Österreicher a802e67faf Merge branch 'pep_deploy' 2024-12-16 13:57:15 +01:00
Andreas Österreicher 2c91756a36 Added missing APP PEP to checksystem 2024-12-16 13:29:55 +01:00
Johann Hoffmann 25dbee7266 removed app instance hacks, content component watches route.param.content_id and reloads accordingly; changed template to <router-view/> for cms pages; 2024-12-16 11:46:38 +01:00
Johann Hoffmann 0509137ad8 Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_CMS_content_router
# Conflicts:
#	public/js/apps/Cis/Cms.js
#	public/js/components/Cis/Cms/Content.js
2024-12-16 10:38:22 +01:00
SimonGschnell b4cd5055d2 delete(Contentl.js/Debugging prints) 2024-12-13 14:48:48 +01:00
SimonGschnell cb6fca9a2e update(Cms.js/News.js/PhrasenPlugin): removes the reload option, because the content can be newly fetched based on the currently active language 2024-12-13 14:41:07 +01:00
SimonGschnell 701f44c767 update(Cis4-Menu/Sprache): changes language of the Menu when switching language of the application 2024-12-13 14:40:01 +01:00
Harald Bamberger 0d2882d8aa Merge branch 'feature-25999/SearchbarStudent' 2024-12-13 12:11:12 +01:00
Harald Bamberger f62108f1d4 change concatenation of verband, use contact email in Stv search result, use dummy image when viewing anothers profile and foto is null or foto_sperre is not false 2024-12-13 12:09:16 +01:00
Johann Hoffmann 986b6934d6 Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_CMS_content_router
# Conflicts:
#	public/js/components/Cis/Cms/News.js
2024-12-13 12:04:38 +01:00
Johann Hoffmann 499e3077e2 Merge branch 'master' into feature-25999/C4_CMS_content_router 2024-12-13 12:00:50 +01:00
Johann Hoffmann 98d4a08836 navigating to another content_id link from cms app reloads the content instead of entire page; WIP implementing abstract reload functionality for all content types; 2024-12-13 11:52:34 +01:00
ma0048 746f8ab35a Merge branch 'feature-54822/filtercomponent_custom_headerfilter' into pep_deploy 2024-12-13 11:51:11 +01:00
ma0048 70b44c2202 Merge branch 'feature-40717/pep_faktor' into pep_deploy
# Conflicts:
#	public/js/components/filter/Filter.js
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2024-12-13 11:50:53 +01:00
ma0048 c0d2474ad2 -dbupdate gegencheck eingebaut
- delete restrict auf cascade geändert
2024-12-13 11:42:00 +01:00
Harald Bamberger 5a174e554a use studentStv in Studentenverwaltung config, add aktiv to student and studentStv result, use studentStv in searchbar component, add searchbar_inaktiv css class, use aktiv to render inactive studentStv results with css class searchbar_inaktiv 2024-12-13 11:25:02 +01:00
ma0048 3451741327 - ON DELETE RESTRICT auf ON DELETE CASCADE bei bei den notizen
- sql angepast
2024-12-13 11:03:46 +01:00
SimonGschnell a3840d4c77 update(Searchbar/Student):shows dummy image if the student has foto_spere true 2024-12-13 10:47:34 +01:00
SimonGschnell 9a1777d1aa fix(_student searchfunction):fixes the sql logic for non active students 2024-12-12 15:35:56 +01:00
Harald Bamberger 4a86a48969 Merge branch 'master' into feature-25999/SearchbarStudent 2024-12-12 15:27:08 +01:00
Andreas Österreicher 1f01c55d71 LVPlan Feedback Link auf Startseite entfernt 2024-12-12 15:06:02 +01:00
Harald Bamberger 80222b7186 Merge branch 'master' into feature-25999/SearchbarStudent 2024-12-12 14:55:41 +01:00
Harald Bamberger d0266e7ef0 add vuejs3_dev to composer.json and ci javascript config file to switch between vuejs dev and prod version, alter FHC-Footer to use new config 2024-12-12 14:49:15 +01:00
SimonGschnell 8f07bd6b4d update(Sprachen.js): shows the sprachen in the component always using their bezeichnung 2024-12-12 14:46:32 +01:00
Harald Bamberger 3039fd2a1e Merge branch 'master' into feature-25999/SearchbarStudent 2024-12-12 13:57:03 +01:00
SimonGschnell 7bd9129056 fix(LvMenu/Lv.js): removes the list-item styling from the spinner when the data for the lvMenu is not yet ready and aligns the spinner in the center of the card 2024-12-12 13:47:15 +01:00
SimonGschnell 24ff474cad update(MyLv/Lv.js):the user can only click on the grade of an lv if the lv had multiple pruefungen otherwise the grade is not clickable 2024-12-12 13:31:06 +01:00
ma0048 5b3ffcfc9a - faktor berechtigung angepasst 2024-12-12 12:37:24 +01:00
SimonGschnell 4321a2325b update(StudiengangInformation.js): adds the general moodle link for the Studiengang informations to the component using a static link 2024-12-12 11:35:16 +01:00
Andreas Österreicher 03d8205722 Merge branch 'feature-46905/LV_plan_feedback_Link_aendern' 2024-12-12 11:30:00 +01:00
SimonGschnell 1d5f13c5ce Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-12-12 09:52:27 +01:00
SimonGschnell df8d4de50b fix(SearchbarLib/_student): the cis search does not include students that are not aktiv and has a seperate search function for the student search for the Cis and the studentverwaltung 2024-12-12 09:42:38 +01:00
Harald Bamberger 9af3f1ec0f Merge branch 'feature-25999/LvMenuFix' 2024-12-11 17:50:03 +01:00
Johann Hoffmann 82e7783259 stundenplan day layout fixed for scroll behaviour; max-height for stundenplan events to avoid escalating the grid width; 2024-12-11 16:59:35 +01:00
SimonGschnell 85d59f18be refactor(searchbar/Student): studiengang/verband/email are queried for the display in the searchbar component 2024-12-11 15:30:41 +01:00
ma0048 6a1e518da1 - defaultheaderfilter function in eigenes file verschoben 2024-12-11 13:44:19 +01:00
ma0048 8127091e2e - tags werden im fas nicht angezeigt
- class für tags hinzugefuegt
- prop confirmLimit hinzugefuegt
2024-12-11 13:25:38 +01:00
SimonGschnell e215e9e948 refactor(News-Paginator@Bottom):also adds the pagination at the bottom of the news, so that the user doesn't have to scroll up if he reaches the end 2024-12-11 12:44:06 +01:00
SimonGschnell a357001648 feature(Searchbar/StudentenSuche): adds student to the searchbar options and adds shadow to the searchbar 2024-12-11 12:34:58 +01:00
Harald Bamberger bfc6e86f05 Merge branch 'master' into feature-54920/DB_Model_encrypted_columns_spaltenname_enthaelt_anderen_spaltennamen 2024-12-11 11:54:23 +01:00
Harald Bamberger 3c8bb37a36 Merge branch 'master' into feature-54920/DB_Model_encrypted_columns_spaltenname_enthaelt_anderen_spaltennamen 2024-12-11 11:52:50 +01:00
SimonGschnell 2567db7725 fix(LvMenu.js): fixes layout of MenuPunkt if multiple moodle links are available 2024-12-11 11:28:40 +01:00
Johann Hoffmann fcbb9e43a4 Merge branch 'master' into feature-25999/C4_cleanup 2024-12-11 11:08:49 +01:00
Andreas Österreicher 034e1397e8 Merge branch 'feature-52814/infocenter_infocentermitarbeiter_spalte_beim_loeschen_des_dokuments' 2024-12-11 08:36:27 +01:00
Andreas Österreicher 35ded7950f Merge branch 'feature-46974/neuer_filter_ueber_ueberfaellige_buchungen' 2024-12-11 08:00:54 +01:00
Andreas Österreicher a6a74cd1e0 Merge branch 'feature-40413/testtool_sperren_bei_namen_mit_hochkomma' 2024-12-11 07:52:27 +01:00
Andreas Österreicher bae48fa175 Merge branch 'master' into feature-40413/testtool_sperren_bei_namen_mit_hochkomma 2024-12-11 07:13:20 +01:00
Andreas Österreicher 94f4761163 Merge branch 'bug-54917/Gruppenmanagement_Berechtigung' 2024-12-11 07:07:44 +01:00
Alexei Karpenko cc99d2b378 Gruppenmanagement: added checks so only Gruppenmanager can edit groups 2024-12-10 12:03:58 +01:00
Johann Hoffmann 53de29f3d2 stundeplan_model byLva() query when providing lv_id irrespective of student, group, lector etc just fetch all & show them 2024-12-09 17:13:23 +01:00
Johann Hoffmann e9d02c41ff merge fix; 2024-12-09 15:42:08 +01:00
Johann Hoffmann 04583d0cf2 Merge branch 'feature-25999/C4_anwesenheiten_widget' into feature-25999/C4_cleanup
# Conflicts:
#	public/js/components/Cis/Cms/News.js
#	public/js/components/DashboardWidget/News.js
#	public/js/plugin/FhcApi.js
2024-12-09 15:37:20 +01:00
Johann Hoffmann cbdd6bc954 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-12-09 14:32:35 +01:00
Johann Hoffmann a1045586fe use carousel instance .to(index) & computed classes to retrieve order; 2024-12-09 14:30:33 +01:00
SimonGschnell e9d2234353 feature(Studiengang Widget):creates a component for the Studiengang Widget that reuses the StudiengangInformation component 2024-12-09 13:36:18 +01:00
Alexei Karpenko ce2d69fc82 Vertragsbestandteil Model: check if sap sync table present before executing select for sap organisationseinheit 2024-12-06 13:05:35 +01:00
Johann Hoffmann 9fd0f43d3b news widget prev/next button hover styles; mobile responsive menu & gutter layout fix; 2024-12-06 13:04:28 +01:00
Andreas Österreicher 07ee3e1f4e Import der Leistungsstipendien angepasst. Neue Spaltenreihenfolge, Keine
automatische Gegenbuchung, Import der Bankdaten
2024-12-06 12:50:58 +01:00
SimonGschnell 39ffd6bdb9 fix(news Widget api): readds the removed api call from the news widget because it differs from the getNews api call that is used in the News View 2024-12-06 09:59:58 +01:00
SimonGschnell 0a5c335602 refactor(News-StudiengangInformationen): component clean up and refactors vertretungen into own component 2024-12-05 16:22:21 +01:00
cgfhtw 6fdad1b664 Noten Tab: delete 2024-12-05 16:19:51 +01:00
cgfhtw 3969ebfa01 Filter Component: better btn width/height css 2024-12-05 15:26:38 +01:00
SimonGschnell 797e52aad7 refactor(News-StudiengangInformationen): adds the Studiengangs informationen next to the news View 2024-12-05 15:22:53 +01:00
cgfhtw 5fd14949fa Tabulator Default Layout: fitDataStretchFrozen 2024-12-05 15:13:58 +01:00
cgfhtw 482f6b9a19 FhcAlert Color Bugfix 2024-12-05 15:08:31 +01:00
Johann Hoffmann 7f6884b67d primevue imports cis/dashboard; Anw widget implementation; WIP showing single anw entries on click on a quota progress bar in widget; 2024-12-05 15:03:46 +01:00
Johann Hoffmann f0e97c915b rename bindKeys() to addEndpoints(); removed Vue.reactive on $fhcApi; check if Api has been instantiated in install, only addEndpoints if that is the case; 2024-12-05 13:53:08 +01:00
SimonGschnell ecbb65c2a4 feature(News-StudiengangsInformationen): adds the Studiengangsinformationen next to the news view 2024-12-04 15:04:05 +01:00
Johann Hoffmann f7bc01e63f actually provide root to bindKeys() in FhcApiFactoryWrapper constructor 2024-12-04 13:53:59 +01:00
Johann Hoffmann 65c154054d actually provide root to bindKeys() in FhcApiFactoryWrapper constructor 2024-12-04 13:52:17 +01:00
Johann Hoffmann 27cd9dca6b Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_anwesenheiten_widget 2024-12-04 13:49:32 +01:00
Johann Hoffmann 00fba24936 fhcApi.factory.bindKeys to extend api later on from extensions 2024-12-04 13:48:28 +01:00
Harald Bamberger 57cba02559 Merge branch 'master' into feature-25999/C4_cleanup 2024-12-04 13:35:59 +01:00
Harald Bamberger 3cea79cb28 Merge branch 'feature-25999/C4_cleanup_rc' 2024-12-04 12:44:08 +01:00
Harald Bamberger e159dc44dc Merge branch 'master' into feature-25999/C4_cleanup_rc 2024-12-04 12:43:06 +01:00
Andreas Österreicher 055cea2002 Termin3 entfernt aus Default Checksystem 2024-12-04 11:25:49 +01:00
SimonGschnell a3dc5aec93 feature(StudiengangInformations componente): creates a Vue component for the StudiengangsInformationen that were displayed next to the news 2024-12-04 11:20:52 +01:00
Harald Bamberger f105bdb36a revert FhcApi.js to current master 2024-12-04 11:09:37 +01:00
Harald Bamberger af3334f227 Merge branch 'feature-25999/C4_cleanup_rc' into feature-25999/C4_cleanup 2024-12-04 09:29:29 +01:00
Harald Bamberger 1b445005af remove addMeta debug info 2024-12-04 09:28:59 +01:00
Harald Bamberger 16e7ee8aba Merge branch 'feature-25999/C4_cleanup_rc' into feature-25999/C4_cleanup 2024-12-04 09:17:57 +01:00
Harald Bamberger 2fee03ebcc remove sprachen menu from main nav 2024-12-04 09:17:15 +01:00
Harald Bamberger d30ba24d2f add config cis_send_profil_update_mails, use it in profil update controllers 2024-12-04 09:15:44 +01:00
ma0068 7cff70e88d update search Mitarbeiter, form 2024-12-04 08:34:36 +01:00
ma0048 631010821b - check bei projectstunden ob stunden eingetragen sind 2024-12-03 17:08:03 +01:00
ma0048 b34a7bfabc - custom filter tabulator 2024-12-03 16:13:48 +01:00
ma0048 6a1af1b2dd - fuer lehre tab planungsstatus hinzugefuegt
- config fuer planungsstatus
- tags ohne notiz setzen
2024-12-03 15:31:32 +01:00
Johann Hoffmann fe6f229d9f template fix; remove unused menu function; 2024-12-03 14:44:18 +01:00
Harald Bamberger 6f69046b71 use regex with word boundaries to be more specific when replacing 2024-12-03 13:44:24 +01:00
ma0048 19b56ff252 - tags
- phrases
- stundensatzbydatum
- filter nur count
2024-12-03 12:36:54 +01:00
cgfhtw 446a5732d2 NotenTab: Use Points 2024-12-03 09:27:38 +01:00
Harald Bamberger af2f3348b4 Merge branch 'master' into feature-25999/C4_cleanup 2024-12-03 07:37:22 +01:00
Johann Hoffmann 41ad440cd4 update newsWidget template & css, fixed carousel css transition; 2024-12-02 16:41:42 +01:00
ma0048 1a1ed49f8b - styling für neuen tag
- hover effekt
- tagicon statt plus
2024-12-02 13:09:38 +01:00
Cris 2ae9e4fffa Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2024-12-02 11:02:43 +01:00
Cris d67e240b06 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-12-02 11:01:45 +01:00
Johann Hoffmann bf5e8e9c0e Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_anwesenheiten_widget 2024-12-02 10:57:40 +01:00
Andreas Österreicher e63234e7bc Gegencheck und Anwesenheit App eingefügt 2024-12-02 10:09:09 +01:00
ma0068 00d64f2c97 bugfix index Favorites 2024-12-02 08:54:35 +01:00
ma0068 ae58cef816 Merge master 2024-12-02 08:43:13 +01:00
Johann Hoffmann 1ca0f35d29 news widget template carousel with menu update; 2024-11-29 15:24:33 +01:00
SimonGschnell 1336860ecd feature(Dashboard Transitions): uses Vue's built-in Transition component to add transitions to the widget config elements 2024-11-29 13:23:51 +01:00
Harald Bamberger 278e5d8abd Merge branch 'master' into feature-25999/C4_cleanup 2024-11-29 13:04:08 +01:00
Harald Bamberger 90ae50ac59 Merge branch 'master' into feature-47784/FHC-4/CleanupTasks 2024-11-29 12:48:38 +01:00
SimonGschnell 95e59007cc refactor(Settings/NavUser Collapsibles): closes the collapsibles if the user clicks outside of the elements 2024-11-29 12:29:59 +01:00
SimonGschnell 857d4d7282 refactor(Calendar indicator):adds Vue transition to the Calendar indicator through Vue's built-in component 2024-11-29 11:50:27 +01:00
Harald Bamberger 7a7c91b67b readd lines of code that were lost during merging 2024-11-29 11:19:57 +01:00
SimonGschnell 9cf6036926 refactor(Paginatino.js): makes the pagionation component responsive on mobile displays 2024-11-29 10:57:14 +01:00
cgfhtw cf6cc97475 Noten Tab: header/inline edit 2024-11-29 08:42:36 +01:00
ma0068 bf6b6e4563 actions insert, update, delete, link Pruefungsprotokoll 2024-11-28 16:29:13 +01:00
Andreas Österreicher 11eae29dab Merge branch 'feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp' 2024-11-28 14:04:50 +01:00
Andreas Österreicher 0f476b4e46 Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp 2024-11-28 14:02:41 +01:00
Andreas Österreicher 677d6e97d6 Config zur Steuerung für welche Studiengaenge die Digit. Anwesenheiten
sichtbar sein sollen (Testbetrieb)
2024-11-28 13:38:25 +01:00
SimonGschnell 021a140dd3 refactor(LvInfo.js): also adds a Profil View link to the lektor name 2024-11-28 13:09:41 +01:00
SimonGschnell 4f8ca679fb fix(Calendar/Week/Day/Page.js): removes the calendar indicator when moving the mouse outside of the calendar 2024-11-28 12:52:24 +01:00
SimonGschnell 9dfa8d13a6 feature(Mylv/Info.js): adds Profil view links to the Lektoren in MyLv Info and fixes the dupplicate lektoren names 2024-11-28 12:46:23 +01:00
SimonGschnell 71c39edd66 fix(Cis/Sprachen.js): fixes classes of the Sprachen component inside of the Nav Menu when toggled 2024-11-28 10:53:00 +01:00
Johann Hoffmann 1346466f79 Merge branch 'master' into feature-25999/C4_anwesenheiten_widget 2024-11-28 10:43:57 +01:00
Johann Hoffmann beb40cfcc9 Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_anwesenheiten_widget 2024-11-28 10:22:57 +01:00
Andreas Österreicher 0a4d8bb1f6 Falsch verschachtelte Phrase korrigiert 2024-11-28 08:43:25 +01:00
ma0068 9024b43f62 Merge master into feature-47784/Cleanup Tasks FHC4 2024-11-28 07:26:59 +01:00
ma0068 e8ded1f59f prepare branch before merge phrases 2024-11-28 07:14:15 +01:00
Cris b549622f50 Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite
# Conflicts:
#	application/models/organisation/Studiensemester_model.php
#	system/phrasesupdate.php
2024-11-27 17:44:45 +01:00
Cris b2477bb603 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-11-27 17:32:27 +01:00
Cris 3ec748e6fb Added new phrases for Softwarebereitstellung 2024-11-27 17:31:48 +01:00
Cris c94a2d2d0c Added param lehrveranstaltung_id to getTemplateLvTree method in Lehrveranstaltung_model.php and enhanced order
Now ordering extra templates to appear first and directly after the assigned lvs
2024-11-27 17:31:02 +01:00
Cris 1159b0dad5 Refactored getLvs method in Lehrveranstaltung_model.php 2024-11-27 17:28:54 +01:00
Johann Hoffmann 39f1f825a5 fhcApi extendable & reactive; provide reactive viewdata from dashboard to widgets by inject/provide reworked news xslt in db; css change since overflow-auto is in xslt now; WIP anw widget; 2024-11-27 16:30:54 +01:00
ma0068 f398a5699f merge into feature-54564 2024-11-27 15:14:48 +01:00
SimonGschnell 6e1943928a feature(Cms/Content_types/Raum_contentmittitel.js): wraps the h1 title of the content with a link to the Reservierungen of that room 2024-11-27 15:04:56 +01:00
ma0068 ffe28ea8fb undo phrases changes to avoid merging conflict 2024-11-27 14:58:00 +01:00
Andreas Österreicher 490a658e6d Merge branch 'feature-8482/Pruefungsprotokoll_zur_Einsicht_exportieren' 2024-11-27 13:45:30 +01:00
Andreas Österreicher fd91a4cb85 Merge branch 'master' into feature-8482/Pruefungsprotokoll_zur_Einsicht_exportieren 2024-11-27 13:44:24 +01:00
SimonGschnell 800d7ba005 refactor(Cis.css fhc-entry styles): switches the background-colors of the fhc-entry class between selected and not selected 2024-11-27 13:04:52 +01:00
ma0068 3318147ba0 Start tab Abschlusspruefung, Table and Form with Dropdowns and default data 2024-11-27 12:52:03 +01:00
SimonGschnell 89539d59fd refactor(components/Cis/Sprachen.js): refactors the Sprachen component with different styles and stores the user_langauge in the global properties of the Vue application by managing a reactive state in the phrasen plugin 2024-11-27 11:50:19 +01:00
Johann Hoffmann 1ba857b524 only show digi anw in cis_menu_lv when corresponding lva is from BIF/257 for testphase 2024-11-26 17:12:11 +01:00
SimonGschnell 0ebc6e820c refactor(Calendar/Page/Event style): change the margins of an event, so that the border of the event is visible 2024-11-26 16:27:48 +01:00
SimonGschnell 24740d055e feature(Sprache/Phrasen aendern): creates a Cis Sprachen component that lists all available Sprachen from the database and lets the user change the currently active language and persist it in the database 2024-11-26 16:26:29 +01:00
Johann Hoffmann c02c1e9955 hinweis "testphase -> keine benotung" phrase 2024-11-26 15:59:42 +01:00
cgfhtw 3457309d63 Switching grades to single edit 2024-11-26 15:06:13 +01:00
Andreas Österreicher c32f65bc1e Reihungstestangetreten Check aus BIS-Bewerbermeldung entfernt 2024-11-26 12:49:21 +01:00
SimonGschnell 82f1a70de5 fix(Calender/Day/Page.js): ausgewaehlte Event wird resetet wenn man den darauffolgenden oder vorherigen Tag auswaehlt 2024-11-26 09:25:24 +01:00
SimonGschnell 8983af4aef refactor(Stundenplan_model/getStundenplanQuery):removes wrong comments 2024-11-25 19:59:39 +01:00
Harald Bamberger 290da9f2c0 Merge branch 'master' into feature-25999/C4_cleanup 2024-11-25 17:09:53 +01:00
Harald Bamberger 7fe3a7c8f5 Merge branch 'feature-25999/C4_cleanup_rc' 2024-11-25 16:33:27 +01:00
Harald Bamberger 766bec887a check if constant CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN is defined 2024-11-25 16:29:41 +01:00
cgfhtw 5f61ae43f9 Hide Noten Tab from non-Students 2024-11-25 16:23:43 +01:00
SimonGschnell 90bdb68175 fix(Stundenplan_model/getStundenplanQuery):changes how the OR sql statments are added to the query 2024-11-25 15:24:36 +01:00
Harald Bamberger 0bec551174 lowercase search in searchfunction fhcapifactory path 2024-11-25 14:24:04 +01:00
Harald Bamberger f90f5154a0 remove searchdummy function and dummyapi 2024-11-25 13:57:25 +01:00
Harald Bamberger 2ed24ca60f remove unneeded controllers, views and vuejs apps 2024-11-25 13:48:33 +01:00
SimonGschnell 699595e891 refactor(DashboardWidget/Stundenplan.js):adds the template for the MonthPage when the Month of the calendar is visible 2024-11-25 13:34:36 +01:00
SimonGschnell 43fbd1d8f1 refactor(Calendar/Day/Page.js): moves the content to the parent, so that different views can display different content 2024-11-25 13:28:55 +01:00
cgfhtw 9c32e6f968 Zeugnis title 2024-11-25 13:06:13 +01:00
SimonGschnell 36c129fcaf reafactor(Calendar/Day/Page.js-Calendar/Week/Page.js): refactors styles of elements for easier readability 2024-11-25 11:41:22 +01:00
Harald Bamberger df0ed6715c add renderif to default room action if no content id is defined 2024-11-25 11:31:13 +01:00
cgfhtw 28e4454409 Move Semester Filter to top component 2024-11-25 11:20:44 +01:00
cgfhtw 334fc870d0 Repeater Grades 2024-11-25 10:45:45 +01:00
Harald Bamberger 6f1e61fa00 move contentid of cis4 menu root to ci config, remove unused controller components CisVue, modify CISVUE-Header to use config for cis4 menu root content id 2024-11-22 15:16:27 +01:00
SimonGschnell 1297a8a23a reafactor(Calendar/Day/Page.js): refactors styles of elements for easier readability 2024-11-22 15:02:42 +01:00
Harald Bamberger 8e51071997 readd v-bind item removing it breaks dashboard customize view instead of plus signs a ghost widget is shown 2024-11-22 14:50:16 +01:00
Johann Hoffmann ecab3ea4d9 remove hardcoded h1 tag, keep the title h1 tag; more cleanup; 2024-11-22 11:43:05 +01:00
Andreas Österreicher 14169fafd0 Wording korrigiert 2024-11-22 11:42:24 +01:00
ma0068 9c503ae66f Validierung Modal askAusbildungssemester 2024-11-22 10:51:47 +01:00
Johann Hoffmann e2b42de6b3 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-11-22 10:27:12 +01:00
Johann Hoffmann f4d16af68e change eye watering cms css from green background & white font to white background and black font - as it should be 2024-11-22 10:26:47 +01:00
SimonGschnell ab15a8675c Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-11-22 10:25:22 +01:00
SimonGschnell 20abd6aa05 fix(LvMenu): makes non available menu punkte disabled and non interactable 2024-11-22 10:25:02 +01:00
Johann Hoffmann 4bd4301873 more template cleanup profil 2024-11-22 10:15:31 +01:00
Andreas Österreicher fa3d36e99e Added check if Constant CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN is
available at all
2024-11-22 08:46:42 +01:00
ma0068 bb724bef6e Bug filter Semester 2024-11-22 08:08:35 +01:00
Johann Hoffmann 16cfb0a3eb template cleanup profil 2024-11-21 17:32:34 +01:00
Johann Hoffmann 1a6b30588d MyLvApp & Components template & property definition cleanup 2024-11-21 16:11:02 +01:00
ma0068 b0fb045b50 Cleanup tasks: add factory, validations in form, phrases ID 2024-11-21 16:07:10 +01:00
Harald Bamberger fc5ea9f4db remove unused xmlns:fo add xsl:output method html 2024-11-21 15:59:42 +01:00
ma0068 f2b5c12e6d add abort controller to autocomplete fields 2024-11-21 15:53:58 +01:00
Johann Hoffmann 61728f3044 dashboard & widgets: template cleanup; property definiton cleanup; delete unwrapInjectedRef -> resolved since vue3.3; 2024-11-21 15:43:35 +01:00
Johann Hoffmann a349a179d0 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-11-21 15:22:09 +01:00
Johann Hoffmann d400f34e0f missing phrasen 2024-11-21 15:21:33 +01:00
Harald Bamberger cdc9e08cd0 cleanup C4 dbupdates 2024-11-21 15:14:13 +01:00
ma0068 94255709c7 mark mandatory fields 2024-11-21 14:31:57 +01:00
Harald Bamberger 8eb7d18ff9 remove C4 Menu from checksystem 2024-11-21 14:04:35 +01:00
Johann Hoffmann 920bd845f8 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-11-21 13:28:10 +01:00
Johann Hoffmann 933ca20e65 tabulator in cms content -> sanitize table header contructs breaking tabulator; 2024-11-21 13:27:39 +01:00
SimonGschnell 763d038b4c fix(api/v1/Stundenplan/getStundenplan): fetches groups and studentlehrverbaende based on the date interval of the current and previous semesters 2024-11-21 12:19:22 +01:00
Harald Bamberger 6946028d76 Merge branch 'master' into feature-25999/C4_cleanup 2024-11-21 11:39:50 +01:00
Alexei Karpenko 4e857c9e4e Merge branch 'master' into feature-40314/Electronic_Onboarding_Anbindung_IDA 2024-11-20 17:00:26 +01:00
ma0068 7a0690227c Merge branch 'feature-47784/FHC-4/CleanupTasks' of github.com:FH-Complete/FHC-Core into feature-47784/FHC-4/CleanupTasks 2024-11-20 16:23:16 +01:00
ma0068 d17c776905 bug address.js, phrase Notiz 2024-11-20 16:22:39 +01:00
kindlm 222f31c464 Merge remote-tracking branch 'origin/master' 2024-11-20 16:01:07 +01:00
kindlm 155e8da35a Ampel Übersicht tablesorter with filter + date-sort bugfix 2024-11-20 16:00:57 +01:00
Alexei Karpenko b63146a8d8 added MeldezettelJob for accepting Meldezettel of students with Meldeadresse 2024-11-20 15:03:59 +01:00
Cris e94e9ceff2 Added phrases 'zuordnungExistiertBereits' and 'swFuerLvAendern' 2024-11-20 14:07:43 +01:00
Cris 8a22eab0c8 Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2024-11-20 13:59:35 +01:00
Cris 95ebc442a4 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-11-20 13:58:27 +01:00
Cris ae94daa4a6 Added getStudienjahrByStudiensemester method to Studiensemester Model 2024-11-20 13:57:30 +01:00
Cris 933af94344 Added checkIsTemplate method to Lehrveranstaltung Model
Checks if given LV is a template (Quellkurs)
2024-11-20 13:55:11 +01:00
Cris 8614e4301f Added getStudienjahrByStudiensemester method to Studiensemester API Controller 2024-11-20 13:54:05 +01:00
cgfhtw e0e123f264 Teacher Component 2024-11-20 13:19:43 +01:00
cgfhtw ad01c8bdeb Bugfix: reinitialize initialData in Prestudent Tab after saving 2024-11-20 12:45:14 +01:00
cgfhtw 8593fda5cd Bugfix: scrolling in Notiz Tab 2024-11-20 12:44:45 +01:00
cgfhtw e76d8fb85d Phrases & TODO cleanup 2024-11-20 11:15:18 +01:00
Johann Hoffmann a5dd639404 stundenplan header offset class conditionally depending on fhc-calendar widget property 2024-11-20 11:14:55 +01:00
cgfhtw fe7ca2bf69 Teacher Proposal 2024-11-20 11:06:28 +01:00
cgfhtw 5369c95e77 Scroll Bug Notizen Tab 2024-11-20 11:05:05 +01:00
ma0068 b189ac8cd0 adapt Notes: Tinymce, textarea, delete bsModal 2024-11-20 10:41:12 +01:00
SimonGschnell 7466e414f8 Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-11-20 10:36:04 +01:00
SimonGschnell 3896aa73ea fix(Raum_information Calendar): passt die RaumInformations Seite auf die Aenderungen des Calenders an 2024-11-20 10:35:51 +01:00
Harald Bamberger f6319aa845 add new searchoptions to display search results correct again 2024-11-20 09:29:43 +01:00
Harald Bamberger 9420e22b2a optimise scrolling behavior of search results and responsive layout of search results 2024-11-19 18:13:15 +01:00
Johann Hoffmann 778149880f Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-11-19 17:46:32 +01:00
Johann Hoffmann 2c98438096 add cis4link to widget setup; show link icon in dashboard item header; remove links from widget contents; 2024-11-19 17:46:11 +01:00
Harald Bamberger a2bdca5551 fix typo 2024-11-19 17:44:44 +01:00
Harald Bamberger 05c52e41eb search only for active orgunits and rooms, also search room description 2024-11-19 17:33:57 +01:00
Johann Hoffmann 00406c50a5 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-11-19 17:09:58 +01:00
Johann Hoffmann 5e9e08d65e calendar scrollbar css fix; 2024-11-19 17:08:39 +01:00
Johann Hoffmann d8af18673c always show card header of widgets as in editMode but enable certain tools only when actually in editMode. editMode is active for dashboard not for section; less paddings overall in dashboard; deleted Section headers and put cog besides personal greeting; reformatted name var for greeting into generic viewData property; 2024-11-19 17:07:05 +01:00
Harald Bamberger c32046002d add buffer to height calculation 2024-11-19 16:24:36 +01:00
Harald Bamberger df054a7088 Merge branch 'feature-25999/C4_cleanup_rc' into feature-25999/C4_cleanup 2024-11-19 16:18:45 +01:00
Harald Bamberger 4e4e8a0a5c improve responsive layout of search results 2024-11-19 16:16:46 +01:00
ma0068 07e6146e50 Validations, Phrases, cleanup 2024-11-19 14:34:50 +01:00
Johann Hoffmann ad7b43f8a8 Merge remote-tracking branch 'origin/feature-25999/C4_cleanup' into feature-25999/C4_cleanup 2024-11-19 13:35:30 +01:00
Johann Hoffmann f82c669475 provide/inject editModeIsActive from section.js -> currently used in bookmark widget to move redundant config modal into actual widget when said mode is on; 2024-11-19 13:35:06 +01:00
SimonGschnell d2466b032a Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-11-19 12:51:50 +01:00
SimonGschnell 8d01995722 refactor(Studenplan Query):queries all studiensemester from start_date to end_date and matches the gruppen and studentlehrverbaende to the associated studiensemester in the query 2024-11-19 12:51:12 +01:00
Johann Hoffmann 3cb9e5b4f8 stpl widget title & show no LVA found on empty days; limit news widget content img max-width by css class; 2024-11-19 12:38:32 +01:00
SimonGschnell 5d5b2e5bc4 fix(FHCAPI_Controller): adjusts the php doc types of parameters 2024-11-19 11:35:20 +01:00
Johann Hoffmann 4cb3521361 Merge branch 'feature-53416/stundenplan_eine_lva' into feature-25999/C4_cleanup 2024-11-19 10:36:34 +01:00
Johann Hoffmann 46ef02b54d deactivate drag mode when widget config modal is opened 2024-11-19 10:33:39 +01:00
Harald Bamberger 9c6509b32a Merge branch 'feature-25999/C4_cleanup_tablewidget' into feature-25999/C4_cleanup 2024-11-19 10:18:26 +01:00
Harald Bamberger d6bdad27b2 move room specific stuff to searchconfig, add renderif method to be able to render actions conditionally via config, remove additional prop selectedtypes 2024-11-19 10:17:10 +01:00
SimonGschnell 4aed321b5e refactor(Calendar Tagesansicht): changes how the logic for opening a modal or showing the lvMenu next to the calendar is handled 2024-11-19 10:11:49 +01:00
Harald Bamberger 06dab52461 Merge branch 'feature-25999/C4_cleanup_tablewidget' into feature-25999/C4_cleanup 2024-11-19 08:48:06 +01:00
Harald Bamberger 6fc7fd7788 Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_cleanup_tablewidget 2024-11-19 08:44:24 +01:00
Harald Bamberger 13e77c8154 Merge branch 'master' into feature-25999/C4_cleanup 2024-11-19 08:43:05 +01:00
Johann Hoffmann b6a5e9b845 load stsemArray from Prestudentstati for select options; 2024-11-18 16:09:16 +01:00
Harald Bamberger ad31e73212 reset Tabulator fontsize, combine page headings 2024-11-18 11:59:40 +01:00
Harald Bamberger 5596c12af9 use deleteRow instead of getRow and delete to avoid console log error 2024-11-18 11:53:17 +01:00
Harald Bamberger e044641600 use deleteRow instead of getRow and delete to avoid console log error 2024-11-18 11:50:51 +01:00
Harald Bamberger 65c9d5a84c adminZeitverfuegbarkeiten reset tabulator fontsize 2024-11-18 10:47:08 +01:00
Harald Bamberger 545a9c31e4 tablewidget footer buttons add missing btn css class 2024-11-18 10:29:28 +01:00
Harald Bamberger 2b98a35f59 bs5 accordion-button class added 2024-11-18 10:20:13 +01:00
cgfhtw d650587418 use fhcApi for grades tab 2024-11-18 09:58:59 +01:00
SimonGschnell 96ec9aa8aa fix(Calender Style): changes the hover style for fhc-entries to have a brighter color than the selectedEvent itself 2024-11-18 09:32:49 +01:00
Harald Bamberger 1b8980a0e2 add css classe with bs3 legacy colors for bg-success and bg-warning and use them in acceptLehrauftrag cis page 2024-11-15 15:58:26 +01:00
Harald Bamberger 1e5d7e01af reset font-size for tabulator on vilesci page 2024-11-15 15:57:00 +01:00
Harald Bamberger 78f216f9ad fix syntax error 2024-11-15 15:55:42 +01:00
Harald Bamberger 16cba022e2 add css class to be able to reset tabulator fontsize to 14px for vilesci pages, set active and focus class for filter buttons to new combined button, add css rules to make tooltips on cells in unselectable rows work again 2024-11-15 15:21:46 +01:00
Harald Bamberger 488847984e change property downloadTitle to titleDownload for Tabulator 5, call tabulator redraw at the end of tableInit callback to ensure renderStart callbacks are run 2024-11-15 15:19:09 +01:00
Harald Bamberger daf432fe8d port changes made for BS3 => BS5 to version of current master to get rid of many whitespace and code formating changes and only have functional changes 2024-11-15 15:14:15 +01:00
Johann Hoffmann 3146f0795f Merge branch 'feature-53416/stundenplan_eine_lva' into feature-25999/C4_cleanup 2024-11-15 14:12:00 +01:00
Johann Hoffmann 87657a18f1 apply max width only to sanitized p blocks, not column default 2024-11-15 14:10:47 +01:00
Johann Hoffmann 6e8aea7feb Merge branch 'feature-53416/stundenplan_eine_lva' into feature-25999/C4_cleanup 2024-11-15 14:04:53 +01:00
Johann Hoffmann d9f33a279d apply html sanitization on legacy cms tables intended to be rendered with tabulator 5; clears nested tables, reformats rext nodes and unordered lists to fit into tabulator cells; 2024-11-15 14:02:05 +01:00
SimonGschnell fdcef8bdab feature(Calendar): keeps track of the selected Event in a shared state and highlights the selected Event over different calendar views 2024-11-15 12:52:24 +01:00
SimonGschnell 65d0e89f06 refactor(Stundenplan events css): moves the class definitions of the events to the slot templates and adds little animations 2024-11-15 11:48:55 +01:00
SimonGschnell 45fca04029 feature(Calendar Tagesansicht):based on the window with decides wether to display the lvMenu in a Modal or next to the calendar 2024-11-15 11:18:15 +01:00
ma0068 eccd827c71 adaptions and additions cleanup tasks according to task 54312 2024-11-15 11:14:58 +01:00
cgfhtw da465fffb1 Points to Grade conversion 2024-11-15 09:56:58 +01:00
cgfhtw 5705cd2d66 Note einblenden 2024-11-15 09:56:22 +01:00
SimonGschnell ef21936975 fix(Calendar scroll):ensures the calendar scroll watcher always triggers by also passing the current focusDate of the Calendar 2024-11-15 09:52:40 +01:00
Harald Bamberger 6b828179b0 revert lehrveranstaltung.class.php lehreinheit.class.php to current master since additional functions were ported to codeigniter models and are no longer used 2024-11-14 16:13:11 +01:00
SimonGschnell ebedb30c29 refactor(Stundenplan Tagesansicht):dynamically loads the lvMenu of the first Lv of the day and hightlights the selected LV of the day 2024-11-14 14:40:18 +01:00
Johann Hoffmann 8da27a5c77 stpl widget shows selected day + next 7 days 2024-11-14 13:12:56 +01:00
SimonGschnell 681fb18222 fix(Stundenplan): readds the loadEvents and deletes the template error 2024-11-14 11:15:02 +01:00
SimonGschnell f159d6e2a7 fix(Grid CSS): remove unused css rules and css classes 2024-11-14 11:07:58 +01:00
Johann Hoffmann 3fff0c5325 Merge branch 'feature-53416/stundenplan_eine_lva' into feature-25999/C4_cleanup 2024-11-13 18:59:33 +01:00
Johann Hoffmann 160294bea4 removed grey section background and added fading thing seperator line for every section after the first 2024-11-13 18:39:19 +01:00
Johann Hoffmann a682d6e5ae overflow-y scroll changed to overflow-y auto -> avoid unnecessary scrollbars 2024-11-13 18:14:58 +01:00
Johann Hoffmann 9042f9b83b change fh logo visibility breakpoint class md -> sm; editable flag in profile based on looking at own profile or being an admin; scrollbar calc in profil app; 2024-11-13 17:27:50 +01:00
Johann Hoffmann cad2756613 Merge branch 'feature-53416/stundenplan_eine_lva' into feature-25999/C4_cleanup 2024-11-13 15:21:33 +01:00
Johann Hoffmann 2fd39a9d18 defined active color variable for lvl 2 buttons and use in css class fhc-active for language Buttons. It is yet another shade of grey. 2024-11-13 15:19:42 +01:00
SimonGschnell 329a418be3 Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-11-13 14:53:49 +01:00
SimonGschnell e3cbbfa365 feature(Calendar Tagesansicht): LvInfo und LvMenu wird neben der Tagesansicht angezeigt wenn man eine Lv auswaehlt 2024-11-13 14:52:46 +01:00
Johann Hoffmann c85790b637 Merge branch 'feature-53416/stundenplan_eine_lva' into feature-25999/C4_cleanup 2024-11-13 14:14:34 +01:00
Johann Hoffmann 5d524c5fda fix dashboard alert css by adding primevue3 in $includeArray in Dashboard view file 2024-11-13 14:14:11 +01:00
Johann Hoffmann 6613b0ea40 remove console.log 2024-11-13 14:08:58 +01:00
Johann Hoffmann a94d8d8fa5 calendar minimized only using slot; showing whole week in stundeplan widget tagesansicht grouped by day; everything in past has 0.5 opacity 2024-11-13 13:57:37 +01:00
Johann Hoffmann e43a890aff Merge branch 'feature-25999/C4_cleanup' into feature-53416/stundenplan_eine_lva
# Conflicts:
#	public/js/apps/Cis/Stundenplan.js
#	public/js/components/DashboardWidget/Stundenplan.js
2024-11-13 11:17:43 +01:00
SimonGschnell 59f8f91af9 feature(Calendar Tagesansicht): Calender wird ausgegraut wenn keine LVs an diesen Tag vorhanden sind 2024-11-13 11:00:08 +01:00
Johann Hoffmann b0cd599999 WIP stundenplan widget tagesansicht 2024-11-13 10:41:50 +01:00
cgfhtw 1cdf1e7896 Anzahl anzeigen 2024-11-13 10:08:36 +01:00
SimonGschnell c244b3ad1b fix(Stundenplan): template error 2024-11-12 12:55:14 +01:00
ma0048 6b04dff4a3 - start tab tags hinzugefuegt 2024-11-12 11:47:16 +01:00
Harald Bamberger f265e20dce Merge branch 'feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp' into feature-25999/C4_cleanup 2024-11-12 11:21:16 +01:00
Harald Bamberger c691d155c9 remove dependecy to legacy phrases from LvMenu controller, add legacy phrases needed in LvMenu controller 2024-11-12 11:05:13 +01:00
SimonGschnell 3046c29ae2 fix(Calendar): does not display events on the calendar when sliding the carusel to avoid showing overlapping events 2024-11-12 09:57:10 +01:00
SimonGschnell 6cf7a8e35e fix(Calendar scroll): extends the id of the scroll anchor to include hour/day/week and changes the logic to search for the anchor depend on the week or day view 2024-11-12 09:48:03 +01:00
ma0068 5751441424 filter offene Vertraege, validations insert, update Contract 2024-11-12 07:57:46 +01:00
Alexei Karpenko add9263d35 added Electronic Onboarding phrases 2024-11-11 17:17:33 +01:00
SimonGschnell 35691b39c4 fix(Calendar scroll): fixes the scroll feature for the Calendar 2024-11-11 16:15:14 +01:00
Johann Hoffmann 85bec1e0e3 section spacing; dashboard widgets section backgrounds; set scrollbar width css variable via new helper in FhcApp (Dashboard); WIP stundenplan alle Termine einer LV -> c4 link in bfi addon adapted; 2024-11-11 15:49:03 +01:00
SimonGschnell 094a3ed56a feature(Calendar): scrolls to the first event of the day if the prop scrollTime is passed to Calendar component 2024-11-11 15:46:09 +01:00
SimonGschnell bd1ce9fa63 refactor(Calendar Header): refactors view buttons in the calendar header 2024-11-11 14:57:34 +01:00
SimonGschnell bd54399cfd fix(Calendar Header): adds responsiveness to the calendar header and the view button group next to the header 2024-11-11 14:57:28 +01:00
SimonGschnell b7e89ab557 fix(Stundenplan hour lines): fixes the hour lines from disapearing on smaller viewports by using a box-shadow instead 2024-11-11 11:27:23 +01:00
SimonGschnell 0e49dfaba0 refactor(Calendar day view): changes the classes for fhc-calendar-day-page so that the width is divided in calendar and content 2024-11-11 10:40:58 +01:00
ma0068 023fafde2c update reload functions, adapt delete contract, add watcher in unassignedList 2024-11-11 10:37:51 +01:00
Johann Hoffmann 96335a7979 moved email template to fhtw addon; einheiten column visibility default false since pausen are not represented; backend code cleanup; phrase fix; 2024-11-11 09:56:43 +01:00
ma0048 355652cdb1 - added sql for tags 2024-11-11 07:51:52 +01:00
ma0048 45bc65d32a - Tags testversion
- header tooltips
- lehre spalte markieren wenn altes semester
- legende-tab hinzugefuegt
2024-11-11 07:33:49 +01:00
SimonGschnell ca7ded38d2 refactor(Stundenplan indicator): uses a 5 minute interval for the Stundenplan indicator 2024-11-08 16:08:08 +01:00
SimonGschnell f304e79ee0 feature(Stundenplan): adds Tagesansicht for the Stundenplan 2024-11-08 15:18:10 +01:00
SimonGschnell 68042c1c77 Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-11-08 14:14:54 +01:00
ma0068 2d0285e31d add and update Lehrauftraege, logic sumup beträge 2024-11-08 13:29:19 +01:00
SimonGschnell b9690988e5 refactor(Stundenplan): uses named slots for week-view template 2024-11-08 10:53:02 +01:00
Harald Bamberger 1691c75a84 replace dependencies on legacy code with ci model functions 2024-11-07 19:18:08 +01:00
cgfhtw 2ed5df8c1c Orgform of Stg in searchresults 2024-11-07 17:01:51 +01:00
SimonGschnell f4176b86ee refactor(js helpers): moves ObjectUtils from composables to the js helpers folder and changes its import statements 2024-11-07 15:00:25 +01:00
SimonGschnell da70c77a2b feature(DateHelpers.js): creates a js helper file to create, handle and manipulate js dates 2024-11-07 15:00:18 +01:00
cgfhtw 72c992569c Improvements Mergedperson Component 2024-11-07 13:33:51 +01:00
SimonGschnell 6732063e6a Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-11-07 13:15:08 +01:00
SimonGschnell b65d17e7ae refactor(LvModal): uses the right format for the date and adds padding to date numbers which are single digits 2024-11-07 13:14:40 +01:00
cgfhtw f82ed6928a Phrasen 2024-11-07 11:47:35 +01:00
Andreas Österreicher f68d18f0a8 Stundenplan Bugfix to also load Entries of Semester and Verband 2024-11-07 10:25:42 +01:00
SimonGschnell 4f2992fbe2 fix(Cis profil menu): fixes the layout of the collapsible in the mobile view 2024-11-07 10:21:39 +01:00
cgfhtw 8c689418f7 Bugfixes 2024-11-07 09:57:26 +01:00
ma0068 9fd9c4e94d edit Status Contracts 2024-11-06 11:43:59 +01:00
Harald Bamberger 2b516d40c9 remove controllers, views and libraries for CisHtml since not used 2024-11-05 17:46:42 +01:00
Harald Bamberger 39cedfe6a0 remove controllers, views and libraries for CisHmvc since not used 2024-11-05 16:48:30 +01:00
ma0068 40baa7e08c update childcomponent vertragstati 2024-11-05 16:06:14 +01:00
SimonGschnell 8316290b31 fix(Cis Navbar Collapsibles): closes other colapsibles when opening another 2024-11-05 15:54:26 +01:00
cgfhtw 02a5465708 Merge branch 'master' into feature-40128/Mehrere_Suchergebnisse_für_selbe_Person 2024-11-05 15:41:48 +01:00
cgfhtw e3119ee48c cleanup 2024-11-05 15:35:00 +01:00
SimonGschnell 7653bc3e29 fix(Menu User Dropdown): rearranges html elements to make dropdown scroll 2024-11-05 12:03:44 +01:00
cgfhtw d0cf86585a Visual update for search icons 2024-11-05 11:42:18 +01:00
SimonGschnell 37dffbba19 fix(Dashboard widget Url): adds validation method for both input fields and fixes confirm delete dialog 2024-11-05 11:32:02 +01:00
cgfhtw 3a13226298 Bug: merge "RECURSIVE"-keyword 2024-11-05 11:08:07 +01:00
cgfhtw 2ff7c9f582 Dms search result component 2024-11-05 09:02:09 +01:00
cgfhtw b27564ea0f Multiple uids in person search 2024-11-05 09:01:18 +01:00
Harald Bamberger a9fe52d3c6 Merge branch 'feature-25999/C4_cleanup_merge_anrechnungen_bs5' into feature-25999/C4_cleanup 2024-11-05 07:59:21 +01:00
Harald Bamberger 20e0e2e910 Merge branch 'feature-25999/C4_cleanup' into feature-25999/C4_cleanup_merge_anrechnungen_bs5 2024-11-04 15:59:14 +01:00
Harald Bamberger 50880c696b use getAuthUID function instead of get_uid, use new permission basis/cis and switch to Auth_Controller where possible 2024-11-04 15:41:02 +01:00
Harald Bamberger a65e94bc8a fix phrases variable name because of switch from mixin to plugin 2024-11-04 15:38:04 +01:00
Harald Bamberger 20715d6ef5 add permission basis/cis 2024-11-04 15:36:46 +01:00
Harald Bamberger c31cef349c add phrases from legacy code for news extra aside content 2024-11-04 15:35:35 +01:00
SimonGschnell 50a67a8e88 feature(Dashboard Bookmark): checks whether the link is a valid URL, displays fhcAlert otherwise 2024-11-04 14:37:09 +01:00
SimonGschnell eafbdcfffe refactor(Cis Menu): changes method name and checks if the CIS4_MENU_ENTRY constant is defined 2024-11-04 13:39:13 +01:00
ma0068 b1452698f8 Start View Karteireiter, Components Unassigned, Details and Stati 2024-11-04 12:54:34 +01:00
ma0048 9c637b8575 - added model 2024-11-04 12:20:52 +01:00
SimonGschnell 86ee48888a fix(Cis Menu): adds Zahlungen to Mein Studium 2024-11-04 12:09:26 +01:00
SimonGschnell 9e45394deb fix(Cis MyLv): uses the moodle course bezeichnung for multiple moodle links 2024-11-04 12:09:12 +01:00
SimonGschnell ad068ffe5f different property name for the different moodle courses names 2024-11-04 09:07:35 +01:00
Harald Bamberger 93ac45308f Merge branch 'feature-36185/requestAnrechnung_bootstrap3_zu_bootstrap5' into feature-25999/C4_cleanup 2024-10-31 16:00:12 +01:00
cgfhtw 0916d34767 DMS Search 2024-10-31 14:25:27 +01:00
SimonGschnell 34c6c63c74 Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-10-31 14:24:19 +01:00
SimonGschnell f820a0148a adapts the LV view to incorporate a dropdown if a lehrveranstaltung has multiple moodle links 2024-10-31 14:22:46 +01:00
cgfhtw 8d00a9b4c9 Bugfix 2024-10-31 14:22:31 +01:00
Harald Bamberger e78c2e1bf7 Merge branch 'master' into feature-25999/C4_cleanup 2024-10-30 17:19:01 +01:00
Harald Bamberger d4f3fbfc79 Merge branch 'master' into feature-36185/requestAnrechnung_bootstrap3_zu_bootstrap5 2024-10-30 16:45:07 +01:00
SimonGschnell c5b81c22f9 adds the target for the lv menu in the studenplan modal and also replaces the tablesorter tables with tabulator5 in other content views 2024-10-30 11:31:39 +01:00
SimonGschnell 837cc191bf adds another link regex for the link string '../cms/content?content_id=...' and adds the library content to the CIS4 Menu content 2024-10-30 10:49:27 +01:00
SimonGschnell 6b991c514e refactors the room actions in the searchbar 2024-10-29 15:49:56 +01:00
SimonGschnell bdfea1763d adds gaps to the LvMenu 2024-10-29 15:38:10 +01:00
SimonGschnell 587a193a6b refactors the LvMenu Modal 2024-10-29 15:18:53 +01:00
Johann Hoffmann ec9e73180d primevue custom tooltip directive zIndex config retrieval fix; studentByLva tabulator height calc abort if no dataTable rendered; phrases fix; 2024-10-29 15:13:00 +01:00
SimonGschnell ff367339ea makes MyLv more responsive 2024-10-29 14:31:20 +01:00
SimonGschnell b9ccafe9db uses the cis.php file for the anrechnungen url 2024-10-28 15:57:33 +01:00
SimonGschnell 5f078a76c6 renders the right header (cis or fhtw) conditionally based on the CIS4 constant 2024-10-28 14:54:26 +01:00
SimonGschnell 3eb2100b3d Merge branch 'feature-25999/C4_cleanup' of github.com:FH-Complete/FHC-Core into feature-25999/C4_cleanup 2024-10-28 14:16:07 +01:00
SimonGschnell fbf0417269 only adds the Events file from addons which are actually active and refactors the Lv Information into its own component 2024-10-28 14:15:45 +01:00
SimonGschnell b801401d2b only shows the Week modus of the calendar if it is not a widget and opens the MyLV links as new tabs instead of showing them in the modal 2024-10-28 13:25:41 +01:00
Johann Hoffmann 46c4a30408 css fix & header file import remove 2024-10-28 11:36:49 +01:00
cgfhtw 963391ec99 Bug: counting "with" statements + allowing multi primarykey + allowing "recursive" statement in prepare config 2024-10-28 11:20:51 +01:00
cgfhtw b1f4e5487d Bug: wrong function name 2024-10-28 11:18:25 +01:00
cgfhtw 084a13316d Remove duplicate emails 2024-10-28 11:17:03 +01:00
cgfhtw a9a18d1cd4 Remove deprecated components 2024-10-28 11:16:02 +01:00
Johann Hoffmann 6fc5714fdf removed language flags; anw phrasen added; added names to apps for easier devtools debugging; 2024-10-25 16:34:57 +02:00
Johann Hoffmann 74cf0ad173 use vue header & tooltip translations 2024-10-25 15:58:37 +02:00
Johann Hoffmann e387671e09 added set language feature; phrasen plugin with optional reload if non responsive phrasen are used; stundenplan header mode & buttons reworked 2024-10-24 17:46:42 +02:00
Johann Hoffmann 32137479e9 activate email to assistenz on upload; redraw table in case of tabulator scroll bug; navigation.php $root var for Cis4 preperation 2024-10-24 15:07:08 +02:00
ma0068 0779bc5204 bugfix add and update Adresse 2024-10-23 16:33:02 +02:00
ma0068 e283997293 cleanUp Tasks Tab Details 2024-10-23 14:26:33 +02:00
ma0048 e89beb610d - infocentermitarbeiter spalte deleted by user wird ignoriert 2024-10-23 13:33:50 +02:00
Johann Hoffmann 805ed20a18 Merge branch 'feature-52360/C4_fh_logo_remove_and_extend_searchbar_mobile' into feature-52734/C4_moodle_link_stpl_widget_stpl_mylva 2024-10-22 17:52:57 +02:00
ma0068 8787558fef cleanUp Tasks Tab PrestudentIn 2024-10-22 15:58:02 +02:00
Harald Bamberger c763e332d8 Merge branch 'feature-52735/C4_stundenplan_query_fix' into feature-25999/C4_cleanup 2024-10-21 17:16:21 +02:00
Johann Hoffmann f3851da10d add bootstrap class to only show fh logo in header on medium and greater displays; adjusted nav-user-btn css under mobile breakpoint to just take space of contained img and let searchbar flex growth apply to leftover width; 2024-10-21 16:02:54 +02:00
Cris dcb24415fc Added phrases 'errorConfigFehlt' and 'errorUnbekannteUrl' 2024-10-21 14:02:25 +02:00
Johann Hoffmann 2e3bc855aa Merge branch 'feature-25999/C4_cleanup' into feature-52735/C4_stundenplan_query_fix 2024-10-21 13:51:21 +02:00
Johann Hoffmann 728e2f9b3a fix getStundenplanQuery query building if benutzer gruppen are empty; 2024-10-21 13:48:32 +02:00
Harald Bamberger 690080035a fix umlauts in variable name 2024-10-21 13:05:47 +02:00
Johann Hoffmann d8c4c6506a Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp 2024-10-21 10:21:42 +02:00
Alexei Karpenko b8ff37eb8e added kontakt verifikation table for saving of kontakt verifikation data, added model for the table 2024-10-19 17:25:09 +02:00
Harald Bamberger 9cd59a1250 add header version switch depending on CIS4 defined 2024-10-18 17:16:12 +02:00
Harald Bamberger 289c99a5a1 fix another 2 file permissions erroneously commited as a21a292da6 2024-10-18 17:03:40 +02:00
Harald Bamberger cf77a60b35 remove application/controllers/components/Antrag/* since not present in master any more 2024-10-18 16:57:03 +02:00
Harald Bamberger 0775fae67d remove unnecessary comment 2024-10-18 16:49:52 +02:00
Harald Bamberger 071b0c72dc Merge branch 'master' into feature-25999/C4_cleanup 2024-10-18 15:45:42 +02:00
Harald Bamberger 44b81d9dff Merge branch 'feature-25999/C4' into feature-25999/C4_cleanup 2024-10-18 15:44:39 +02:00
Johann Hoffmann 7ce426abc2 tooltip css fix; added missing phrase; 2024-10-18 15:14:13 +02:00
ma0048 5cee80ed12 - rtliste automatisierte messages 2024-10-18 13:24:39 +02:00
SimonGschnell 8ba370d3a7 makes the active menu punkt bold instead of underlined 2024-10-18 11:58:14 +02:00
SimonGschnell 59df85b05e adds Zeugnisse und Documents unter dem Mein Studium Menu Punkt 2024-10-18 11:55:20 +02:00
SimonGschnell 909b9f5f5a Merge branch 'feature-25999/C4' of github.com:FH-Complete/FHC-Core into feature-25999/C4 2024-10-18 11:19:18 +02:00
SimonGschnell 236c4bbdfc adds placeholders to the empty dashboard fields, that can be used to add new widgets to the dashboard 2024-10-18 11:18:36 +02:00
Harald Bamberger c80e943b3b readd erroneously deleted folder addons/template commited as 56080f6681 2024-10-17 15:55:05 +02:00
Harald Bamberger d4494836b1 fix file permissions erroneously commited as a21a292da6 2024-10-17 15:34:00 +02:00
Johann Hoffmann a04b2725f9 csv download lektor table as is; cis_menu_lv link hidden behind berechtigungen check; every tabulator now calculates remaining height by accessing window.visibleViewport.height and tabulator dataset element in order to get virtual DOM behaviour for faster rendering and better UX; filter component now emits uuid on created() lifecycle; 2024-10-17 15:04:03 +02:00
Harald Bamberger 0ab1ec1fc8 Merge branch 'master' into feature-25999/C4 2024-10-17 14:49:43 +02:00
SimonGschnell e475fe568e adds the dashboard menu punkt and adds greeting to the dashboard view 2024-10-17 09:58:28 +02:00
Cris 2f448ca2bc Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite
# Conflicts:
#	system/phrasesupdate.php
2024-10-16 09:44:50 +02:00
Cris 38bf664b02 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-10-16 09:41:12 +02:00
Cris d913bf40d8 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-10-15 12:07:08 +02:00
Harald Bamberger 14aa98c223 Merge branch 'master' into feature-25999/C4 2024-10-15 10:46:17 +02:00
Harald Bamberger e2cee7ffa3 Merge branch 'master' into feature-25999/C4 2024-10-15 10:44:56 +02:00
SimonGschnell 9ed08fb40c default value for hasConfig is false and the emit update for the URL dashboard widget and only loads the config component if the dashboard widget actually has a config 2024-10-14 13:36:31 +02:00
Alexei Karpenko 2893f2ec5a bugfix lvplan feedback link stpl_detail: correct html 2024-10-14 13:21:19 +02:00
SimonGschnell b0e96fbab1 replaces the emits to injections to avoid repassing the emits between intermediate parent elements 2024-10-14 11:42:30 +02:00
SimonGschnell 0528f3b262 checks the size of the arrays before using the current method and does not allow mitarbeiter to access the student stundenplan 2024-10-14 11:32:23 +02:00
cgfhtw 123f29a750 CMS Search 2024-10-14 11:22:20 +02:00
cgfhtw 322544c7fb dynamic image url for searchresults 2024-10-14 11:20:46 +02:00
SimonGschnell 462857080b makes the parent menu point active if the child menu points gets closed 2024-10-14 11:06:48 +02:00
Johann Hoffmann c67e78d135 phrasen rewording; formatter change; fix save changed anwesenheiten StudentByLvaComponent.js; 2024-10-14 10:42:49 +02:00
SimonGschnell 4f9591fc3b fix the z-index of the week stundenplan header 2024-10-14 10:36:46 +02:00
SimonGschnell c444e27d0d adds more styling and fixes little bug in the currentHour Stundenplan indicator 2024-10-14 10:34:01 +02:00
SimonGschnell ed1d4b1a50 regex replaces old content links with new CIS4 controller links and adopts the Menu Entry links to not refresh the page when closing the Menu point 2024-10-14 10:17:20 +02:00
SimonGschnell 9fd02460ce doesnt refresh the page when the menu entry gets closed, does redirect if the menu entry gets opened 2024-10-14 09:48:54 +02:00
Alexei Karpenko 1c61217891 lvplan: changed feedback phrase and Link 2024-10-13 13:34:07 +02:00
Alexei Karpenko bf1bc8d1a9 added new contact type email unverifiziert and adresse type meldeadresse (mainly for electronic onboarding) 2024-10-13 13:32:15 +02:00
SimonGschnell f9e72832c9 adds time inidication on stundenplan on mouse position 2024-10-11 12:33:06 +02:00
SimonGschnell 5359539a09 makes Stundenplan query BLAZINGLY fast 2024-10-10 20:59:55 +02:00
SimonGschnell d2ed82cb37 calculates the total amout of hours with an array filter instead of statically inserting all hours 2024-10-10 13:27:26 +02:00
SimonGschnell f3fa2fa2dd adds the hour gutter for the stundenplan with absolute positioned divs instead of a linear gradient 2024-10-10 13:12:01 +02:00
SimonGschnell bf8085f642 starts the stundenplan from hour 7 instead of hour 0 2024-10-10 11:24:26 +02:00
Johann Hoffmann 9be5dc3f73 phrasen; tooltips; 2024-10-10 09:47:40 +02:00
SimonGschnell 4d50d4380b little bug fix 2024-10-08 13:54:58 +02:00
SimonGschnell 45ff067379 makes the url match to the Menu entries better 2024-10-08 13:47:48 +02:00
SimonGschnell ebebf8af6d changes calendar mode to button-group instead of select 2024-10-08 13:29:43 +02:00
SimonGschnell 79c8edc6cf makes the calendar week mode header align and highlights the week or day in the Month view depenedent if there is a week view available 2024-10-08 13:20:06 +02:00
Cris 7096bba958 Added phrases for Softwarebereitstellung 2024-10-07 16:37:45 +02:00
Cris b08e01f72f Added columns to and moved where-clauses from _getQryLvsByStudienplan to calling methods in Lehrveranstaltung_model.php
.added cols lehrtyp_kurzbz and lehrveranstaltung_template_id
2024-10-07 16:37:07 +02:00
Cris 8744a00ce7 Added filter lehrtyp_kurzbz and $oe_column to getLvsByStudienplan in Lehrveranstaltung_model.php
.lehrtyp_kurzbz filters by Lehrtyp 'lv' or 'modul' (default no filter)
.oe_column is used when filtering $oes: Filter by lv.oe_kurzbz or stg.oe_kurzbz (the stg joined to lv)
2024-10-07 16:34:41 +02:00
Cris 11b0e770a2 Added filter lehrtyp_kurzbz to getAutocompleteSuggestions in Lehrveranstaltung_model.php 2024-10-07 16:29:53 +02:00
Johann Hoffmann 008bbedd98 phrase 2024-10-07 16:22:27 +02:00
SimonGschnell e75872adaa lets the user change the view of the calendar in the header with a select and highlights the date fields to change the view of the current calendar 2024-10-07 14:49:02 +02:00
SimonGschnell 25a64cbcae fixes cis4 Menu for longest matching urls 2024-10-04 12:04:54 +02:00
Johann Hoffmann ef0e3f3a66 Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp 2024-10-03 11:24:48 +02:00
Johann Hoffmann ed6eb18c4d fetch termine from vw_stundenplan, not tbl_stundenplan; LE_ID DD chagned to refs (WIP MA_UID DD & Termin DD); removed console.logs(); fhcAlert fix; now find closest termin with absolute value of timeDiff; 2024-10-02 18:04:30 +02:00
SimonGschnell 8042f3ae0b makes the menu point active with the url matches 2024-10-02 14:22:34 +02:00
SimonGschnell e8f38bfcf6 sets the events to null before fetching the new events to reactivate the loading spinner 2024-10-02 13:28:18 +02:00
SimonGschnell 7f9352b820 prototyp fuer die Stundenplan query fuer Studierende 2024-10-02 13:25:39 +02:00
SimonGschnell c461480d1d stundenplanQuery optimization 2024-10-02 10:35:58 +02:00
ma0068 b9911e69c5 renaming id: Tab Contact 2024-10-02 08:58:24 +02:00
ma0068 00cf7b8112 tabs Status and Gesamthistorie: use factories 2024-10-01 15:27:36 +02:00
SimonGschnell 567dd816be better descriptions for the cis4_root_menu sql queries 2024-10-01 13:54:53 +02:00
SimonGschnell 76facc40b9 changes the layout for the LvMenu to a flex instead of a grid 2024-10-01 12:14:34 +02:00
Johann Hoffmann ce058df3a5 Student Component Performance Fix (dont subquery person and anwesenheiten_user table on every anw_user row, just do the entschuldigung offen/abgelehnt logic in client before rendering); entschuldigung tab route; pagination on student entschuldigung page aswell; added config for einheiten länge to calculate/show; mitarbeiter selection in case of admin & lektor in same account behaving as expected; added index creation to initial sql scripts; 2024-09-30 17:25:51 +02:00
SimonGschnell 23b7d18906 gives the content_childs of the CIS4_ROOT the correct ordering 2024-09-30 14:24:48 +02:00
SimonGschnell fa8aec2c2e adds the MyLv and the Stundenplan Menupunkt to the sql inserts and changes the content for the Dokumente redirect 2024-09-30 14:13:00 +02:00
SimonGschnell 6f0f3890f9 doesnt show the footer in the editProfil modal when opening a ProfilUpdate 2024-09-30 13:43:26 +02:00
SimonGschnell 8f617c6222 fixes littel bug with the edit-profil modal in the StudentProfil 2024-09-30 13:20:14 +02:00
SimonGschnell f38b0cf78f changes all the Headers from the CISHTML-Header to the CISVUE-Header 2024-09-30 11:58:20 +02:00
SimonGschnell 964f6c689c removes debugging prints 2024-09-30 11:44:31 +02:00
SimonGschnell 4a5a019841 loads the menu for the CISVUE-Header in the server side and not in the client side 2024-09-30 11:33:55 +02:00
SimonGschnell 24a2b4ba2f fixes the bug where the Menu is still selected in the LvModal after clicking on the back button 2024-09-30 11:20:20 +02:00
SimonGschnell 8c6f9d1bc4 loads the menu for the CISVUE-Header in the server side instead of the client side 2024-09-30 11:14:34 +02:00
SimonGschnell 0e385e8628 makes the menu of the CISVUE-Header also sticky now 2024-09-30 10:30:11 +02:00
SimonGschnell bbed90c814 moves the searchbar from the mobile view to the top of the header 2024-09-30 10:26:23 +02:00
SimonGschnell c0596c08c5 changes the header for the Dashboard to the CISVUE-Header and passes the selectedTypes props to fix the CISVUE Header search 2024-09-30 09:43:26 +02:00
SimonGschnell d1070656ac CIS4 MENU sql update COMPLETE 2024-09-27 13:38:29 +02:00
SimonGschnell 23badc3404 CIS4 MENU sql update WIP 2024-09-27 12:20:37 +02:00
ma0048 0f708f4934 - added app pep
- phrases
- added error
- added model
2024-09-27 11:23:54 +02:00
ma0068 0127982f50 use factories in Address.js, Bankaccount.js, Contact.js 2024-09-27 10:54:54 +02:00
SimonGschnell 73a2bf59f3 resolves buggs with the checkActiveUrl method 2024-09-27 10:44:09 +02:00
SimonGschnell bc6bc930fe moves the news titel to the component and adds css classes for darker dropdown buttons for the different menu levels 2024-09-26 12:05:44 +02:00
ma0068 9d5a0585b0 Phrases alerts, templates, tabulator 2024-09-26 07:56:15 +02:00
SimonGschnell b174818ed2 updates the active state of the menu based on the changed url 2024-09-25 15:02:35 +02:00
SimonGschnell b0a78658cf also makes the menu points active which redirect to an url hash 2024-09-25 13:35:41 +02:00
SimonGschnell a1fade0489 fixes the recursive function to find a child content_id 2024-09-25 12:25:19 +02:00
SimonGschnell 951d5bb2c7 all the parents of an active child are also active 2024-09-25 10:46:09 +02:00
SimonGschnell 3c050438b3 makes the dropdown button of the menu points darker to make them more visible 2024-09-25 09:26:08 +02:00
ma0068 1df91303f0 update Permissions, update validations, insert Termin1 with Termin2, finish phrases 2024-09-24 15:10:31 +02:00
SimonGschnell 7ed7ce1bb9 active Menu Entry logic for CISVUE 2024-09-24 14:57:41 +02:00
SimonGschnell 470192aabd fixes some bugs in the View/Entry.php for the Menu 2024-09-23 15:14:31 +02:00
SimonGschnell 45d350a76e changes the header for the news and puts the LV title in the card header / removes the lines of the lehrveranstaltungs optionenen 2024-09-23 13:24:58 +02:00
cgfhtw 7174f9cbe0 Use Merged Person 2024-09-20 14:38:33 +02:00
cgfhtw 6c08741450 Fist Draft 2024-09-20 14:31:25 +02:00
ma0068 4579c133a8 Validierung Eintragung Note after ExamDate, Hinweis KommPruefung, Phrases 2024-09-20 14:21:45 +02:00
SimonGschnell 98c85f1241 little changes to the view for the content 2024-09-20 14:20:44 +02:00
Johann Hoffmann a2e4704223 developing new components in lektor ui for ux improvements; anw function now explicitely in extension schema 2024-09-20 13:12:50 +02:00
ma0068 a7f51205b1 Show Kürzel Ma in Dropdown, Filter current semester, adapt Berechtigungen, reload semester 2024-09-20 11:41:44 +02:00
SimonGschnell 9343d1ee0c refactor Content_types template 2024-09-20 11:26:08 +02:00
SimonGschnell ca4865011d adds missing parameters to the getContent function 2024-09-20 11:21:59 +02:00
SimonGschnell 693313a23b renames/reuses lv-modal and fixes bugs associated with the modal 2024-09-19 09:35:36 +02:00
ma0068 f874ca43c0 Standard validations, show Hint KommPrfg, disable noten not active 2024-09-18 16:03:35 +02:00
SimonGschnell b9fd95741d moves the CalendarModal into the Stundenplan component instead of the Calendar component and changes the start_time and end_time computed properties 2024-09-18 14:40:58 +02:00
SimonGschnell 5877411db8 also loads the stundenplan data when the component is created 2024-09-18 13:52:49 +02:00
SimonGschnell f7b3af4939 makes the studiengang_semester reactive using computed when providing the value 2024-09-18 13:17:14 +02:00
SimonGschnell 164fc4b132 converts the dropdown of the lehrveranstaltungs optionen into a list inside the lv card 2024-09-18 12:52:55 +02:00
SimonGschnell 910a467fcc changes the stundenplan widget to use the new api endpoints that query the stundenplan events 2024-09-18 11:44:47 +02:00
ma0068 4d5ea1f519 adapt addNewPruefung, pruefungModal, function getLvsByStudent 2024-09-17 15:28:18 +02:00
SimonGschnell 6edc411a95 adds the LvMenu as dropdown options to the MyLV 2024-09-17 12:34:47 +02:00
SimonGschnell 5ca639101c fixes Month display of LVs 2024-09-17 11:39:39 +02:00
SimonGschnell d931aad11c solves reactive data problem in CalendarModal 2024-09-17 09:41:17 +02:00
SimonGschnell 61e6ad063a solves Telefon displaying as null for some benutzer 2024-09-17 09:28:11 +02:00
Cris d6d6d0ac48 Added phrases for softwarebereitstellung app 2024-09-16 18:22:28 +02:00
Cris 585cec31e2 Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite 2024-09-16 16:20:51 +02:00
Cris 2f0514092a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-09-16 16:20:12 +02:00
SimonGschnell e1c395146b refactors the LvMenu into its own component and removes debugging prints 2024-09-16 14:55:26 +02:00
SimonGschnell 4836ed8de0 adds LvMenu to the CalendarModel WIP 2024-09-13 13:44:53 +02:00
SimonGschnell b30156a65f catches errors better in Profil 2024-09-13 12:42:57 +02:00
SimonGschnell 88c38c9228 fixes ProfilUpdate bugs 2024-09-13 12:37:13 +02:00
SimonGschnell cf1cb44afa refactors old ProfilUpdate controller functions 2024-09-13 12:27:07 +02:00
SimonGschnell 2b9406b172 resolves zustellnungs value bug and removes debugging prints 2024-09-13 11:15:46 +02:00
SimonGschnell 29fac520f3 component was setting the topic false when trying to delete a kontakt or an adresse 2024-09-12 12:04:42 +02:00
SimonGschnell 1208c6829c when an error happenes to editProfil Modal will also be closed then 2024-09-12 11:53:13 +02:00
SimonGschnell 1de8c00990 fixes an error where the payload i treated like an object but is an associative array in the controller 2024-09-12 11:45:54 +02:00
SimonGschnell e247621f95 fixes the profilBearbeiten phrase and does update the topic correctly when adding a new kontakt/addresse in the profil 2024-09-12 10:47:31 +02:00
SimonGschnell cfea7e10f2 adds the reservierungen overview action for the search result with a room object and removes debugging prints 2024-09-11 14:51:52 +02:00
SimonGschnell 6cf3896d49 fixes Calendar.js 2024-09-11 14:38:00 +02:00
SimonGschnell cf4105dcb3 Merge branch 'feature-25999/C4_copy' into feature-25999/C4 2024-09-11 14:07:25 +02:00
SimonGschnell b79a3bd5e9 Merge branch 'master' into feature-25999/C4 2024-09-11 14:06:49 +02:00
SimonGschnell 04aaefd5d8 refetches the Stundenplan events also for the Stundenplan and not only for the roomplan 2024-09-11 14:00:53 +02:00
SimonGschnell aef267186f removes typo and debugging print from Calendar.js 2024-09-11 13:56:39 +02:00
SimonGschnell d80761d952 Merge branch 'feature-39912/Room_planning_calendar' into feature-25999/C4_copy 2024-09-11 13:54:45 +02:00
SimonGschnell 8860d9a598 adds quick fix for the query builder error that comes up when fetching content 2024-09-11 11:26:04 +02:00
SimonGschnell f2a57f85a8 fixes the errors with the stundenplan/reservierungen data query 2024-09-11 10:19:46 +02:00
SimonGschnell ac35ba3e27 puts the logic that adds the object informtion to the json reponse in the controllers instead of the models 2024-09-11 09:50:04 +02:00
SimonGschnell 1de658ace6 fixes the query for the reservierungen in the stundenplan and in the raum informations 2024-09-11 09:32:28 +02:00
SimonGschnell 715b8075b8 reworks the query for the reservierungen stundenplan/room 2024-09-10 12:30:40 +02:00
Johann Hoffmann 79d23a4557 Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp
# Conflicts:
#	public/js/components/Form/Upload/Dms.js
2024-09-10 11:25:19 +02:00
SimonGschnell 7b110aaf50 adds the needed phrase to the api/frontend/v1/Cms Controller 2024-09-09 14:16:37 +02:00
SimonGschnell 7a63301f08 puts profil settings ul outside of the sticky container 2024-09-09 13:49:38 +02:00
Harald Bamberger 5f50d9f0ec Merge branch 'feature-40311/Stundenplan_widget' into feature-25999/C4 2024-09-09 13:26:03 +02:00
SimonGschnell 26a0521379 fixes fhcapi 2024-09-09 13:12:11 +02:00
Harald Bamberger 996a49105b Merge branch 'feature-40309/Cis_News_widget' into feature-25999/C4 2024-09-09 13:03:47 +02:00
Harald Bamberger ff51d3964f Merge branch 'feature-40842/DashboardAmpeln' into feature-25999/C4 2024-09-09 12:56:55 +02:00
Harald Bamberger c2c30b86a1 Merge branch 'feature-40841/SearchBarChanges' into feature-25999/C4 2024-09-09 12:02:09 +02:00
Harald Bamberger 97b34d98fb Merge branch 'feature-41133/side_menu_sticky' into feature-25999/C4 2024-09-09 11:51:34 +02:00
Harald Bamberger 1f4628720a Merge branch 'feature-39911/Suche_um_raeume_erweitern' into feature-25999/C4 2024-09-09 11:50:27 +02:00
Harald Bamberger a8141e5dac Merge branch 'master' into feature-25999/C4 2024-09-09 11:45:10 +02:00
Johann Hoffmann 33122a0708 WIP performance testing & UI upgrades 2024-09-09 10:49:21 +02:00
Cris 92abfb8b58 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-09-09 10:26:07 +02:00
SimonGschnell ec8b3ccb6f adds the organisations bezeichnung through a subquery to the lehrveranstaltungs events 2024-09-06 13:11:22 +02:00
SimonGschnell 122673d291 gets rid of the stunden dependency and uses the beginn and ende property of the queried events 2024-09-06 11:20:20 +02:00
SimonGschnell 8376e8b92d bundles the room_events and the reservierungen api calls together with Promise.allSettled 2024-09-06 11:02:14 +02:00
SimonGschnell f9b69fe08c changes how the reservierungen are fetched from the database to have the same information as the room events 2024-09-05 14:57:57 +02:00
SimonGschnell e33162d20e changes the structure of the JSON data from the stundenplan 2024-09-04 14:59:56 +02:00
SimonGschnell 87f82b7f5d also adds the stundenplan information as object in the response of the endpoint 2024-09-03 12:07:13 +02:00
SimonGschnell f19c1b4eaf adds the lector and the gruppe as objects to the endpoint result instead of just strings 2024-09-02 14:47:40 +02:00
SimonGschnell 8c5ca521ac adopts the side menu for the desktop and mobile view 2024-09-02 10:42:01 +02:00
ma0048 7dc7816123 - fas neuer filter ueberfaellige buchungen 2024-08-30 08:21:35 +02:00
ma0068 de0fbdb72c Form, Table and Queries for new Tab Pruefung 2024-08-29 09:53:34 +02:00
ma0068 d254b9c10b Start Tab Pruefung, Abfrage Pruefungen 2024-08-23 11:58:08 +02:00
cgfhtw d542cf7720 s&d 2024-08-14 16:20:47 +02:00
cgfhtw c0e2cec556 s&d 2024-08-14 15:51:27 +02:00
SimonGschnell 3a466e8e0f puts nav-toggle and nav-menu-items in a sticky container 2024-08-13 15:27:51 +02:00
SimonGschnell 8bc8c67f8d better comments 2024-08-13 15:10:23 +02:00
SimonGschnell 36bd1795ed makes the cis4 side menu sticky 2024-08-13 15:04:44 +02:00
SimonGschnell cce58fdc31 removes debugging prints 2024-08-12 14:24:37 +02:00
Johann Hoffmann 8232224b21 LvMenu.php added codeigniter phrasen object to params; Using ci_phrases in Events.php for cis4 menu; 2024-08-12 14:20:42 +02:00
SimonGschnell 73dd89e5af adds phrasen library to LvMenu 2024-08-12 14:09:21 +02:00
SimonGschnell d7abc41137 adds digitaleAnwesenheiten menu point 2024-08-09 13:32:00 +02:00
ma0048 6f0575304c - ent/sperren mit hochkomma bug fixed 2024-08-09 11:54:01 +02:00
SimonGschnell ba2c450bd2 uses the codeigniter querybuilder to construct the active ampeln query 2024-08-07 15:43:20 +02:00
SimonGschnell 3f86961bda adds parameter to ampeln deadline/overdue phrase 2024-08-07 15:21:22 +02:00
cgfhtw 05e0d219f4 Codequality 2024-08-07 14:32:44 +02:00
cgfhtw 8b590dc58a optimizing Ampel Widget 2024-08-07 14:23:35 +02:00
SimonGschnell a6bef31862 corrects filter styling problem 2024-08-07 12:00:24 +02:00
cgfhtw e7a29dc21a Identation 2024-08-07 11:56:00 +02:00
SimonGschnell ceb8eb9671 corrects the way how to active ampeln check whether an ampel was bestaetigt or not and adds the Ampel_Benutzer_Bestaetigt_model 2024-08-07 11:52:50 +02:00
SimonGschnell 47a4b63172 changes the zustellungs warning for the Profil Adressen/Kontakte 2024-08-07 09:53:37 +02:00
SimonGschnell 46a0706057 updates roomEvents on change:range / groups the results of a studenplan query 2024-08-06 14:29:24 +02:00
SimonGschnell f0db878623 changes the headers from the news template from h5 to h2 but adds the bootstrap h5 class 2024-08-05 11:48:57 +02:00
SimonGschnell e44c1bccb3 adds shorthands with getDataOrTerminateWithError and adds also form_validation 2024-08-05 09:17:04 +02:00
SimonGschnell b350c9da56 refactors the news controller 2024-08-02 14:46:22 +02:00
SimonGschnell c5f57a0689 adds the bestaetigt property of the ampel when fetching all the active ampeln 2024-08-02 12:52:21 +02:00
SimonGschnell 3bb87ef8d3 corrects the translation of the ampel queries 2024-08-02 11:44:58 +02:00
SimonGschnell 4811f223b9 corrects little typo 2024-08-02 11:01:32 +02:00
SimonGschnell e6ba291549 adds the translation of the beschreibung and the buttontext in the Ampel_model and not in the Ampel controller 2024-08-02 11:00:11 +02:00
SimonGschnell 9e1bd2b64d adds form_validation 2024-08-02 10:36:34 +02:00
chfhtw fb6bca0ffb Merge pull request #46 from FH-Complete/feature-41134/bookmark_dashboardWidget
Feature 41134/bookmark dashboard widget
2024-08-02 09:59:51 +02:00
SimonGschnell 2de307682c convert identation to tabs 2024-08-02 09:26:39 +02:00
SimonGschnell 1d4f03e3f1 adds single phrase 2024-08-02 08:24:57 +02:00
SimonGschnell d4e33eb1df refactor 2024-08-01 15:04:18 +02:00
SimonGschnell 4317d5ebe9 tab spaces/ catch alerts 2024-08-01 14:16:20 +02:00
SimonGschnell 6fcc8cf7e8 code review changes 2024-08-01 11:49:14 +02:00
SimonGschnell bd7e45547f adds Phrasen to the Stundenplan dashboard widget 2024-07-31 14:51:43 +02:00
SimonGschnell 3641047963 adds bookmark phrasen and makes the data shared between the dashboard widget and the configuration view of the widget 2024-07-31 13:51:34 +02:00
cgfhtw cf440ffb43 Shared Data in Widget Component and Widget Config Component 2024-07-31 13:13:16 +02:00
SimonGschnell c2be0a4790 adds content to Url.js 2024-07-31 12:41:03 +02:00
SimonGschnell 8c84a63757 corrects how both the ampel and the ui phrasen are loaded 2024-07-31 09:40:50 +02:00
SimonGschnell 39574c1b3a adds delete endpoint for the dashboard bookmark widget 2024-07-30 15:27:24 +02:00
SimonGschnell 198b866268 adds fhcalert when confirming an ampel 2024-07-30 12:37:05 +02:00
SimonGschnell 02cf36c17c adds Phrasen to the dashboard ampel-widget 2024-07-30 12:25:26 +02:00
SimonGschnell 284cf711fd adds the sql scripts to create dashboard.tbl_bookmark and dashboard.tbl_bookmark_sequence 2024-07-30 11:26:22 +02:00
SimonGschnell f4210e7671 fixes the Vue component layout for the ampeln dashboardwidget 2024-07-29 13:44:17 +02:00
SimonGschnell 2c45478877 fixes the fetched ampeln in the ampelWidget 2024-07-29 13:17:29 +02:00
SimonGschnell 65b71191a0 adds +1 to month in getMonth() function because the month index of a javascript date starts with 0, additional cleanup in Ampel.js Widgett 2024-07-26 15:41:21 +02:00
SimonGschnell fb30a8e009 translates the ampel queries in separate private function 2024-07-26 14:07:56 +02:00
SimonGschnell ca6e3a8463 adds endpoint to query all user ampeln that were assigned after the start_working_date with the appropriate beschreibungs translations 2024-07-25 15:16:01 +02:00
SimonGschnell 0849e795a0 also adds the horizontal line under the heading 2024-07-24 14:59:02 +02:00
SimonGschnell 012cbe9a25 pulls the header out of the content div which makes the headings smaller in the content view with a specific css 2024-07-24 14:57:11 +02:00
SimonGschnell e9d45b6532 removes the old way a modal was shown in the news widget of the dashboard 2024-07-24 14:51:04 +02:00
SimonGschnell 94df440f88 adds a heading to the Content and the News View again 2024-07-24 14:49:58 +02:00
SimonGschnell 4e929f4cce Merge branch 'feature-25999/C4' into feature-40309/Cis_News_widget 2024-07-24 14:40:15 +02:00
SimonGschnell 563f5e5f9e merging C4 2024-07-24 14:37:16 +02:00
SimonGschnell 1e3146d33f dashboardAmpeln 2024-07-24 13:31:00 +02:00
SimonGschnell 4b0878b248 Merge branch 'master' into feature-39911/Suche_um_raeume_erweitern 2024-07-24 13:00:52 +02:00
SimonGschnell 1211d63ccf adds placeholders for the ampeln and adds new endpoints that fetch activeAmpeln and confirmedActiveAmpeln of the user 2024-07-23 13:59:04 +02:00
SimonGschnell 7e983292ea adds the endpoint that fetches all ampeln of a user that are not confirmed by the user yet and also removes some unnecessary comments from other enpoints 2024-07-23 11:26:52 +02:00
SimonGschnell 2083e95f8c adds vertical layout for the documents view when the viewport is less than lg 2024-07-23 09:14:38 +02:00
SimonGschnell f207419859 removes the import for userdata and profilUpdate from the old fhcapi which should be replaced by the new fhcapi 2024-07-23 08:58:52 +02:00
SimonGschnell e613ac3255 computes the childactions for the room in the search result independently 2024-07-22 14:33:19 +02:00
SimonGschnell 9170653260 adds a childaction for the rooms when searching for a room to see the eventoverview of the room 2024-07-22 14:07:00 +02:00
SimonGschnell f4bf3eec86 merging feature-39911/Suche_um_raeume_erweitern 2024-07-22 12:55:01 +02:00
SimonGschnell 82417a7f6f removes old api files and removes the use(fhcApi) because it is already imported in the Phrasen plugin 2024-07-22 11:36:12 +02:00
SimonGschnell a0871657ca adds insertFile to the new ProfilUpdate FhcAPIController and starts a transaction when deleting the foreign key from the profil update and deleting the old file 2024-07-22 11:24:47 +02:00
SimonGschnell 0cc6222175 adds deleteProfilRequest to the new ProfilUpdate FhcAPIController 2024-07-19 14:57:42 +02:00
SimonGschnell 8700abd0fa adds updateProfilRequest to the new ProfilUpdate FhcAPIController 2024-07-19 14:50:00 +02:00
SimonGschnell 12626511e9 adds insertProfilRequest to the new ProfilUpdate FhcAPIController 2024-07-19 14:00:40 +02:00
SimonGschnell a06f9b581f adds selectProfilRequest to the new ProfilUpdate FhcAPIController 2024-07-19 13:11:58 +02:00
SimonGschnell be66150631 adds acceptProfilRequest and denyProfilRequest to the new ProfilUpdate FhcAPIController 2024-07-19 11:38:15 +02:00
SimonGschnell 9eb61649eb adds getProfilRequestFiles to the new ProfilUpdate FhcAPIController 2024-07-19 09:06:49 +02:00
SimonGschnell ddd4d5bafe parses the links in the moodle addon dynamically, so that other addons can easily override the phrase used for the links 2024-07-18 14:03:15 +02:00
SimonGschnell 2711113a69 solves column title race condition 2024-07-18 11:43:08 +02:00
SimonGschnell 328a46f16d adds getTopic to the new ProfilUpdate FhcAPIController 2024-07-18 10:40:30 +02:00
SimonGschnell 885315c22b adds getStatus to the new ProfilUpdate FhcAPIController 2024-07-18 09:52:08 +02:00
SimonGschnell 29aa7f5056 adds isMitarbeiter to the new Profil FhcAPIController 2024-07-18 09:36:30 +02:00
SimonGschnell fdd3026212 adds getAllNationen to the new Profil FhcAPIController 2024-07-18 08:53:45 +02:00
SimonGschnell da8bb697df change url of Gesamtnote Menu Punkt 2024-07-16 15:42:42 +02:00
SimonGschnell 3417dcd41d centers the text, displays default message and makes # links not clickable and removes the link styling from them 2024-07-16 15:18:23 +02:00
Johann Hoffmann 630d2659b3 extension/anwesenheit_assistenz -> extension/anw_ent_admin; removed hardocoded status; check for overlapping excuse timespans; and a lot more ;) 2024-07-15 17:38:13 +02:00
SimonGschnell 14df81cbfb adds c4_linkList and additional styling to the LvUebersicht Menu 2024-07-12 16:14:20 +02:00
SimonGschnell 1614771150 loads content of the menu punkte in iframe inside a full-screen modal 2024-07-12 13:17:44 +02:00
ma0048 c94f185308 - faktor für lvs hinzugefuegt 2024-07-10 15:13:46 +02:00
SimonGschnell a83e07350e makes the pinboard link redirect to all news 2024-07-10 11:35:36 +02:00
SimonGschnell d364630d92 instead of modifying the original menu keys, it adds new keys for the cis4 version of the menu 2024-07-10 10:48:24 +02:00
SimonGschnell bc9f247323 replaces wrong quatations in the menu items if the link_onclick array key is defined 2024-07-10 09:10:35 +02:00
SimonGschnell 56080f6681 changes the LVUebersicht and the endpoint 2024-07-09 15:28:28 +02:00
SimonGschnell 8a44a9e1af passes the menu as a reference to the on Events instead of using a callback function 2024-07-09 10:37:43 +02:00
SimonGschnell 84029fc729 updates editAdressen in the Profil 2024-07-08 15:15:08 +02:00
Johann Hoffmann 66b151dce0 Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2024-07-08 14:42:01 +02:00
SimonGschnell 0347f8bf02 filters the menu to remove all elements that don't have the position property 2024-07-08 11:43:48 +02:00
SimonGschnell e98f59e984 adds all menu punkte from fh-core to the LvMenu endpoint function 2024-07-08 10:54:39 +02:00
SimonGschnell 578afaeb08 adds fh-core menu logic WIP 2024-07-05 15:21:14 +02:00
SimonGschnell 08555a77be makes contentModal bigger for the room content and uses the raum_info component to insert the tabulator in the content 2024-07-05 10:00:54 +02:00
SimonGschnell 79ffc1c077 creating lvMenu with Event hooks WIP 2024-07-04 15:37:50 +02:00
SimonGschnell 92afdf71cd changing fhcapi for the client side for the profil WIP 2024-07-03 15:53:01 +02:00
SimonGschnell 2a7735bca5 outsources internal queryies to the appropriate classes, to assign the values to the needed variables to fill the menu array of the menu_lv.inc.php 2024-07-03 11:56:18 +02:00
Johann Hoffmann affbe7821a email vorlagen sql insert; trim entschuldigungs begründung to max size; WIP routing; WIP fancy loader overlay; WIP Api Testing; lektor ui finetuning; 2024-07-02 16:51:42 +02:00
SimonGschnell 19753a9ef7 test api endpoint to include the lvinfo menu link 2024-07-02 14:50:54 +02:00
SimonGschnell 57d3d3af13 removes the shared storage for the searchbar and saves the data local in the searchbar again 2024-07-02 10:28:35 +02:00
SimonGschnell 3d2ea2821e fixes little typo, that fails to render the widget 2024-07-02 09:26:19 +02:00
SimonGschnell ff0f2320e1 changes the layout of the searchbar to be the same in the mobile view and in the desktop view 2024-07-01 14:43:43 +02:00
SimonGschnell f4f08c0710 stores the local information of the searchbar inside a collected storage in case more than one searchbar is used 2024-07-01 13:53:55 +02:00
SimonGschnell 3e3f005525 changes the layout/buttons of the searchbarsettings, adds responsive searchbar in the header for mobile views 2024-06-28 14:34:41 +02:00
SimonGschnell d0f457d8ed changes the data format from the studierendenEmail api call and displays the mailto on the modal 2024-06-28 11:06:44 +02:00
SimonGschnell c34144a4e8 creates sql query in the lehreinheit_model to query the studierenden Mail inside a lehrveranstaltung and creates the matching fhcapi methods / frontend/v1 api controllers 2024-06-27 15:09:09 +02:00
SimonGschnell ffc1241188 news widget 'alle News' redirects to the news URI 2024-06-27 11:53:22 +02:00
SimonGschnell 5070353bf0 passes the active_addons constant to the LvUebersicht Modal 2024-06-26 16:37:54 +02:00
SimonGschnell a540ac3f7e adds a General view for the content_types that dont need any special extra computation 2024-06-26 15:58:50 +02:00
Johann Hoffmann 1305633511 removed 99% of console.logs; fixed entschuldigung update notiz only; added kontrolleDeleteMaxReach Constant from config; updateAnwesenheiten notiz fix; Entschuldigungs studiengang fetch fix; 2024-06-26 15:38:22 +02:00
SimonGschnell 93b7f6e57c fixes little typo 2024-06-26 15:20:19 +02:00
SimonGschnell 4640db5aff adds a view components for the news if the content that gets loaded has the template_kurzbz news 2024-06-26 14:17:44 +02:00
SimonGschnell 478adb740e changes the db query and adopts the layout of the Vue component to show the correct betreff and content of the news 2024-06-26 13:21:32 +02:00
SimonGschnell f546554f87 changes the layout of the news widget in the dashboard 2024-06-25 16:48:05 +02:00
SimonGschnell f4176ebcda adds the content of the news to the dashboard items and makes them scrollable through css classes 2024-06-25 14:18:11 +02:00
Johann Hoffmann dd044b9146 entschuldigungen reload fix; student anw group header toggle fix; scan error msg fix; delete modal with kontrolle selection; scan code route renamed to profile/scan from student/scan; fixed sum formatting; 2024-06-24 16:35:48 +02:00
SimonGschnell 27287bd07a creating the api endpoint that fetches the content of the news instead of text metdata 2024-06-24 16:05:51 +02:00
SimonGschnell 7267d526bb rendering content pages 2024-06-24 14:23:34 +02:00
SimonGschnell f8c431e0bc updating comment of the content function 2024-06-24 14:23:34 +02:00
SimonGschnell 629ea3716e changes how the content and the news are displayed and also modifies the modals for the roominformation which now get their data from props instead of passing them directly via refs 2024-06-24 14:23:34 +02:00
SimonGschnell 6230aa47ae now also displays the room information inside a modal and does not redirect to the content site 2024-06-24 14:23:34 +02:00
SimonGschnell b3dfcdc295 the calendar modal is correctly opened when the correct event is called 2024-06-24 14:23:34 +02:00
SimonGschnell bb9d4bda04 adds a general modal for the lehrveranstaltungs Uebersicht with all the links connected to the lehrveranstaltung 2024-06-24 14:23:34 +02:00
SimonGschnell d92ad0a6c6 links the ort_kurzbz from the Stundenplan in the Dashboard to the Ort Information Content 2024-06-24 14:23:34 +02:00
SimonGschnell 63f089dc27 changes the layout of the Stundenplan Events 2024-06-24 13:50:13 +02:00
SimonGschnell 77cd3bb02d removes the z-index from the calendar header so that it doesn't show over the menu when used in mobil view 2024-06-24 13:11:55 +02:00
SimonGschnell 008847e490 adds a sql query for the grouping algorithm 2024-06-24 13:08:44 +02:00
Johann Hoffmann 570798b5f7 landing page is now container for tabs or single component directly; WIP reworking lektor UI; 2024-06-24 10:51:23 +02:00
Johann Hoffmann b4b44d9a89 added entschuldigung & anw_user notizen; entschukldigung notizen working; WIP anw notizen; api fixes entschuldigung; LE for LVA fetch now disregarding stundenplan; Paths renamed to new controller names; 2024-06-18 14:15:35 +02:00
Johann Hoffmann 473815639b added entschuldigung max reach constant; rewrote SQL queries from string insert to param escaping; removed Stundenplan Lookup from LE for LVA fetch; load LE Stundenplan termine and serve as option when starting new kontrolle. 2024-06-17 17:39:56 +02:00
SimonGschnell a0472c6573 little changes 2024-06-14 14:44:29 +02:00
SimonGschnell f83cd3b87a checks whether the user wants to fetch content or the news 2024-06-14 11:18:29 +02:00
SimonGschnell dd7c8480f3 removes unwanted methods and properties from CalendarModal 2024-06-13 12:29:36 +02:00
SimonGschnell de4accab83 cleans up the Stundenplan grouping algorithm 2024-06-13 12:27:09 +02:00
SimonGschnell d1afd9f09d groups the uids of the reservierungen in the raum uebersicht and renders different template if the calender entry is a reservierung or a stundenplan event 2024-06-12 14:42:30 +02:00
SimonGschnell 9c51f25c9e modifies how the slot template from the Calendar Page is passed to the CalendarApp and prints the reservierungen differently (but the reservierungen are not grouped yet) 2024-06-11 15:03:09 +02:00
Johann Hoffmann e7e5d76531 fhcapi use factory merge 2024-06-10 17:23:37 +02:00
Johann Hoffmann 52a55a018c merge fix 2024-06-10 15:13:30 +02:00
Johann Hoffmann aa1d70f8f0 fix 2024-06-10 13:35:06 +02:00
Johann Hoffmann 9350e9230f API refactor 2024-06-10 13:30:44 +02:00
SimonGschnell 022ad26dd2 reservierungen query also joins the studiengangs and mitarbeiter information 2024-06-10 13:01:55 +02:00
SimonGschnell 392d8f38d2 adding the reservierungen to the room plannung 2024-06-10 11:39:16 +02:00
SimonGschnell 8442690bc7 splits the multiple stg into different rows if there are more than one stg in one lv 2024-06-10 10:56:12 +02:00
SimonGschnell 70b0b3fae7 MVP algorithm for stundenplan gruppierung (testing) 2024-06-07 15:06:28 +02:00
Johann Hoffmann 068aa03b4f Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp 2024-06-06 11:02:56 +02:00
SimonGschnell 25d284389a gruppieren algorithm erweitern 2024-06-06 09:25:46 +02:00
SimonGschnell 1a5d270936 calendarDate preparation 2024-06-04 15:00:41 +02:00
SimonGschnell 3df1aaf371 uses the new fhcApi factory to make the roomInformation get request from the frontent/v1/stundenplan api and uses the CalendarDate class to get the first day of the week and the last day of the week to make the request for the room information over the whole week 2024-06-04 08:24:58 +02:00
Harald Bamberger 7491b9c1b0 try to fix mobile dashboard view 2024-06-03 11:35:11 +02:00
Harald Bamberger 204de30459 make news modal more responsive 2024-06-03 10:46:26 +02:00
Harald Bamberger 92319b9b29 quick fix for overlapping dashboard elements on mobile phones 2024-06-03 10:27:03 +02:00
SimonGschnell 39321dcde3 adds the roomInformation Calendar to the menu and uses different template for the calendar page slot 2024-05-31 12:28:06 +02:00
SimonGschnell b9bd8e1d4d Merge branch 'feature-25999/C4' into feature-39912/Room_planning_calendar 2024-05-31 08:53:40 +02:00
SimonGschnell 5021c47c9f calendar style changes 2024-05-27 12:20:58 +02:00
SimonGschnell 87681351b9 Merge branch 'feature-25999/C4' into feature-39912/Room_planning_calendar 2024-05-27 10:55:44 +02:00
SimonGschnell 16f90604b6 stundenplan modal for LVs and making calendar header sticky 2024-05-24 11:17:06 +02:00
SimonGschnell 234ec03db9 adds the phrase noGrade 2024-05-24 09:37:07 +02:00
Johann Hoffmann 0536ff0044 load person_id & uid for students to navigate them with admin view; WIP studentDropdown selection; WIP changing studentComponent to work with different permissions; 2024-05-23 16:49:53 +02:00
SimonGschnell 729509a45d WIP 2024-05-23 15:40:23 +02:00
SimonGschnell 12b2f3ab07 adding more information to the cis40 stundenplan 2024-05-23 15:39:31 +02:00
Alexei Karpenko 854d836e30 Abschlussprüfungsprotokolle: added link in FAS to read-only form 2024-05-23 13:56:18 +02:00
SimonGschnell 25deb0a440 takes the value of the node not just the node 2024-05-23 13:01:18 +02:00
SimonGschnell cef41f3710 fixes html, one closing div to much 2024-05-23 12:44:12 +02:00
Johann Hoffmann 59a1e84fb2 Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp
# Conflicts:
#	public/js/components/filter/Filter.js
#	public/js/plugin/FhcApi.js
#	system/dbupdate_3.4.php
2024-05-22 15:42:19 +02:00
SimonGschnell 186e9e6f08 WIP room planning in calendar 2024-05-21 15:56:18 +02:00
SimonGschnell c566d07847 fixes little xml layout issue 2024-05-21 13:34:58 +02:00
SimonGschnell 48bb2ef7e1 adds the insert query for the new raum template and the update statement to update the template for every room content 2024-05-21 11:05:22 +02:00
SimonGschnell 393475e62c adds the content update script for the room content to the checksystem 2024-05-21 10:49:27 +02:00
SimonGschnell d07c568d5e adds dbupdate queryies for the new raum template 2024-05-21 10:37:53 +02:00
Johann Hoffmann 7530a74ff3 demo stand gf; 2024-05-16 16:39:54 +02:00
SimonGschnell c7e01bd3f2 creates the sql query with the needed room information to be displayed in the search 2024-05-15 14:37:18 +02:00
SimonGschnell 56e6efe416 WIP sql query for the raum search 2024-05-14 15:57:48 +02:00
SimonGschnell 841e3b0390 raum query 2024-05-14 14:21:52 +02:00
Harald Bamberger b3c6127cfe Merge branch 'feature-25999/C4_TEST' into feature-25999/C4 2024-05-14 14:01:24 +02:00
Johann Hoffmann 3b762c8065 getStudentsForLvaInSemester data query; getLektorIsTeachingLE veryfication query; getLektorenForLvaInSemester selection query; moved setup from app to landing page, landing page thus unskippable; now checking qr code age in check in; charts smaller size now; more phrasen; lektor tabulator height fix; ma uid selection of lektors for admin and assistenz; tested and implemented QRDelete Cronjob; 2024-05-13 16:01:26 +02:00
SimonGschnell fd8e49c11f hotfix in Modal.js 2024-05-08 14:35:41 +02:00
SimonGschnell 6fa5ff81d6 Merge branch 'feature-25999/task-39464' into feature-25999/C4_TEST 2024-05-08 12:01:53 +02:00
SimonGschnell 0942480428 adds the missing model for the function 2024-05-08 11:58:35 +02:00
SimonGschnell 2fd2746a74 Merge branch 'feature-25999/task-39464' of github.com:FH-Complete/FHC-Core into feature-25999/task-39464 2024-05-08 11:56:50 +02:00
SimonGschnell 8e2129902c Merge branch 'feature-25999/task-39464' into feature-25999/C4_TEST 2024-05-08 11:29:39 +02:00
SimonGschnell d0509abb8b also adds the new controller functions to the CisVue/Cms and CisHmvc/Cms 2024-05-08 11:28:16 +02:00
SimonGschnell c2a782e164 updates news fetching and DB_Model pagination methods 2024-05-08 11:28:16 +02:00
SimonGschnell 5ac0b249ec makes component Pagination page_size prop a required prop 2024-05-08 11:28:16 +02:00
SimonGschnell 5142f5656b passes the page_size down from the parent component to the child component 2024-05-08 11:28:16 +02:00
SimonGschnell 7bd70a6436 makes it possible to send the page_size from the frontend to the backend to adopt how many rows to query 2024-05-08 11:28:16 +02:00
SimonGschnell c017014171 changes how the pagination is done in the DB_Model 2024-05-08 11:28:16 +02:00
SimonGschnell 36c8862b99 implementing frontend pagination for components 2024-05-08 11:28:16 +02:00
SimonGschnell 29f7e34e10 adds pagination logic to C4 news 2024-05-08 11:28:16 +02:00
SimonGschnell 730db74743 Merge branch 'feature-25999/C4_ma0594_profilePage' into feature-25999/C4_TEST 2024-05-08 11:14:41 +02:00
SimonGschnell d1207ced02 Merge branch 'master' into feature-25999/C4_TEST 2024-05-08 11:06:34 +02:00
SimonGschnell fb6bb96fbd making Filter-core-cmp emit the tableBuilt event 2024-05-08 10:58:38 +02:00
SimonGschnell 9db09a040a Merge branch 'master' into feature-25999/C4_ma0594_profilePage 2024-05-08 09:58:18 +02:00
SimonGschnell a563f053ef adds the width and the height properties to the dashboard item, they were missing and caused a bug where the news widget was not displaying correctly 2024-05-06 14:19:04 +02:00
Johann Hoffmann 3846f38a6f added PK to tbl_anwesenheit_check; chenged anwesenheiten sum function to account for timespans of the checks; added extension/anwesenheit_admin berechtigung; fotos are now being sent as links to bild.php; studentByLva table now with von & bis times of the check; now updating attendance check times when starting further checks on the same date; checking if time the code is being sent is in the timespan of the kontrolle; added method to delete QR codes older than certain ms to be called from QRDelete Cronjob; 2024-05-06 11:21:01 +02:00
SimonGschnell efcebb567f responsive adjustments 2024-05-03 10:46:20 +02:00
SimonGschnell e6ad3b3168 adjust responsiveness of createAnrechnung.php 2024-05-03 10:35:46 +02:00
SimonGschnell f9058b954e adjusting the responsive layout for approveAnrechnungDetail view 2024-05-03 10:31:53 +02:00
SimonGschnell 4aa8807830 adds responsiveness for the view approveAnrechnungUebersicht 2024-05-03 09:48:18 +02:00
ma0068 6e9ee7cf81 Notizcomponent: Api Controller for Notizzuordnungs_ids 2024-05-03 09:43:49 +02:00
SimonGschnell 9975f767b8 adds responsiveness to reviewAnrechnungDetail.php 2024-05-02 12:15:57 +02:00
SimonGschnell 0b58d4fd6f also adds the programmatically unselectable logic to the reject button 2024-05-02 11:43:19 +02:00
SimonGschnell bcafb6cea6 removes unnecessary function call from reviewAnrechnungUebersicht.js 2024-05-02 11:30:38 +02:00
SimonGschnell 6ea802717b adds pointer-events none to all rows with the class .tabulator-unselectable except for the links inside those rows, because it was not possible to programmatically retrigger the selectableCheck 2024-05-02 11:14:12 +02:00
Johann Hoffmann 2c08a482e3 finished phrasen in backend; setup component is no a modal in landing page and only for lektors with multiple LE assigned in an lva; assistenz skips landing page; tabulator formatting fixes; getAllAnwesenheitenByLektor now fetches students and their anwesenheiten entries seperately which is significantly faster; 2024-05-02 09:29:50 +02:00
SimonGschnell 10bfb6c9e8 also fixes the isSelectable bug when rejecting a anrechnung in the approveAnrechnungenUebersicht view 2024-04-30 15:03:30 +02:00
SimonGschnell 86d3042cc6 makes the rows that were recently selected unselectable and adds the correct styling in the approveAnrechnungUebersicht view 2024-04-30 14:18:22 +02:00
SimonGschnell ac0103751d adds a border to the tableWidget and also adds a function that finds the tableunqiueid using the tableInstance 2024-04-30 09:48:08 +02:00
SimonGschnell 20a2e369c5 adds new button to show all new and changed lehrauftraege in the orderLehrauftrag view, so that the user can set the initial filter himself 2024-04-29 15:53:56 +02:00
SimonGschnell 555db0d5af fixes the selection of the tableUniqueID 2024-04-29 11:45:08 +02:00
SimonGschnell b0d31361c1 updates fontawesome version 2024-04-29 11:38:03 +02:00
SimonGschnell 8cf63f3b76 replaces the icons images with actual icons from the fontawesome6 library 2024-04-29 11:34:18 +02:00
SimonGschnell ffe4fcb0b3 removes the cis styles from the admin views 2024-04-26 14:43:56 +02:00
SimonGschnell dec6b160a6 fixes the acceptLehrauftrag view with bootstrap5 and tabulator5 2024-04-26 14:07:24 +02:00
SimonGschnell e4f1da751d migrating the acceptLehrauftrags view to bootstrap 5 2024-04-25 15:19:24 +02:00
SimonGschnell 88fd26d192 Merge branch 'master' into feature-36185/requestAnrechnung_bootstrap3_zu_bootstrap5 2024-04-25 14:35:50 +02:00
SimonGschnell 580b6239c2 remove the body tag from all views that use the FHC-Header view 2024-04-25 14:35:06 +02:00
SimonGschnell b7ffe00c69 sets the height of the adminZeitverfuegbarkeit to 50% of the screen ehight 2024-04-25 14:16:28 +02:00
SimonGschnell d01b05fd73 edit anrechnungszeitfenster does actually edit and not insert a new anrechnungszeitfenster 2024-04-25 13:30:32 +02:00
SimonGschnell deb0197452 fixes the adminAnrechnungen page 2024-04-25 13:13:24 +02:00
SimonGschnell fed30daad0 bug fix, only appending the event to the accept and deny action button if they were actually created 2024-04-25 09:41:32 +02:00
SimonGschnell a2e943ac40 adjusts the actions of the ProfilUpdateView table with accept and deny buttons 2024-04-25 09:29:47 +02:00
Johann Hoffmann f5d534a409 added require branch update file in dbupdate_3.4.php; added phrasen everywhere in frontend, WIP translating backend messages; 2024-04-24 15:52:53 +02:00
SimonGschnell cea06994de fixes the bug with the columnDefault tooltips that was inside the TableWidget.js file 2024-04-24 14:59:46 +02:00
SimonGschnell 5a62dbc740 refactors the adminAnrechnung page because it is used in an bootstrap3 environment 2024-04-24 11:35:02 +02:00
SimonGschnell 7dfe2f1932 tabulator5 function changes 2024-04-24 10:00:12 +02:00
Johann Hoffmann 633b9eeafe loading STG permissions for assistenz into frontend and only fetching entschuldigungsdata for those; new data fetch api methods for lektor to visualize graphs: getAllByLva & getAllByStudiengang. old one renamed to getAllByLvaAssigned; automatic email to responsible adress on entschuldigung upload of a student; focused on pie charts for reusable landing page design; fixed entschuldigungen date filter validation; WIP extension specific phrases; 2024-04-23 17:00:32 +02:00
SimonGschnell 96b79c8740 corrects reviewAnrechnungDetail style typo, and adds the height function to the adminAnrechnung table again 2024-04-23 13:43:00 +02:00
SimonGschnell bebec98285 adds a little space with a br between the tablewidget header and the table itself 2024-04-23 13:16:04 +02:00
SimonGschnell 8d68faf922 replaces the pull-right class with a conditional if bootstrapVersion was set to 5 2024-04-23 13:06:02 +02:00
SimonGschnell 9ae36b54e1 remove the 50% height from the table and add fitColumns to the table so that the columns take the whole available space 2024-04-23 12:55:44 +02:00
SimonGschnell 11c9622186 replaces the anrechnungen.css with styles in the zeitverfuegbarkeit view 2024-04-23 12:50:29 +02:00
SimonGschnell 3a1ac15740 adds the button width and margin classes from the Tabulator.css (used in Tabulator4) to the anrechnungen.css file 2024-04-23 12:47:17 +02:00
SimonGschnell 51ee16926c adds a tabulator redraw when adding the details column to the tableWidget 2024-04-23 09:49:41 +02:00
SimonGschnell e1fac8e871 adds the bootstrapVersion flag to all the TableWidgetData files 2024-04-22 17:11:02 +02:00
SimonGschnell 977c2d4432 Merge branch 'master' into feature-36185/requestAnrechnung_bootstrap3_zu_bootstrap5 2024-04-22 15:18:19 +02:00
SimonGschnell 258c5f7777 Merge branch 'master' into feature-36185/requestAnrechnung_bootstrap3_zu_bootstrap5 2024-04-22 14:56:07 +02:00
SimonGschnell e2e7966f83 adds accept and deny actions in the actions column of the ProfilUpdateView component 2024-04-22 14:55:37 +02:00
SimonGschnell 349865b8fb fixes the phrasen for the column titles of the ProfilUpdateView 2024-04-22 13:52:38 +02:00
SimonGschnell 27428b15bb changes the escaping string for the xslt_xhtml_c4 2024-04-22 11:49:19 +02:00
Harald Bamberger 93ae5577f8 try with here documents 2024-04-22 11:25:24 +02:00
SimonGschnell 1447a930d3 adds more phrasen to the profil and the profilUpdate views, headers of tables phrasen 2024-04-19 14:24:32 +02:00
SimonGschnell 4bb9c61168 also fixes the phrasen for the student/Mitarbeiter View Ansicht 2024-04-18 15:06:38 +02:00
SimonGschnell bc0d581402 fixes phrasen in the studentProfil 2024-04-18 15:00:28 +02:00
SimonGschnell 4e5379c5d9 adds an edit button over every section in the profil page to edit that section 2024-04-18 14:53:51 +02:00
SimonGschnell cc0ea44de3 also adds the new controller functions to the CisVue/Cms and CisHmvc/Cms 2024-04-18 11:56:55 +02:00
SimonGschnell 3993d614d4 updates news fetching and DB_Model pagination methods 2024-04-18 11:52:58 +02:00
SimonGschnell 71f63095c2 makes component Pagination page_size prop a required prop 2024-04-17 15:15:51 +02:00
SimonGschnell 92f2c6e0a2 passes the page_size down from the parent component to the child component 2024-04-17 15:12:55 +02:00
SimonGschnell 284ae0637e makes it possible to send the page_size from the frontend to the backend to adopt how many rows to query 2024-04-17 14:54:22 +02:00
SimonGschnell 6c642f1242 changes how the pagination is done in the DB_Model 2024-04-17 14:23:09 +02:00
SimonGschnell d77499b73b implementing frontend pagination for components 2024-04-15 13:35:33 +02:00
Johann Hoffmann 563e7bebc0 setupComponent currently uses globalProperties as model for le selection; lektorComponent uses globalProperties for le_id; le_selection now has sophisticated info String detailing every group associated with le for lektor; WIP assistenz filter setup; WIP checking in router guard for missing le_id when they have not loaded yet; 2024-04-12 15:01:37 +02:00
SimonGschnell ad956bef8e adds pagination logic to C4 news 2024-04-12 14:38:01 +02:00
SimonGschnell ea9bd93e73 phrasen fix and bug where profilUpdates were only sorted when accepting the request and not denying 2024-04-12 09:39:28 +02:00
SimonGschnell 86504fd663 doesn't show the footer if the view inside the EditProfil Modal is set to Status 2024-04-11 11:39:29 +02:00
SimonGschnell 2b68831415 adds more filter options for the ProfilUpdateView 2024-04-11 11:20:32 +02:00
SimonGschnell 4fc4cd762d adopts logic to fetched profilUpdate status and topic from the database 2024-04-11 09:15:19 +02:00
SimonGschnell 21c2bafed6 adapt the logic of the profilUpdate feature to use constant status and topics from the database 2024-04-10 15:08:21 +02:00
SimonGschnell 5b2365a1e2 stores the status of profilUpdate with their language in the database and adapts the logic to it 2024-04-09 15:02:17 +02:00
SimonGschnell 78031bf1ad fixes buggs that were produced with the introduction of new phrasen 2024-04-09 09:08:47 +02:00
SimonGschnell 2df91bce5c adds phrasen to the ProfilUpdateView.js file 2024-04-08 15:49:28 +02:00
SimonGschnell 960341e25d adds more profil phrasen error messages 2024-04-08 15:08:20 +02:00
SimonGschnell 1b04d70839 adds phrasen for profil in php controller and adds error message phrasen 2024-04-08 15:03:08 +02:00
Johann Hoffmann cf0c7a2f8c put le_ids aswell as viewdata for le selection in globalProperties to share between components; using FhcApi Plugin for API calls; le selection in setup now with info (gruppe_kurzbz, lehrform_kurzbz, semester, verband, gruppe); fixed setting foto in viewData after refreshing sum eg after kontrolle; 2024-04-08 12:25:25 +02:00
SimonGschnell b77e56161d fixing some not working phrasen 2024-04-08 09:58:53 +02:00
SimonGschnell 0cd86e3e54 cannot use this keyword when assigning default values to props in componenets 2024-04-05 14:57:00 +02:00
SimonGschnell 150b4ec09d phrasen for acceptDenyUpdate.js and ProfilUpdateView.js 2024-04-05 10:33:23 +02:00
SimonGschnell c1cb2904e6 adding phrases for Profil and ProfilUpdate 2024-04-04 15:02:47 +02:00
SimonGschnell 6af2a01166 tabulator5 migration changes 2024-04-04 09:55:41 +02:00
SimonGschnell 2e5f53f59a changes tabulator cell alignment in tabulator5 2024-04-04 09:36:46 +02:00
SimonGschnell dd2f982e95 adding the uniqueID jquery identifier to acceptLehrvertrag.js 2024-04-03 14:33:35 +02:00
SimonGschnell a2d71d3a8d adjusts how the AcceptDenyModal is used and included in the ProfilUpdateView 2024-04-02 16:38:29 +02:00
SimonGschnell 51a65495aa corrects the insertion of the dms_kategorie profil_aenderung in the checksystem 2024-04-02 15:31:56 +02:00
SimonGschnell e33d863732 upgrades pruefungsprotokollUebersicht to tabulator 5 2024-04-02 13:03:52 +02:00
SimonGschnell 4e3ab802b6 removes unnecessary debugging log 2024-04-02 12:49:33 +02:00
SimonGschnell d8fb36543f migrates adminZeitverfuegbarkeit to tabulator5 2024-04-02 12:46:51 +02:00
SimonGschnell e29dfd99f3 migrate approveLehrauftrag/acceptLehrauftrag/orderLehrauftrag to tabulator 5 2024-04-02 12:34:51 +02:00
Johann Hoffmann 927ed934c0 new Controller & routes for Landing Page; Fixed querying students for n LE; Pictures in LektorOverview & Detailview; WIP SetupComponent to select missing parameters in case; added highcharts library as pure JS; WIP designing Charts based on role & parameter input or setup; Integration in old cis via Mein Cis/Meine LV aswell as Studium/Studiengänge currently as "Anwesenheiten NEU"; WIP Landing Page Design; WIP LE Selection from Stundenplan Entries with appropriate Classification; defined settings for QR Regeneration and showing time left on a progress bar; entry query parameters are being handled inside globalProperties, controller parameters are still inside permissions array; 2024-03-22 14:12:17 +01:00
SimonGschnell 7dec1178e4 changes the parameter list of the tooltip function in tabulator 5 for approveAnrechnungUebersicht and reviewAnrechungUebersicht 2024-03-21 14:51:04 +01:00
SimonGschnell 72b19987bd removes unnecessary debugging prints 2024-03-21 14:46:03 +01:00
SimonGschnell 1a76231df0 migrated orderLehrauftrag to tabulator5 2024-03-21 14:37:28 +01:00
SimonGschnell 57e5626fe4 reset the navbar to use bootstrap3 2024-03-21 13:52:56 +01:00
SimonGschnell a8c60c105d migrating approveLehrauftrag to tabulator5 2024-03-21 13:42:43 +01:00
SimonGschnell 47dfb66b8d replacing string concatenation with string literals for tableWidget Header and Footer 2024-03-21 09:27:44 +01:00
SimonGschnell 081a2d69f5 set version 3 as the default version of bootstrap for the tableWidget 2024-03-21 08:49:28 +01:00
SimonGschnell 59f25bd3a2 adding the bootstrapVersion flag to the /widget/table view to dynamically render css classes + little fixes 2024-03-20 13:26:23 +01:00
SimonGschnell 78a16982f8 updates the tableHelpsite to use bootstrap5 classes if the bootstrapVersion flag is set to 5 2024-03-20 13:25:32 +01:00
SimonGschnell de15d43bb7 adds bootstrapVersion flag to the tableWidget options to render bootstrap3 classes or bootstrap5 classes 2024-03-19 15:29:28 +01:00
SimonGschnell acac5dfc65 trying to independenly restyle the navigationWidget 2024-03-18 15:17:14 +01:00
SimonGschnell 92cb4dedef migrates adminAnrechnungData and adminAnrechnung.js to use tabulator5 2024-03-18 11:49:54 +01:00
SimonGschnell 3cdc051861 updates adminAnrechnung view to bootstrap5 2024-03-18 11:42:34 +01:00
SimonGschnell 961526925c updates reviewAnrechnungDetail.js to change the correct bootstrap5 classes in the javascript 2024-03-18 11:07:12 +01:00
SimonGschnell 571bf8ebad update reviewAnrechnungenDetail to Bootatrap5 and little styling fixes for other Detail views 2024-03-18 11:02:26 +01:00
Johann Hoffmann 44260ddb4d basic link to Anwesenheit Extension from cis_menu_lv.inc.php checking on CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN in global.config-default.inc.php 2024-03-18 10:58:14 +01:00
Johann Hoffmann b39b8559d9 Merge branch 'master' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp 2024-03-18 10:55:05 +01:00
SimonGschnell 72bf2525b7 updating reviewAnrechnungUebersicht to bootstrap5 and tabulator5 2024-03-18 10:14:05 +01:00
SimonGschnell 83ccc93305 little adjustments and migrations 2024-03-15 15:02:17 +01:00
SimonGschnell 5ecac3cb99 migrates createAnrechnung to bootstrap 5 and tabulator 5 2024-03-15 15:01:55 +01:00
SimonGschnell 183cb1ac17 little adjustments on requestAnrechnung 2024-03-15 12:52:21 +01:00
SimonGschnell cc461aab8b updates js file of approveAnrechnungDetail to be bootstrap5 conform 2024-03-15 12:52:00 +01:00
SimonGschnell f9c894307d buttons with attribute disabled and title fix 2024-03-15 11:58:31 +01:00
SimonGschnell 9360c8a470 migrates approveAnrechnungDetail to bootstrap5 and adds little adjustments to requestAnrechungImportant 2024-03-15 11:57:11 +01:00
SimonGschnell 868d10ffd6 adds bg-secondary-subtle to the color palette and fixes buttons that are disabled and have a title attribute 2024-03-15 11:56:16 +01:00
SimonGschnell 465ab736ee changed AnrechnungenInfo panel to bootstrap5 accordion 2024-03-15 11:18:31 +01:00
SimonGschnell 8556632f90 updating approveAnrechnungDetail to boostrap5 2024-03-14 11:36:42 +01:00
SimonGschnell 8a835cb7f8 reset searchbar.js fixing searchbar style 2024-03-13 14:44:56 +01:00
SimonGschnell 3c2190b280 fixes zustellAdressenCount for EditAdresse and formats code files 2024-03-13 14:01:29 +01:00
SimonGschnell c0e6552c08 fixes zustellKontakteCount in EditKontakt 2024-03-13 13:44:08 +01:00
SimonGschnell e7480eb9ff hotfix, editProfil modal in fetchProfilUpdates component 2024-03-13 12:23:45 +01:00
SimonGschnell 1816f3f5f6 fully upgrades the approveAnrechnungUebersicht to tabulator5 2024-03-13 10:22:10 +01:00
SimonGschnell 6722fde9c9 adapts approveAnrechnungUebersicht for the new tabultor5 functions 2024-03-12 15:33:24 +01:00
SimonGschnell 70418b8ff6 updates TableWidget.js functions that are no longer valid in tabulator5 2024-03-12 14:30:40 +01:00
SimonGschnell 1dc4f5b56a upgrading tableWidget to tabulator 5 with custom jquery_wrapper 2024-03-12 12:28:59 +01:00
Harald Bamberger 691bbaaf82 workaround for tabulator jquery_wrapper 2024-03-12 09:59:21 +01:00
SimonGschnell aa7982fea9 adds jquery adjustments 2024-03-08 12:34:26 +01:00
SimonGschnell 1b65f6f4e6 trying to add callbacks after the tabulator called the tableBuilt event with jquery 2024-03-07 14:48:11 +01:00
SimonGschnell 7eda02f366 adds include variable tabulator5JQuery to FHC-Common.php 2024-03-07 11:46:05 +01:00
SimonGschnell b1411549f3 better folder structure for Cis Profil 2024-03-07 11:14:58 +01:00
SimonGschnell 96e0bfa72c changes how the EditProfil Modal passes props to its children 2024-03-07 11:08:43 +01:00
SimonGschnell 464799d22b tabulator upgrade 2024-03-06 14:46:21 +01:00
SimonGschnell e41e24be04 adding the option to add css classes to the HTMLWidget 2024-03-05 15:38:51 +01:00
SimonGschnell 144a872c98 adds cutsom cis css style which lowers the overall font size 2024-03-05 09:36:16 +01:00
SimonGschnell b7a1236acc anrechnung.css update 2024-03-04 15:06:08 +01:00
SimonGschnell dd309e972b js alert messages update, need to update the phrasesupdate.php 2024-03-04 15:03:49 +01:00
SimonGschnell 84ba0dbb64 bootstrap 5 upgrade (tooltips,cards,margins,..) 2024-03-04 13:50:06 +01:00
SimonGschnell ccf01100bb adds new classes because alert-info/warning/... are not consistent in the new bootstrap versions 2024-03-01 15:36:10 +01:00
Johann Hoffmann 8ccc621a91 Finalized db schema changes for Anwesenheitskontrolle and Checkin; Multiple Lektor scenario not being managed yet; reworked frontend requests towards API Controller to not confuse vue router; WIP UX; 2024-02-27 11:42:42 +01:00
SimonGschnell 21f7099878 refactor 2024-02-23 14:32:06 +01:00
SimonGschnell f09692edd1 adds primevue autocomplete field for EditAdresse 2024-02-22 15:04:24 +01:00
SimonGschnell ee7a819094 Merge branch 'master' into feature-25999/C4_ma0594dev 2024-02-22 12:06:16 +01:00
SimonGschnell 989f1ecf02 finishes the documentation in Profil.php controller and refactors getView 2024-02-22 11:50:08 +01:00
Johann Hoffmann 63a06dfef2 WIP api controller backend; WIP adapting queries to new db schema; 2024-02-22 10:30:18 +01:00
SimonGschnell 0b84e1b608 finishes documentation on Profil.php controller 2024-02-22 09:00:53 +01:00
SimonGschnell 4edd242f09 adds documentation to the Profil.php controller not finished 2024-02-21 15:44:41 +01:00
SimonGschnell 2a393f0087 adds the fields gemeinde and nation to the EditAdresse Component and adds autocomplete for the gemeinde if the nation is A 2024-02-21 12:31:41 +01:00
SimonGschnell 1bed062a01 querying the right data for the EditAdresse Nation and Gemeinde Fields 2024-02-20 15:57:17 +01:00
SimonGschnell 6f7bca6eab adds loading modal to ProfilUpdateView 2024-02-20 14:32:28 +01:00
SimonGschnell 47abce4aad handles the loading modal in the root Profil app when inserting a new profil update that may takes some time because it has to send out emails 2024-02-20 10:50:35 +01:00
SimonGschnell 1afb9130c0 adds a loading animation when waiting for the emails to be sent out when inserting a new profil update request 2024-02-19 15:12:16 +01:00
SimonGschnell 2e9cc2b291 /ProfilUpdate/id/ was added to the ProfilUpdate controller to automatically open the necessary profil_update on startup of the page, this functionality is used when sending emails with the link to the profil_update 2024-02-19 14:36:45 +01:00
SimonGschnell 2d5aea2bb8 translates the english status into a german version for the email vorlage 2024-02-19 09:14:45 +01:00
SimonGschnell 318087c572 sends email to the user if a profil update was accepted or rejected 2024-02-16 15:37:20 +01:00
SimonGschnell 501224b9b7 sends emails on insertion of an profil update to the studiengänge in case of students and to hr in case of a mitarbeiter 2024-02-16 14:33:49 +01:00
SimonGschnell 34b995ed6d adds dms_kategorie for profil updates as an insert into statement in the dbupdate file 2024-02-15 16:20:54 +01:00
SimonGschnell 04f6ee6156 Merge branch 'master' into feature-25999/C4_ma0594dev 2024-02-15 15:16:07 +01:00
SimonGschnell 6eeeb8b4b7 send email 2024-02-15 15:09:41 +01:00
SimonGschnell 279fbe51c3 sendMail function now gets all the studiengang emails of an active student or sends the mail to personalverwaltung if it is a mitarbeiter 2024-02-15 14:24:07 +01:00
Johann Hoffmann afa00caa4c Merge remote-tracking branch 'origin/feature-34543/UX_Template' into feature-33683/digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp
# Conflicts:
#	system/filtersupdate.php
2024-02-15 14:16:33 +01:00
SimonGschnell fd260a6307 changes the check if a user has permissions to accept or deny a profil update 2024-02-15 09:59:27 +01:00
SimonGschnell 028be08ec3 fixes little bug with profil update checking 2024-02-14 14:38:21 +01:00
SimonGschnell 5758d7cf4f overrides old zustelladressen/kontakte when changing or adding a new zustelladresse/kontakt 2024-02-14 14:18:31 +01:00
SimonGschnell b655c4021a instead of calculating how many zustelladressen or zustellkontakte a user has in the backend, it is calculated in the client side to prevent an extra api call 2024-02-14 11:42:20 +01:00
SimonGschnell 65a9b8c80f little fix 2024-02-14 09:01:40 +01:00
SimonGschnell bfba05753e also shows the zustellungs warning when there is more than one kontakt marked as zustellung 2024-02-14 08:56:25 +01:00
SimonGschnell 5ee241d914 now editAdressen shows a warning message if a new adresse is marked as zustelladresse 2024-02-13 15:30:23 +01:00
SimonGschnell 409221434a removes the checkbox for heimatadresse because it should not be changed by the user 2024-02-13 14:25:07 +01:00
SimonGschnell 66b843be1b hides the profil updates list if no profil update is present 2024-02-13 14:20:01 +01:00
SimonGschnell 1be8c27cb5 checks the permissions of a user when accepting or denying a profil update 2024-02-13 13:37:10 +01:00
SimonGschnell 92f2f5108c refactor of Profil.php to reuse function functionalities 2024-02-13 11:39:57 +01:00
SimonGschnell 24b467cd90 show different options for address types if the user is a mitarbeiter or a student 2024-02-12 16:29:19 +01:00
SimonGschnell 9ac523c087 deletes column name from public.tbl_profil_update 2024-02-12 16:00:17 +01:00
SimonGschnell 4b898bd976 queries full name of user that created profil_update using join in Profil_update_model 2024-02-12 15:58:52 +01:00
SimonGschnell 78bffb1348 little bugfix 2024-02-12 14:08:26 +01:00
SimonGschnell 6aa0bbb037 fixed little bug with fileOutput 2024-02-12 12:27:15 +01:00
SimonGschnell a09a350338 berechtigungen für die Ansicht von Profil Update Dokumente 2024-02-12 11:30:49 +01:00
SimonGschnell b21d3448cb fixes some data handling errors in controller functions 2024-02-12 09:07:51 +01:00
SimonGschnell 90012856dc EditAdresse layout change 2024-02-09 15:21:53 +01:00
SimonGschnell bbf6616cd9 corrects the display of links to attachments of a profil update request 2024-02-09 14:41:29 +01:00
SimonGschnell 43492add0b changes how files are attached/replaced to a profil update 2024-02-09 13:55:08 +01:00
SimonGschnell cda13ac705 makes the send button in the profil update popup disabled instead of not showing it 2024-02-08 13:47:03 +01:00
SimonGschnell 89bc5a5d9d Assistenten koennen nur Profil Aenderungen von Studenten ansehen deren Organisationseinheit in den Berechtigung des Assistenten vorhanden sind (und kleiner sessionStorage fix der einen String zu Boolean converted) 2024-02-08 11:48:14 +01:00
SimonGschnell fa1871a059 adopting profil controllers/models/views to db table change 2024-02-07 16:34:00 +01:00
SimonGschnell 3739581a29 db tabellen anpassung 2024-02-07 16:25:39 +01:00
SimonGschnell 9362aea0cf when user does not have permissions to accept/deny a profil update request it is notified via alert modal 2024-02-07 14:21:25 +01:00
SimonGschnell 286c7be83d only displays profil update requests the uid has permissions for (mitarbeiter/stammdaten or student/stammdaten), also fixes bug and adds JSON.parse to get the value in the sessionStorage 2024-02-07 13:25:50 +01:00
SimonGschnell 1e260a178c trying to restructure where editData is created 2024-02-06 16:24:43 +01:00
SimonGschnell 3d2c7e4026 sorts the data of the profil updates before displaying them in a table and tooltips have been added to the hr profil update requests table 2024-02-06 11:26:45 +01:00
SimonGschnell f47650f5e9 shows a menu when right clicking a profil update request in the hr view 2024-02-05 15:33:51 +01:00
Johann Hoffmann c6d4c34cad define AnwesenheitenByLektor in system/filtersupdate.php 2024-02-05 15:32:03 +01:00
SimonGschnell ff88581ecd stores the value of the selection to show all or only the pending Profil update requests in the sessionStorage 2024-02-05 14:26:38 +01:00
SimonGschnell 4faaa78ee1 also shows the zustelladresse checkbox when viewing an Adresse component in the hr View for Profil Updates 2024-02-05 13:16:51 +01:00
SimonGschnell a2d0f9e39a funciton that queries the ProfilUpdates now takes a associative array instead of multiple separate parameters 2024-02-05 11:17:07 +01:00
SimonGschnell 6e55382d15 adds zustelladresse as a field to EditKontakte component 2024-02-05 09:52:27 +01:00
SimonGschnell c88da53c03 only allows to user to send profil updates when the input doesn't correspond the original values 2024-02-02 09:49:07 +01:00
SimonGschnell e5182a20ac adds a select to the profilUpdateRequests to change display between only pending and all requests 2024-02-01 15:27:24 +01:00
SimonGschnell d813f55a9b makes it possible to display documents when reviewing profil update requests 2024-02-01 14:08:55 +01:00
SimonGschnell 1460e6ed80 modifing uploaded files int the fetchProfilUpdates component works correctly 2024-01-31 15:22:03 +01:00
SimonGschnell 0e69e432da fixes a lot of bugs and adds the inseramum/insertvon/updateamum/updatevon fields to the cis_profil_update db table 2024-01-31 14:26:54 +01:00
SimonGschnell 6f081e4136 removes logs 2024-01-31 09:15:48 +01:00
SimonGschnell df1fe01abe makes watcher eager and aligns files vertically 2024-01-31 09:05:23 +01:00
SimonGschnell 3362eb8e31 changing the text_input component to accept documents for the name or the title of a PersonUpdateRequest 2024-01-30 15:59:56 +01:00
SimonGschnell a21a292da6 dokument upload 2024-01-29 16:48:41 +01:00
SimonGschnell 76f2501fec little layout fix 2024-01-29 11:14:51 +01:00
SimonGschnell 9ebb04a01b StudentView also uses the layout components 2024-01-29 09:49:50 +01:00
SimonGschnell 783a2fb2b0 removes print in MitarbeiterView Controller and MitarbeiterView uses the components to render the information 2024-01-29 09:22:20 +01:00
SimonGschnell bdf59f3230 layout fixes and adding profilUpdateRequests component to Student view 2024-01-26 17:51:08 +01:00
SimonGschnell bece495ac8 fixes edge cases realted to creating new profil update requests 2024-01-26 16:37:39 +01:00
SimonGschnell 15cd9155f1 updates kontakt_id / adresse_id in profilUpdateRequest after inserting new kontakt/adresse in db 2024-01-25 16:43:47 +01:00
SimonGschnell 20672cd311 add/delete/update von Adressen funktioniert 2024-01-24 17:03:06 +01:00
SimonGschnell a390eefd75 add/delete/update kontakt is possible 2024-01-24 16:06:22 +01:00
SimonGschnell 20d6a34506 little style changes and adds name field to the public.tbl_cis_profil_update table 2024-01-24 12:18:21 +01:00
SimonGschnell 5f55834ccf controller functionality to apply profil update requests to the user 2024-01-23 18:03:38 +01:00
SimonGschnell 13f2bb4e85 fixes little bug where status timestamp was converted from null to the current date, with create_date in php 2024-01-23 11:40:02 +01:00
SimonGschnell df74bade9b fixes bug when getting all the profil update requests and makes it possible to add a message when dening or accepting a profil update 2024-01-23 11:00:43 +01:00
SimonGschnell 7abe04a69f fixes little bug for View Profil and changes layout of the profil update fetch component 2024-01-22 16:02:52 +01:00
SimonGschnell fb9b65b138 changes how to display the hr table with all the user update requests and the update request table in the profil view, also adds some new columns to the cis_profil_update table to store the status, status date and status message 2024-01-22 14:45:32 +01:00
SimonGschnell 0d5e8e89a6 splits the ProfilComponents.js file into multiple components in the ProfilComponents Folder and StudentProfil uses the components 2024-01-19 15:07:57 +01:00
SimonGschnell 84b23a148e modulerizing the profil page in multiple reusable components 2024-01-18 15:32:52 +01:00
SimonGschnell 5e7e2b63dd disables the kontakt input field in the EditKontakt component if no Kontakttyp was selected 2024-01-18 11:31:28 +01:00
SimonGschnell c5f6ce861b when adding a new kontakt or address, it is possible to modify it afterwards 2024-01-18 09:20:01 +01:00
SimonGschnell 8bda0f2f96 first template for the functionality to add a new kontakt/address 2024-01-17 15:34:53 +01:00
SimonGschnell 49fda27e56 profilUpdates need to have unique adresse_id or kontakt_id 2024-01-17 13:53:32 +01:00
SimonGschnell a5c77543b1 adds functionality to delete a Kontakt or an Adress 2024-01-17 12:07:06 +01:00
SimonGschnell b53dec6a31 adds breadcrumb to modal and adjusts controller functions and api calls 2024-01-16 15:44:04 +01:00
SimonGschnell 73792d1e78 the user is now able to delete an existing change request that he made 2024-01-15 15:40:55 +01:00
SimonGschnell e881abe904 allows user to make profil changes requests and to oversee his requested changes 2024-01-15 15:15:16 +01:00
SimonGschnell d3a3ebacfc first templates for the components Select and Breadcrumbs 2024-01-10 15:02:11 +01:00
SimonGschnell 75ce2a0aa8 Shows Select option names without _ 2024-01-10 09:11:24 +01:00
SimonGschnell b1d8a2f5a4 adds topic field to the cis_profil_update table and changes the layout of the editProfil Modul 2024-01-09 15:51:50 +01:00
SimonGschnell 5b597dbc31 changing the editProfil Modal from an Accordion to a select 2024-01-08 15:19:18 +01:00
SimonGschnell e479a7aa49 stores the old and the new value in the profil update request, to track which information has to be updated in the database 2024-01-05 10:40:47 +01:00
Simon Gschnell ee8051915e formats the update timestamps in php, differently tracks which properties and informations where changed by the user 2024-01-04 16:06:47 +01:00
Simon Gschnell d412c1d00e first template for the hr view to accept or deny profil update requests 2024-01-03 14:38:40 +01:00
Simon Gschnell ddab42123b refactores the modal out of the view into its own modal component 2024-01-02 12:50:04 +01:00
Simon Gschnell bb0656c480 http response returns the timestamp of the change 2023-12-29 12:01:25 +01:00
Simon Gschnell a27b80c394 show the date of the last edit profil information request if there is any 2023-12-29 10:17:33 +01:00
Simon Gschnell 59b848c576 fetches profil update request if an entry with uid in table public.tbl_cis_profil_update exists 2023-12-28 11:51:58 +01:00
Simon Gschnell 414541b6cf checks if table entry for uid exists and performs update or insert on result 2023-12-28 10:43:21 +01:00
Simon Gschnell 981e782c57 checks whether the editProfilData was changed by the user and is not in the original state 2023-12-28 10:15:24 +01:00
Simon Gschnell 87f640d66a little layout fix for MitarbeiterViewProfil.js 2023-12-27 11:20:54 +01:00
Simon Gschnell d8cd52f7a0 accordion styling 2023-12-27 11:16:18 +01:00
Simon Gschnell f3e23b888d fixing the accordion with editData 2023-12-27 10:42:33 +01:00
Simon Gschnell 620528fa50 moves the collapseFunction to the parent component Profil and also manages the collapse state from the parent 2023-12-27 09:27:18 +01:00
Simon Gschnell 733275a162 first profil info edit template 2023-12-22 14:18:49 +01:00
Simon Gschnell d6ef9c4ec4 adds custom floating label css construct to the rest of the profil views 2023-12-21 11:46:42 +01:00
Simon Gschnell fed4f7f929 replaced form-control with custom css construct 2023-12-21 08:53:56 +01:00
Simon Gschnell 6f8bd9527c changes the styling when hovering over form-control fields in the profil view, so that it does not also change the behavior of other elements that use form-control on the web page 2023-12-19 16:00:43 +01:00
Simon Gschnell 9c69d8cc46 trims the student information so that the value is falsy in javascript 2023-12-19 15:49:57 +01:00
Simon Gschnell 8666dbe3a6 wrong uid was used to get the emails of the student profil view 2023-12-19 15:36:11 +01:00
Simon Gschnell c08171536c changes the tel and mailto links of all profil views 2023-12-19 15:34:28 +01:00
Simon Gschnell 030be5b83f queryies the telefon number of the mitarbeiter with standort and adds tel links to all phone numbers 2023-12-19 11:02:44 +01:00
Simon Gschnell a3e70afdc1 adds font-size 1rem to the .tabulator class of the FilterComponent 2023-12-19 11:01:51 +01:00
Simon Gschnell 8b06ef030a adds icons and some layout changes 2023-12-18 15:27:45 +01:00
Simon Gschnell f0a3b8db95 Merge remote-tracking branch 'origin/feature-25999/C4' into feature-25999/C4_ma0594dev
merges menu width
2023-12-18 12:26:01 +01:00
cgfhtw eb05922043 menu width 2023-12-18 12:25:16 +01:00
Simon Gschnell 5fbe374ea3 removes the p-4 for all screensizes from the cis-main and adds different padding for mobile view Cis-main in Cis.css 2023-12-18 12:21:17 +01:00
Simon Gschnell 64326136d5 Merge remote-tracking branch 'origin/feature-25999/C4' into feature-25999/C4_ma0594dev 2023-12-18 12:14:07 +01:00
Simon Gschnell fa3d9e1e05 layout changes 2023-12-18 12:13:03 +01:00
cgfhtw 9c2f062d34 Css update 2023-12-18 09:56:59 +01:00
cgfhtw 2e1f38cc91 Merge remote-tracking branch 'origin/feature-25999/C4' into feature-25999/C4 2023-12-18 09:54:15 +01:00
cgfhtw ae0c311be3 Css korrektur 2023-12-18 09:53:52 +01:00
Simon Gschnell 1d75a26230 responsive layout 2023-12-15 14:40:56 +01:00
Simon Gschnell 98006b3d2b puts hidden quick links in card 2023-12-14 09:19:07 +01:00
Simon Gschnell 91781d3a38 adds cards to the main information of the mitarbeiter profil view 2023-12-13 15:56:24 +01:00
Simon Gschnell d87670edb8 adds Mailverteiler in card 2023-12-13 15:49:51 +01:00
Simon Gschnell 5671bb340b resposive profil information column change and remove default table sideMenu prop 2023-12-13 14:47:40 +01:00
Simon Gschnell bff4fa5544 Merge branch 'master' into feature-25999/C4_ma0594dev 2023-12-13 14:34:37 +01:00
Simon Gschnell b6dbe1513e adds the collapsing funktions to all the different profil view that use a table with more than one column 2023-12-13 13:59:23 +01:00
Simon Gschnell 8fe19d40bc little fix for the collapsing columns function 2023-12-13 13:26:44 +01:00
Simon Gschnell ba17974371 adds the collapsing function to the column itself 2023-12-13 12:58:34 +01:00
Simon Gschnell b400ea758c fixing the hide/show all collapsed table columns function by calling the click event instead of changing the classes and styles manually 2023-12-13 12:54:44 +01:00
Simon Gschnell 058863ba8d fix for show/hide all collapsed columns icon function, weird bug where collapsed columns icons don't work on first click 2023-12-13 11:22:47 +01:00
Simon Gschnell 4715ce3b95 icon to show or hide all collapsed columns 2023-12-13 10:58:05 +01:00
Simon Gschnell a72b8a153e layout changes 2023-12-12 15:34:28 +01:00
Simon Gschnell 633cd6be0f adds wrap word to every view and deltes the old profil view 2023-12-12 14:48:26 +01:00
Simon Gschnell 5b03abb50c restyling for the hidden dropdown quick links 2023-12-12 14:42:15 +01:00
Simon Gschnell 036365e148 shows all columns, removes the hidding of a column 2023-12-12 14:00:01 +01:00
Simon Gschnell 4b45914d4f adds the collapse formater function as a global Vue function that can be used by alle the different view components 2023-12-12 13:50:38 +01:00
Simon Gschnell b2c8bcb2bf adds a little shadow to the collapsed columns in the tables 2023-12-12 13:21:15 +01:00
Simon Gschnell 350911d474 adds responsive layout collapse to both tables 2023-12-12 12:15:27 +01:00
Simon Gschnell 3a191f4a11 adds responsive layout to the tables by collapsing the columns of a table 2023-12-12 12:09:03 +01:00
Simon Gschnell 38301572ae Mailverteiler nehmen ganze Spalte ein bei Viewport lg 2023-12-12 09:41:53 +01:00
Simon Gschnell aefe73b642 overflow-wrap: break-word style for better text wrapping 2023-12-12 09:28:49 +01:00
Simon Gschnell efc8e7c5fe css fix to wrap words when space gets little 2023-12-12 09:04:07 +01:00
Simon Gschnell 37f89010a4 adds Mitarbeiter und Studenten Profil Titel 2023-12-11 15:18:44 +01:00
Simon Gschnell 84706c957e changes dynamically the col width if a kontakt anmerkung is vorhanden or not 2023-12-11 14:35:17 +01:00
Simon Gschnell 9beb426531 adding word wrap to bootstrap columns 2023-12-11 13:47:56 +01:00
Simon Gschnell 832a3de8c5 centers the text of the link under the image 2023-12-11 13:38:44 +01:00
Simon Gschnell d378cd3002 center profil image in the middle 2023-12-11 13:05:25 +01:00
Simon Gschnell f45d692e66 used new layout for the different views 2023-12-11 12:55:54 +01:00
Simon Gschnell e8a89cf277 add comments to the layout to logically seperate the different columns and rows 2023-12-11 09:47:39 +01:00
Simon Gschnell 8f152cdf50 fixed layout bug, table now shows under profil information without disturbing the right panel 2023-12-11 08:51:51 +01:00
Harald Bamberger 3f84fa7f2d use smaller base font-size 2023-12-07 17:17:48 +01:00
Simon Gschnell a48cbaabb9 layout template 2023-12-07 15:59:01 +01:00
Simon Gschnell 02e7ef12de Profil information layout 2023-12-06 13:47:35 +01:00
Simon Gschnell 617c126aa8 store getAuthUID and getAuthPersonID inside Profil controller to avoid extra calls 2023-12-06 09:52:46 +01:00
Simon Gschnell 28b7a41b80 cleaning up the code not needed in the Profil controler 2023-12-05 13:55:51 +01:00
Simon Gschnell 0d3c55b019 dynamic component inside the profil app now controlls the view and the data 2023-12-05 13:52:31 +01:00
Simon Gschnell 087bf229af restructuring controller 2023-12-05 10:39:39 +01:00
Simon Gschnell 71fda916a3 added Menu link and Profile pop up link 2023-12-04 09:25:08 +01:00
Simon Gschnell 75547ea5e3 adding link to search to view profile 2023-12-01 13:35:29 +01:00
Simon Gschnell 48f4afae73 adds Ort_kurzbz for the View_Mitarbeiter 2023-12-01 11:41:17 +01:00
Simon Gschnell 38f76f68f1 conditional rendering for different Profile Views 2023-12-01 11:07:25 +01:00
Simon Gschnell f26801b7de adds a prop to the FilterTable component to conditionally render the filter columns, this was added because there is no need for a filter column when the table only has 1 column 2023-11-28 14:58:16 +01:00
Simon Gschnell c68856b740 completes the index view for both student and mitarbeiter 2023-11-28 14:56:42 +01:00
Simon Gschnell e3ec0fc36c upadtes api calls 2023-11-28 14:55:42 +01:00
Simon Gschnell 2df956ef20 layout for index Mitarbeiter 2023-11-27 12:04:57 +01:00
Simon Gschnell 1817757745 adds the @ to the emails and changes the layout of the information displayed on the profile page 2023-11-27 12:01:04 +01:00
Simon Gschnell dee3b35a5d solved table bug 2023-11-23 14:48:05 +01:00
Simon Gschnell d08b904530 mailverteiler und deren mailto href 2023-11-23 10:02:22 +01:00
Simon Gschnell 0e813f78fb updates the foto_sperre_function to automatically update the data of the vue component 2023-11-22 09:51:49 +01:00
Simon Gschnell 16b61d0560 Daten fuer die Betriebsmittel und zutrittskarten_ausgegebenam gesammelt 2023-11-20 17:30:58 +01:00
Simon Gschnell 4fead18c06 adds the model calls for the benutzerfunktionen information for the cis profile 2023-11-17 15:27:41 +01:00
Simon Gschnell 6b27c00d30 new data collection 2023-11-17 13:09:32 +01:00
Simon Gschnell 40a58ad9d0 Merge branch 'feature-25999/C4' of github.com:FH-Complete/FHC-Core into feature-25999/C4 2023-11-17 13:05:48 +01:00
Simon Gschnell dee0bdaa17 querying new data for the cis profile page 2023-11-15 15:09:59 +01:00
Simon Gschnell 7c229bbcee importing the api calls in the component and creating api endpoints for the cis profile page 2023-11-15 13:49:06 +01:00
SimonGschnell 9227cc12f0 retrieving user data from mitarbeiter and benutzer models 2023-11-14 14:36:47 +01:00
SimonGschnell 5b385d376e creating the controller/view/api base 2023-11-14 11:52:45 +01:00
cgfhtw c0fbc74862 Bug: search url not dynamic 2023-11-13 15:04:41 +01:00
cgfhtw 8e3939a885 bug: path seperator 2023-11-06 11:20:00 +01:00
cgfhtw 7dee77a6af Code Quality 2023-07-27 11:42:03 +02:00
cgfhtw ace3bd6736 Verbesserungen 2023-07-27 10:57:53 +02:00
cgfhtw cfe7c5b0da Merge branch 'feature-27351/Digitalisierung_Formulare_Neu' into feature-25999/C4 2023-07-25 14:07:17 +02:00
cgfhtw 764628d5fb Merge branch 'feature-27351/Digitalisierung_Formulare_Neu' into feature-25999/C4 2023-07-25 10:40:38 +02:00
cgfhtw 2046b6c2a8 Menu Entry: Studierendenantrag 2023-07-25 10:38:48 +02:00
cgfhtw 8901791911 Merge branch 'feature-27351/Digitalisierung_Formulare_Neu' into feature-25999/C4 2023-07-19 14:37:59 +02:00
cgfhtw ffd12e8ddf Access Rights 2023-07-19 11:17:17 +02:00
cgfhtw 044695183f Merge branch 'feature-24647/Konfigurierbare_Dashboards' into feature-25999/C4 2023-07-19 11:15:40 +02:00
cgfhtw 0beabe0f4a spaces to tabs 2023-07-19 11:11:52 +02:00
cgfhtw 0fd53dc3ac spaces to tabs 2023-07-19 11:10:01 +02:00
cgfhtw 72169b26c3 separate class attribute and property for easier readability 2023-07-19 11:06:01 +02:00
cgfhtw 7b96f99929 Access Rights Api Controller 2023-07-19 10:59:39 +02:00
cgfhtw 72d0517701 Merge branch 'master' into feature-25999/C4 2023-07-19 10:55:35 +02:00
cgfhtw dc21662fc9 Add missing SQL Rights for web 2023-07-14 13:01:01 +02:00
cgfhtw b0c9231d14 Hmvc: Safer Code 2023-07-14 09:02:25 +02:00
cgfhtw c5db083a84 Correct paths 2023-07-12 15:32:52 +02:00
cgfhtw 5f3e393ed1 Default menu: correct paths 2023-07-12 09:12:03 +02:00
cgfhtw 3e4703408b directories from variables 2023-07-10 08:42:48 +02:00
cgfhtw d54868070f 29006: Dashboard verbesserungen 2023-05-08 12:39:25 +02:00
cgfhtw 2780ec5636 Dashboard Admin Demo 2023-05-05 14:27:33 +02:00
cgfhtw 4f43b79ed5 default controller 2023-04-14 12:50:07 +02:00
cgfhtw 95458c193c CIS4 Entry & View titles 2023-03-31 14:50:56 +02:00
cgfhtw 2a59fad2fc CMS loading speedup 2023-03-31 09:21:52 +02:00
cgfhtw e2cf663f88 Default Menu 2023-03-31 09:21:09 +02:00
cgfhtw 7e518c3978 Documents 2023-03-24 11:26:16 +01:00
Paolo 06179ee714 Code quality check fixes 2023-03-23 14:38:42 +01:00
cgfhtw 9e11dfb668 code quality 2023-03-14 11:00:36 +01:00
cgfhtw 6b6392deb4 Missing ; 2023-03-13 09:02:46 +01:00
cgfhtw 2238b872c6 Documents Self Service 2023-03-13 09:01:45 +01:00
cgfhtw 83c0413815 code quality 2023-03-10 10:29:54 +01:00
cgfhtw 91e43bbc07 Documents first draft 2023-03-10 09:28:57 +01:00
cgfhtw f9975eb530 Code Quality 2023-03-10 09:28:04 +01:00
cgfhtw 555b8f4e6b access rights 2023-02-24 11:59:27 +01:00
cgfhtw 280890a00d Stundenplan Widget 2023-02-24 11:57:54 +01:00
cgfhtw 3d1908982a Merge branch 'feature-24647/Konfigurierbare_Dashboards' into feature-25999/C4 2023-02-09 16:12:36 +01:00
cgfhtw 9f72206796 Stundenplan Widget Basic 2023-02-06 11:44:36 +01:00
cgfhtw 13b898179e Widget classes 2023-02-06 09:46:32 +01:00
cgfhtw 7e2d63e3fe Css cleanup 2023-02-06 08:53:32 +01:00
cgfhtw 0f60ab2a54 Stundenplan & Calendar 2023-02-06 08:43:43 +01:00
cgfhtw d1f69d4696 MyLV Verbesserungen & cleanup 2023-02-06 08:42:42 +01:00
cgfhtw 034bed6580 cleanup 2023-01-16 11:40:40 +01:00
cgfhtw 2e126692f2 MyLv: Permissions & notFound fallback 2023-01-16 11:38:24 +01:00
cgfhtw 559e4d2bc0 cleanup 2023-01-16 11:22:53 +01:00
cgfhtw 2f2f19306b MyLv 2023-01-16 10:32:24 +01:00
cgfhtw ebc7b5a3d9 Login/Logout 2023-01-16 10:31:02 +01:00
cgfhtw c5b996f35e use vue for cms for link correction 2022-12-16 13:41:16 +01:00
cgfhtw 00c52e4880 cleanup 2022-12-16 11:43:35 +01:00
cgfhtw 4335c2da80 add Dashboard to HMVC 2022-12-16 11:36:33 +01:00
cgfhtw 085ed750ca using cis.php and routing news 2022-12-16 11:34:39 +01:00
cgfhtw c56b774d1d 3 Versions 2022-12-15 09:42:28 +01:00
cgfhtw 266ba7523f s&d 2022-11-29 08:48:50 +01:00
cgfhtw 546e55ed96 Merge branch 'feature-24647/Konfigurierbare_Dashboards' into feature-25999/C4 2022-11-24 15:36:38 +01:00
cgfhtw 4120f5a566 Merge remote-tracking branch 'origin/feature-24647/Konfigurierbare_Dashboards' into feature-24647/Konfigurierbare_Dashboards 2022-11-24 11:53:06 +01:00
cgfhtw 4758fcb413 access rights 2022-11-24 11:52:09 +01:00
cgfhtw 3e0aa849d4 bugfixes & "+" background 2022-11-24 11:52:01 +01:00
Harald Bamberger 3e17892831 fixed path to news placeholder image 2022-11-24 11:50:09 +01:00
cgfhtw d51a95a8a0 test controller & views 2022-11-24 11:48:46 +01:00
cgfhtw d7c2362a0e double widgets bug 2022-11-22 14:39:33 +01:00
cgfhtw a5749a5ea2 bug: wrong check for empty fields when adding new widgets (coordinates are based on 0,0 not 1,1) 2022-11-08 14:47:44 +01:00
cgfhtw 0e7343acfb bug: uncaught promise on widget-picker abort 2022-11-08 14:46:44 +01:00
cgfhtw 0d65ae5b85 widget icons absolute path 2022-11-03 11:37:13 +01:00
cgfhtw 55959ccd41 modal size 2022-11-03 11:33:52 +01:00
cgfhtw 935881dce2 icon & cursor 2022-11-03 11:28:25 +01:00
cgfhtw 3764df6102 Add widget to preset bugfix 2022-11-03 11:24:29 +01:00
Harald Bamberger e1addbfe04 Merge branch 'master' into feature-24647/Konfigurierbare_Dashboards_api
- mv dbchanges from system/dbupdate_3.3.php to system/dbupdate_3.4.php
- mv dbchanges include file from system/dashboard/ to system/dbupdate_3.4/ and prevent direct script access
2022-11-03 10:41:56 +01:00
Harald Bamberger 677f74781b Merge branch 'feature-24647/Konfigurierbare_Dashboards_widgets' into feature-24647/Konfigurierbare_Dashboards_api 2022-11-03 10:31:36 +01:00
Harald Bamberger c78c731388 renamed Dashboard Controller to DashboardDemo and used view to dashboard_demo 2022-11-03 10:27:39 +01:00
cgfhtw 8fd61edaab Admin Components 2022-10-28 12:41:25 +02:00
cgfhtw 92ec7f44ef Update Dashboard Endpoints for Admin GUI 2022-10-28 12:40:57 +02:00
cgfhtw be6ad8ce2a cleanup 2022-10-28 12:39:19 +02:00
Cris 630c1bc2bc Changed to display 4 Ampeln in Widget 2022-10-25 14:35:38 +02:00
Cris a1ccd392f5 Added News Widget 2022-10-25 14:28:25 +02:00
Cris bc723b22f4 Added getAll() to News Model 2022-10-25 14:28:14 +02:00
Cris 71699f6e74 Added Ampel Widget 2022-10-25 14:17:52 +02:00
Cris 1d6c5b4257 Added Url Widget 2022-10-25 14:17:32 +02:00
Cris 7f1cc966f0 Added API Controller to perform API calls 2022-10-25 13:00:43 +02:00
Cris aaf64a759b Added Widgets to Widget Controller 2022-10-25 12:59:03 +02:00
Cris ae05b34cbf Removed test function 2022-10-25 12:58:14 +02:00
Cris fdc52ae47d Added Offcanvas Component 2022-10-25 12:57:27 +02:00
Cris c5d3f47457 Merged Modal Component, adapted body padding there 2022-10-25 12:55:49 +02:00
Cris 699b76f4cb Added general used methods and computed property to Abstract Mixin Component
. apiurl: returns app root and ci router from FHC_JS_DATA_OBJECT
. formatDateTime: returns human readable date time
. getDate: returns human readable date
2022-10-25 12:54:35 +02:00
cgfhtw 1043714767 adminMode in Sections 2022-10-25 09:51:20 +02:00
cgfhtw a65d297997 use FHC_JS_DATA_STORAGE_OBJECT for apiurl 2022-10-24 16:01:02 +02:00
cgfhtw a3722273e9 use Bootstrap modals 2022-10-24 15:44:12 +02:00
cgfhtw 4aa7b9854a setConfig is an emit not a prop 2022-10-24 15:08:10 +02:00
Cris b6308d1ff5 Merge remote-tracking branch 'origin/feature-24647/Konfigurierbare_Dashboards_api' into feature-24647/Konfigurierbare_Dashboards_widgets 2022-10-24 11:04:31 +02:00
cgfhtw 8983a0e821 Bootstrap Modal (+ Alert,Confirm,Prompt) 2022-10-24 11:01:27 +02:00
Cris 67f1094a97 Added Modal Component 2022-10-17 13:40:18 +02:00
Cris 065dd1d081 Added FHTW illustration image 2022-10-17 13:38:07 +02:00
Cris ecbc6d8e3d Added Dashboard Controller & View 2022-10-17 13:37:08 +02:00
Cris 0bd6af8da1 Merge remote-tracking branch 'origin/feature-24647/Konfigurierbare_Dashboards_api' into feature-24647/Konfigurierbare_Dashboards_widgets 2022-10-13 15:14:29 +02:00
cgfhtw 680787d881 Don't move out of bounds on Drag&Drop 2022-10-13 14:44:33 +02:00
cgfhtw a71ead0a85 Ajax update: better data consistency 2022-10-13 14:38:03 +02:00
cgfhtw fd2aa8a1bb Cleanup & uid from AuthLib 2022-10-13 08:43:08 +02:00
cgfhtw 6570c958b3 Bug: DataTransfer in Chrome 2022-10-12 15:50:40 +02:00
Cris b4053c45fd Merge remote-tracking branch 'origin/feature-24647/Konfigurierbare_Dashboards_api' into feature-24647/Konfigurierbare_Dashboards_widgets 2022-10-12 15:17:47 +02:00
cgfhtw dd4d71bd7d Bug: Deepmerge on update 2022-10-12 10:29:52 +02:00
Cris c7c8913833 Adapted Dashboard DB Update: Berechtigungen ergänzt / Typspezifikation entfernt.
. Berechtigungen ergänzt:
  - dashboard/benutzer
  - dashboard/admin

. Typspezifikation entfernt in Create Sequence
  - war nicht mit PHPSQL 9.6.2 kompatibel.
2022-10-12 09:19:54 +02:00
cgfhtw a468338ead Configurable CSS classes to Default Widget 2022-10-12 09:08:24 +02:00
cgfhtw 39bbcac217 Widget controller & model & table 2022-10-12 08:58:48 +02:00
cgfhtw a3ad8eb337 dashboard.tbl_widget new fields 2022-10-11 15:41:43 +02:00
cgfhtw 4f3e8dcb3c Basic VUE Components & Test WidgetController 2022-10-05 10:43:43 +02:00
Harald Bamberger 90e006feb5 allow widgets array for add operations 2022-10-04 08:22:27 +02:00
Harald Bamberger d14608ed28 level funktion_kurzbz added to presets and overrides 2022-10-03 07:59:11 +02:00
Harald Bamberger ad369bbe44 add dashboard schema and tables create script 2022-09-28 16:53:48 +02:00
Harald Bamberger 252abeafcb dummy config changed to test function level in config 2022-09-28 15:26:45 +02:00
Harald Bamberger fb7f445e22 progress on api endpoints to add and remove presets and overrides 2022-09-21 11:38:16 +02:00
Harald Bamberger 5c9c4b7e2d store configs as json in database and merge them 2022-09-16 10:46:29 +02:00
Harald Bamberger ff93c957cd dashboard config api first steps 2022-09-14 19:05:29 +02:00
Cris 7daa289bb1 Merge branch 'master' into feature-18073/No-Reply-for-Sanchomails 2022-05-10 10:57:50 +02:00
Cris c39174980c Fixed function _getSTGLMailAddress to return same array structure
Different structure was causing errors in handling.
2022-05-09 15:34:22 +02:00
Cris efcef48f89 Changed Sanchomail 'From' to noreply 2022-05-09 11:14:01 +02:00
1100 changed files with 149006 additions and 11696 deletions
+2
View File
@@ -2,6 +2,8 @@ documents/
vendor/
/nbproject/
.vscode
composer.phar
/.idea/
.settings
.project
@@ -0,0 +1,36 @@
<?php
$filterCmptArray = array(
"app" => 'core',
'datasetName' => 'vertragsverwaltung',
'query' => '
SELECT
uid,
person_id,
vorname,
nachname,
gebdatum,
vertragsarten,
unternehmen,
ids,
aktiv
FROM
(
SELECT
b.uid , p.person_id,
p.vorname, p.nachname,
gebdatum,
STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten,
STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen,
STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids,
b.aktiv
FROM
hr.tbl_dienstverhaeltnis d
JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid
JOIN public.tbl_person p ON p.person_id = b.person_id
JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz
JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz
GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv
) as vertragsdaten
',
'requiredPermissions' => 'vertrag/mitarbeiter'
);
+32 -9
View File
@@ -3,12 +3,35 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
/**
* NOTE(chris): example:
Events::on('stv_conf_student', function (&$res) {
$res['test'] = [
'title' => 'TEST',
'component' => './Stv/Studentenverwaltung/Details/Notizen.js'
];
});
*/
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["lehreinheit"] = array(
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["reservierung"] = array(
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["ferien"] = array(
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
);
});
+45
View File
@@ -0,0 +1,45 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['turnitin_link'] = 'https://technikum-wien.turnitin.com/sso/sp/redwood/saml/5IyfmBr2OcSIaWQTKlFCGj/start';
$config['old_abgabe_beurteilung_link'] = 'https://moodle.technikum-wien.at/mod/page/view.php?id=1005052';
$config['PAABGABE_EMAIL_JOB_INTERVAL'] = '1 day';
// used as APP_ROOT.URL_STUDENTS -> cis4
$config['URL_STUDENTS'] = 'cis.php/Cis/Abgabetool/Student';
// used as APP_ROOT.URL_MITARBEITER -> old cis
$config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter';
// used as APP_ROOT.URL_MITARBEITER -> old cis
$config['URL_ASSISTENZ'] = 'index.ci.php/Cis/Abgabetool/Assistenz';
// lehre.tbl_paabgabetyp bezeichnung
//$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2'];
$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['abstract','zwischen', 'qualgate1', 'qualgate2']; // tbl_paabgabetyp pk
// paabgabetypen for which betreuer is benachrichtigt via sammelmail
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'] = ['qualgate1', 'qualgate2', 'end'];
// paabgabetypen for which assistenz is benachrichtigt via sammelmail
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end'];
// paabgabetypen for which student is benachrichtigt via sammelmail -> basically all of them but still defined for consistency
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'] = ['qualgate1', 'qualgate2', 'zwischen', 'note', 'abstract', 'end', 'enda'];
//$config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden'];
$config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk
// benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel
// wie zB "Nicht beurteilt" & "Noch nicht eingetragen"
$config['NONFINAL_NOTEN_ABGABETOOL'] = [9];
$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?';
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
$config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end'];
// to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing
$config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl';
$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true;
$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true;
$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true;
+10 -1
View File
@@ -1,6 +1,6 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
if (!defined('BASEPATH')) exit('No direct script access allowed');
// Deadline for Application given as Time-Interval after Semesterstart.
@@ -24,3 +24,12 @@ $config['send_mail'] = TRUE;
// Display fields to explain equivalence of ECTS and LV-Inhalte
$config['explain_equivalence'] = TRUE;
// Displays infobox if set to true
$config['display_infobox'] = [
'fristen' => TRUE,
'referenzbeispiele_ects' => TRUE,
'voraussetzungen' => TRUE,
'nachweisdokumente' => TRUE,
'herkunft_kenntnisse' => TRUE
];
+6
View File
@@ -0,0 +1,6 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
// Define configuration parameters
$config['timezone'] = 'Europe/Vienna';
+15
View File
@@ -0,0 +1,15 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
// CMS Content Id for CIS4 Menu Root
$config['cis_menu_root_content_id'] = 11091;
// send Mails for ProfilUpdate
$config['cis_send_profil_update_mails'] = true;
// Vilesci CI BaseUrl
$config['cis_vilesci_base_url'] = defined('VILESCI_ROOT') ? VILESCI_ROOT : APP_ROOT;
$config['cis_vilesci_index_page'] = 'index.ci.php';
// Cis CI BaseUrl
$config['cis_base_url'] = defined('CIS_ROOT') ? CIS_ROOT : APP_ROOT;
$config['cis_index_page'] = 'cis.php';
+11
View File
@@ -0,0 +1,11 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
// apps for which issues should be displayed
$config['issues_list_apps'] = array('core', 'dvuh');
// functions which enable users to see issues
$config['issues_list_functions'] = array('ass');
// functions which enable users to see issues
$config['issues_list_status'] = array('Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent');
+12
View File
@@ -0,0 +1,12 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
// use vuejs dev version
$config['use_vuejs_dev_version'] = false;
// use bundled javascript
$config['use_bundled_javascript'] = false;
// systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered
$config['systemerror_mailto'] = '';
// use fhcomplete_build_version as path element after public (requires apache mod_rewrite)
// see <fhc_base_dir>/public/.htaccess_sample for details
$config['use_fhcomplete_build_version_in_path'] = false;
+11
View File
@@ -0,0 +1,11 @@
<?php
/*It defines which tags are available in LVVerwaltung and whether they are editable
$config['lvverwaltung_tags'] = [
'tag_1' => ['readonly' => false],
'tag_1' => ['readonly' => true]
];
*/
$config['lvverwaltung_tags'] = [];
+15
View File
@@ -32,3 +32,18 @@ $config['validate'] = false; // If true then the email address will be validated
// If enabled will be logged info about emails in Codeigniter error logs
$config['enable_debug'] = false;
// default sender
$config['sancho_mail_default_sender'] = defined('SANCHO_MAIL_DEFAULT_SENDER') ? SANCHO_MAIL_DEFAULT_SENDER : '';
// If to use images for custom mails
$config['sancho_mail_use_images'] = defined('SANCHO_MAIL_USE_IMAGES') ? SANCHO_MAIL_USE_IMAGES : false;
// image path for sancho mail, relativ to document root
$config['sancho_mail_img_path'] = defined('SANCHO_MAIL_IMG_PATH') ? SANCHO_MAIL_IMG_PATH : '';
// header image for custom mails
$config['sancho_mail_header_img'] = defined('SANCHO_MAIL_HEADER_IMG') ? SANCHO_MAIL_HEADER_IMG : '';
// footer image for custom mails
$config['sancho_mail_footer_img'] = defined('SANCHO_MAIL_FOOTER_IMG') ? SANCHO_MAIL_FOOTER_IMG : '';
+67 -5
View File
@@ -1,6 +1,12 @@
<?php
// Header menu
if(defined('CIS4') && CIS4) {
$root = APP_ROOT;
} else {
$root = CIS_ROOT;
}
$config['navigation_header'] = array(
'*' => array(
'fhcomplete' => array(
@@ -50,7 +56,7 @@ $config['navigation_header'] = array(
'requiredPermissions' => 'basis/vilesci:r',
'children' => array(
'cis' => array(
'link' => CIS_ROOT,
'link' => $root,
'icon' => '',
'description' => 'CIS',
'sort' => 10
@@ -58,7 +64,7 @@ $config['navigation_header'] = array(
'lehrveranstaltungen' => array(
'link' => site_url('lehre/lvplanung/LvTemplateUebersicht'),
'icon' => '',
'description' => 'Lehrveranstaltungen',
'description' => 'Lehrveranstaltungen Templates',
'sort' => 15
),
'reihungstest' => array(
@@ -75,6 +81,16 @@ $config['navigation_header'] = array(
'sort' => 30,
'requiredPermissions' => 'infocenter:r'
),
'lvverwaltung' => array(
'link' => site_url('LVVerwaltung'),
'icon' => '',
'description' => 'LV Verwaltung',
'requiredPermissions' => array(
'admin:r',
'assistenz:r'
),
'sort' => 35
),
'lehrauftrag' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Lehrauftrag',
@@ -87,7 +103,7 @@ $config['navigation_header'] = array(
),
'zverfueg' => array(
'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'),
'description' => 'Zeitverf&uuml;gbarkeit',
'description' => 'Zeitverfügbarkeit',
'expand' => true,
'sort' => 45,
'requiredPermissions' => array(
@@ -147,6 +163,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 50,
'requiredPermissions' => 'lehre/gruppenmanager:r'
),
'vertragsverwaltung' => array(
'link' => site_url('vertragsverwaltung'),
'description' => 'Vertragsverwaltung',
'expand' => true,
'sort' => 51,
'requiredPermissions' => 'vertrag/mitarbeiter:r'
)
)
),
@@ -185,7 +208,14 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 30,
'requiredPermissions' => 'lehre/anrechnungszeitfenster:rw'
)
),
'dashboardadmin' => array(
'link' => site_url('dashboard/Admin'),
'description' => 'Dashboard Admin',
'expand' => true,
'sort' => 40,
'requiredPermissions' => 'dashboard/admin:r'
)
)
)
)
@@ -223,7 +253,7 @@ $config['navigation_menu']['organisation/Reihungstest/index'] = array(
'target' => '_blank'
),
'auswertung' => array(
'link' => CIS_ROOT.'/cis/testtool/admin/auswertung.php',
'link' => $root.'/cis/testtool/admin/auswertung.php',
'description' => 'Auswertung',
'icon' => 'list-alt',
'sort' => 1,
@@ -319,5 +349,37 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
),
);
$config['navigation_menu']['vertragsverwaltung/*'] = array(
'vertragsverwaltung' => array(
'link' => site_url('vertragsverwaltung'),
'description' => 'Vertragsverwaltung',
'icon' => 'home',
'sort' => 100,
'target' => '_blank',
'requiredPermissions' => array('vertrag/mitarbeiter:r')
)
);
$config['navigation_menu']['apps'] = [
'stv' => [
'link' => site_url('studentenverwaltung'),
'description' => 'Studierendenverwaltung',
#'icon' => 'users',
'requiredPermissions' => array('admin:r', 'assistenz:r')
],
'lvv' => [
'link' => site_url('lVVerwaltung'),
'description' => 'LV Verwaltung',
#'icon' => 'person-chalkboard',
'requiredPermissions' => array('admin:r', 'assistenz:r')
],
'lav' => [
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Lehraufträge',
#'icon' => 'person-chalkboard',
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
]
];
+25
View File
@@ -0,0 +1,25 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
// liste von raumtyp_kurzbz welche in raumsuche studenten angezeigt werden
$config['roomtypes_student'] = array(
'LAB BM/Chem',
'xEDV 1-36',
'xEDV 37-60',
'EDV 60',
'EDV-HÖPL',
'EDV ES',
'LAB Elek',
'LAB ES/TK',
'Ener-EDV',
'Ener-Lab',
'Ener-SEM',
'Ener-HS',
'HS 59-109',
'HS 25-38',
'HS 39-58',
'LAB Inf',
'LAB Robo',
'LAB SET'
);
+78 -15
View File
@@ -1,6 +1,6 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
if (! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
@@ -50,8 +50,8 @@ defined('BASEPATH') OR exit('No direct script access allowed');
| Examples: my-controller/index -> my_controller/index
| my-controller/my-method -> my_controller/my_method
*/
$route['default_controller'] = 'Vilesci';
$route['translate_uri_dashes'] = FALSE;
$route['default_controller'] = defined('CIS4') && CIS4 ? 'Cis4' : 'Vilesci';
$route['translate_uri_dashes'] = false;
// Class name conflicts
$route['api/v1/organisation/[S|s]tudiengang/(:any)'] = 'api/v1/organisation/studiengang2/$1';
@@ -61,25 +61,88 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1';
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
// load routes from extensions
$subdir = 'application/config/extensions';
$dirlist = scandir($subdir);
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
if ($dirlist)
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
$route['Abgabetool/Mitarbeiter'] = 'Cis/Abgabetool/Mitarbeiter';
$route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
// Studierendenverwaltung List Routes
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
// (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)]
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1';
// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2';
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$3';
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$4';
// (studiengang_kz)/(orgform)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2';
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3';
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$4';
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$5';
// (studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe)
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsSpezialgruppe/$1/$2/$3/$4';
// (studiensemester_kurzbz)/(studiengang_kz)[/(semester)[/(verband)[/(gruppe)]]]
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4/$5';
// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/grp/(gruppe)
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgformSpezialgruppe/$1/$2/$3/$4/$5';
// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)[/(semester)[/(verband)[/(gruppe)]]]
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
// // (studiensemester_kurzbz)/uid/(uid)
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/uid/(:any)'] = 'api/frontend/v1/stv/Students/getStudent/$1/$2';
// // (studiensemester_kurzbz)/prestudent/(prestudent_id)
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/prestudent/(:num)'] = 'api/frontend/v1/stv/Students/getPrestudent/$1/$2';
// // (studiensemester_kurzbz)/person/(person_id)
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/person/(:num)'] = 'api/frontend/v1/stv/Students/getPerson/$1/$2';
// load routes from extensions, also look for environment-specific configs
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
foreach($subdirs as $subdir)
{
$files = array_diff($dirlist, array('.','..'));
foreach ($files as &$item)
if(is_dir($subdir))
{
if (is_dir($subdir . DIRECTORY_SEPARATOR . $item))
$dirlist = scandir($subdir);
if ($dirlist)
{
$routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php';
$files = array_diff($dirlist, array('.','..'));
if (file_exists($routes_file))
foreach ($files as &$item)
{
require($routes_file);
if (is_dir($subdir . DIRECTORY_SEPARATOR . $item))
{
$routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php';
if (file_exists($routes_file))
{
require($routes_file);
}
}
}
}
}
}
+874
View File
@@ -0,0 +1,874 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$config['person'] = [
'primarykey' => 'person_id',
'table' => 'public.tbl_person',
'searchfields' => [
'uid' => [
'comparison' => 'equals',
'field' => 'uid',
'join' => [
'table' => "public.tbl_benutzer",
'using' => "person_id"
],
'1-n' => true
],
'vorname' => [
'alias' => ['firstname'],
'comparison' => 'similar',
'field' => 'vorname'
],
'nachname' => [
'alias' => ['lastname', 'surename'],
'comparison' => 'similar',
'field' => 'nachname'
],
'name' => [
'comparison' => 'similar',
'field' => "(vorname || ' ' || nachname)"
],
'email' => [
'comparison' => 'similar',
'field' => 'kontakt',
'join' => [
'table' => "public.tbl_kontakt",
'on' => "kontakttyp = 'email' AND tbl_kontakt.person_id = tbl_person.person_id"
],
"1-n" => true
],
'tel' => [
'alias' => ['phone', 'telefon'],
'comparison' => 'similar',
'field' => 'kontakt',
'join' => [
'table' => "public.tbl_kontakt",
'on' => "kontakttyp IN ('telefon', 'so.tel', 'mobil') AND tbl_kontakt.person_id = tbl_person.person_id"
],
"1-n" => true
],
'preid' => [
'alias' => ['prestudent_id'],
'comparison' => 'equal-int',
'field' => 'prestudent_id',
'join' => [
'table' => "public.tbl_prestudent",
'using' => "person_id"
],
'1-n' => true
],
'pid' => [
'alias' => ['person_id'],
'comparison' => 'equal-int',
'field' => 'person_id'
]
],
'resultfields' => [
"ARRAY( SELECT uid FROM public.tbl_benutzer WHERE person_id = p.person_id ) AS uids",
"p.person_id",
"(p.vorname || ' ' || p.nachname) AS name",
"ARRAY( SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp = 'email' AND person_id=p.person_id ) AS email",
"CASE
WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto
ELSE NULL END
AS photo_url"
],
'resultjoin' => "
JOIN public.tbl_person p USING (person_id)"
];
$config['student'] = [
'primarykey' => 'student_uid',
'table' => 'public.tbl_student',
'searchfields' => [
'uid' => [
'comparison' => 'equals',
'field' => 'student_uid'
],
'vorname' => [
'alias' => ['firstname'],
'comparison' => 'similar',
'field' => 'vorname',
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'nachname' => [
'alias' => ['lastname', 'surename'],
'comparison' => 'similar',
'field' => 'nachname',
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'name' => [
'comparison' => 'similar',
'field' => "(vorname || ' ' || nachname)",
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'email' => [
'comparison' => 'similar',
'field' => 'kontakt',
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_kontakt",
'on' => "kontakttyp = 'email' AND tbl_kontakt.person_id = tbl_prestudent.person_id"
]
],
"1-n" => true
],
'tel' => [
'alias' => ['phone', 'telefon'],
'comparison' => 'similar',
'field' => 'kontakt',
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_kontakt",
'on' => "kontakttyp IN ('telefon', 'so.tel', 'mobil') AND tbl_kontakt.person_id = tbl_prestudent.person_id"
]
],
"1-n" => true
],
'stg' => [
'alias' => ['studiengang'],
'comparison' => 'equals',
'field' => "typ || kurzbz",
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_studiengang",
'on' => "tbl_studiengang.studiengang_kz = tbl_prestudent.studiengang_kz"
]
]
],
'preid' => [
'alias' => ['prestudent_id'],
'comparison' => 'equal-int',
'field' => 'prestudent_id'
],
'pid' => [
'alias' => ['person_id'],
'comparison' => 'equal-int',
'field' => 'person_id',
'join' => [
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
]
]
],
'resultfields' => [
"s.student_uid AS uid",
"s.matrikelnr",
"p.person_id",
"(p.vorname || ' ' || p.nachname) AS name",
"(s.student_uid || '@" . DOMAIN . "') || ARRAY( SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp = 'email' AND person_id=p.person_id ) AS email",
"CASE
WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto
ELSE NULL END
AS photo_url",
"b.aktiv"
],
'resultjoin' => "
JOIN public.tbl_student s USING (student_uid)
JOIN public.tbl_benutzer b ON(b.uid = s.student_uid)
JOIN public.tbl_person p USING(person_id)"
];
$prestudent_sort = [
"Student",
"Incoming",
"Outgoing",
"Diplomand",
"Unterbrecher",
"Aufgenommener",
"Wartender",
"Bewerber",
"Interessent",
"Abgewiesener",
"Absolvent",
"Abbrecher",
"Ausserordentlicher",
"Praktikant"
];
$prestudent_sort_array = "array['" . implode("','", $prestudent_sort) . "']";
$config['prestudent'] = [
'primarykey' => 'prestudent_id',
'table' => 'public.tbl_prestudent',
'searchfields' => [
'uid' => [
'comparison' => 'equals',
'field' => 'student_uid',
'join' => [
'table' => "public.tbl_student",
'using' => "prestudent_id"
]
],
'vorname' => [
'alias' => ['firstname'],
'comparison' => 'similar',
'field' => 'vorname',
'join' => [
'table' => "public.tbl_person",
'using' => "person_id"
]
],
'nachname' => [
'alias' => ['lastname', 'surename'],
'comparison' => 'similar',
'field' => 'nachname',
'join' => [
'table' => "public.tbl_person",
'using' => "person_id"
]
],
'name' => [
'comparison' => 'similar',
'field' => "(vorname || ' ' || nachname)",
'join' => [
'table' => "public.tbl_person",
'using' => "person_id"
]
],
'email' => [
'comparison' => 'similar',
'field' => 'kontakt',
'join' => [
'table' => "public.tbl_kontakt",
'on' => "kontakttyp = 'email' AND tbl_kontakt.person_id = tbl_prestudent.person_id"
],
"1-n" => true
],
'tel' => [
'alias' => ['phone', 'telefon'],
'comparison' => 'similar',
'field' => 'kontakt',
'join' => [
'table' => "public.tbl_kontakt",
'on' => "kontakttyp IN ('telefon', 'so.tel', 'mobil') AND tbl_kontakt.person_id = tbl_prestudent.person_id"
],
"1-n" => true
],
'stg' => [
'alias' => ['studiengang'],
'comparison' => 'equals',
'field' => "typ || kurzbz",
'join' => [
'table' => "public.tbl_studiengang",
'using' => "studiengang_kz"
]
],
'preid' => [
'alias' => ['prestudent_id'],
'comparison' => 'equal-int',
'field' => 'prestudent_id'
],
'pid' => [
'alias' => ['person_id'],
'comparison' => 'equal-int',
'field' => 'person_id',
'join' => [
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'resultfields' => [
"ps.prestudent_id",
"ps.studiengang_kz",
"s.matrikelnr",
"p.person_id",
"b.uid",
"(p.vorname || ' ' || p.nachname) AS name",
"(b.uid || '@" . DOMAIN . "') || ARRAY( SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp = 'email' AND person_id=p.person_id ) AS email",
"CASE
WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto
ELSE NULL END
AS photo_url",
"UPPER(sg.typ || sg.kurzbz) AS stg_kuerzel",
"sg.bezeichnung",
"(
SELECT bezeichnung_mehrsprachig[(TABLE lang)]
FROM public.tbl_status
WHERE status_kurzbz = public.get_rolle_prestudent(ps.prestudent_id, NULL)
LIMIT 1
) AS status",
"COALESCE(
(
SELECT COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz)
FROM public.tbl_prestudentstatus pss
LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id)
WHERE pss.prestudent_id=ps.prestudent_id
ORDER BY pss.datum DESC, pss.insertamum DESC, pss.ext_id DESC
LIMIT 1
),
sg.orgform_kurzbz
) AS orgform",
"b.aktiv",
"array_position(" . $prestudent_sort_array . ", public.get_rolle_prestudent(ps.prestudent_id, NULL)) AS sort"
],
'resultjoin' => "
LEFT JOIN public.tbl_prestudent ps USING (prestudent_id)
LEFT JOIN public.tbl_student s ON (ps.prestudent_id = s.prestudent_id)
LEFT JOIN public.tbl_benutzer b ON (b.uid = s.student_uid)
JOIN public.tbl_person p ON (p.person_id = ps.person_id)
LEFT JOIN public.tbl_studiengang sg ON (sg.studiengang_kz = ps.studiengang_kz)"
];
$config['employee'] = [
'alias' => ['ma', 'mitarbeiter'],
'primarykey' => 'mitarbeiter_uid',
'table' => 'public.tbl_mitarbeiter',
'searchfields' => [
'uid' => [
'alias' => ['mitarbeiter_uid'],
'comparison' => 'equals',
'field' => "mitarbeiter_uid"
],
'vorname' => [
'alias' => ['firstname'],
'comparison' => 'similar',
'field' => "vorname",
'join' => [
[
'table' => "public.tbl_benutzer",
'on' => "uid = mitarbeiter_uid"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'nachname' => [
'alias' => ['lastname', 'surename'],
'comparison' => 'similar',
'field' => "nachname",
'join' => [
[
'table' => "public.tbl_benutzer",
'on' => "uid = mitarbeiter_uid"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'name' => [
'comparison' => 'similar',
'field' => "(vorname || ' ' || nachname)",
'join' => [
[
'table' => "public.tbl_benutzer",
'on' => "uid = mitarbeiter_uid"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
],
'email' => [
'comparison' => 'similar',
'field' => "COALESCE(alias, uid) || '" . '@' . DOMAIN . "'",
'join' => [
'table' => "public.tbl_benutzer",
'on' => "uid = mitarbeiter_uid"
]
],
'tel' => [
'alias' => ['phone', 'telefon'],
'comparison' => 'similar',
'field' => "TRIM(COALESCE(kontakt, '') || ' ' || COALESCE(telefonklappe, ''))",
'join' => [
'table' => "public.tbl_kontakt",
'on' => "kontakttyp = 'telefon' AND tbl_kontakt.standort_id = tbl_mitarbeiter.standort_id"
],
"1-n" => true
],
'pid' => [
'alias' => ['person_id'],
'comparison' => 'equal-int',
'field' => "person_id",
'join' => [
'table' => "public.tbl_benutzer",
'on' => "uid = mitarbeiter_uid"
]
],
'oe' => [
'alias' => ['ou', 'organisationseinheit', 'organisationunit'],
'comparison' => 'vector',
'field' => "fts_bezeichnung",
'join' => [
[
'table' => "public.tbl_benutzerfunktion",
'on' => "mitarbeiter_uid = uid
AND funktion_kurzbz = 'oezuordnung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())"
],
[
'table' => "public.tbl_organisationseinheit",
'using' => "oe_kurzbz"
]
],
'1-n' => true
],
'kst' => [
'comparison' => 'vector',
'field' => "fts_bezeichnung",
'join' => [
[
'table' => "public.tbl_benutzerfunktion",
'on' => "mitarbeiter_uid = uid
AND funktion_kurzbz = 'kstzuordnung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())"
],
[
'table' => "public.tbl_organisationseinheit",
'using' => "oe_kurzbz"
]
],
'1-n' => true
]
],
'resultfields' => [
"b.uid",
"p.person_id",
"(p.vorname || ' ' || p.nachname) AS name",
"ARRAY(
SELECT
'[' || ot.bezeichnung || '] ' || o.bezeichnung AS bezeichnung
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
WHERE bf.funktion_kurzbz = 'oezuordnung'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
AND bf.uid = b.uid
GROUP BY o.bezeichnung, ot.bezeichnung
) AS organisationunit_name",
"COALESCE(b.alias, b.uid) || '" . '@' . DOMAIN . "' AS email",
"TRIM(COALESCE(k.kontakt, '') || ' ' || COALESCE(m.telefonklappe, '')) AS phone",
"'" . base_url("/cis/public/bild.php?src=person&person_id=") . "' || p.person_id AS photo_url",
"ARRAY(
SELECT
'[' || ot.bezeichnung || '] ' || o.bezeichnung AS bezeichnung
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
WHERE bf.funktion_kurzbz = 'kstzuordnung'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
AND bf.uid = b.uid
GROUP BY o.bezeichnung, ot.bezeichnung
) AS standardkostenstelle"
],
'resultjoin' => "
JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid)
JOIN public.tbl_benutzer b ON (b.uid = m.mitarbeiter_uid)
JOIN public.tbl_person p USING(person_id)
LEFT JOIN (
SELECT kontakt, standort_id
FROM public.tbl_kontakt
WHERE kontakttyp = 'telefon'
) k ON (k.standort_id = m.standort_id)"
];
// TODO(chris): move to searchpv21.php
$config['unassigned_employee'] = $config['employee'];
$config['unassigned_employee']['alias'] = ['mitarbeiter_ohne_zuordnung'];
$config['unassigned_employee']['prepare'] = "unassigned_employee AS (
SELECT tbl_mitarbeiter.*
FROM public.tbl_mitarbeiter
LEFT JOIN public.tbl_benutzerfunktion ON (
uid = mitarbeiter_uid
AND funktion_kurzbz = 'kstzuordnung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
)
WHERE tbl_benutzerfunktion.bezeichnung IS NULL
UNION
SELECT tbl_mitarbeiter.*
FROM public.tbl_mitarbeiter
LEFT JOIN public.tbl_benutzerfunktion ON (
uid = mitarbeiter_uid
AND funktion_kurzbz = 'oezuordnung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
)
WHERE tbl_benutzerfunktion.bezeichnung IS NULL
)";
$config['unassigned_employee']['table'] = "unassigned_employee";
$config['unassigned_employee']['searchfields']['tel']['join']['on'] = "
kontakttyp = 'telefon'
AND tbl_kontakt.standort_id = unassigned_employee.standort_id
";
$config['unassigned_employee']['renderer'] = 'employee';
$config['organisationunit'] = [
'alias' => ['ou', 'organisationseinheit', 'oe'],
'primarykey' => 'oe_kurzbz',
'table' => 'public.tbl_organisationseinheit',
'searchfields' => [
'uid' => [
'comparison' => 'equals',
'field' => 'uid',
'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS (
SELECT oe_kurzbz, vorname, nachname, uid
FROM public.tbl_benutzerfunktion
JOIN public.tbl_benutzer USING (uid)
JOIN public.tbl_person USING (person_id)
WHERE funktion_kurzbz = 'Leitung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND tbl_benutzer.aktiv = TRUE
)",
'join' => [
'table' => "organisationunit_leader",
'using' => "oe_kurzbz"
],
'1-n' => true
],
'vorname' => [
'alias' => ['firstname'],
'comparison' => 'similar',
'field' => 'vorname',
'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS (
SELECT oe_kurzbz, vorname, nachname, uid
FROM public.tbl_benutzerfunktion
JOIN public.tbl_benutzer USING (uid)
JOIN public.tbl_person USING (person_id)
WHERE funktion_kurzbz = 'Leitung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND tbl_benutzer.aktiv = TRUE
)",
'join' => [
'table' => "organisationunit_leader",
'using' => "oe_kurzbz"
],
'1-n' => true
],
'nachname' => [
'alias' => ['lastname', 'surename'],
'comparison' => 'similar',
'field' => 'nachname',
'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS (
SELECT oe_kurzbz, vorname, nachname, uid
FROM public.tbl_benutzerfunktion
JOIN public.tbl_benutzer USING (uid)
JOIN public.tbl_person USING (person_id)
WHERE funktion_kurzbz = 'Leitung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND tbl_benutzer.aktiv = TRUE
)",
'join' => [
'table' => "organisationunit_leader",
'using' => "oe_kurzbz"
],
'1-n' => true
],
'name' => [
'comparison' => 'similar',
'field' => "(vorname || ' ' || nachname)",
'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS (
SELECT oe_kurzbz, vorname, nachname, uid
FROM public.tbl_benutzerfunktion
JOIN public.tbl_benutzer USING (uid)
JOIN public.tbl_person USING (person_id)
WHERE funktion_kurzbz = 'Leitung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND tbl_benutzer.aktiv = TRUE
)",
'join' => [
'table' => "organisationunit_leader",
'using' => "oe_kurzbz"
],
'1-n' => true
],
'oe' => [
'alias' => ['ou', 'organisationseinheit', 'organisationunit'],
'comparison' => 'vector',
'field' => "fts_bezeichnung"
],
'kurzbz' => [
'alias' => ['oe_kurzbz'],
'comparison' => 'equals',
'field' => "oe_kurzbz"
]
],
'resultfields' => [
"oe.oe_kurzbz",
"('[' || type.bezeichnung || '] ' || oe.bezeichnung) AS name",
"oe_parent.oe_kurzbz AS parentoe_kurzbz",
"(CASE WHEN oe_parent.bezeichnung IS NOT NULL THEN '[' || type_parent.bezeichnung || '] ' || oe_parent.bezeichnung END) AS parentoe_name",
"ARRAY(
SELECT JSON_BUILD_OBJECT('uid', b.uid, 'vorname', p.vorname, 'nachname', p.nachname, 'name', (p.vorname || ' ' || p.nachname))
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_benutzer b USING (uid)
JOIN public.tbl_person p USING (person_id)
WHERE funktion_kurzbz = 'Leitung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND b.aktiv = TRUE
AND oe_kurzbz = oe.oe_kurzbz
) AS leaders",
"(
SELECT COUNT(*)
FROM public.tbl_benutzerfunktion
WHERE funktion_kurzbz = 'oezuordnung'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND oe_kurzbz = oe.oe_kurzbz
) AS number_of_people",
"(CASE WHEN oe.mailverteiler THEN oe.oe_kurzbz || '" . '@' . DOMAIN . "' END) AS mailgroup"
],
'resultjoin' => "
JOIN public.tbl_organisationseinheit oe
USING (oe_kurzbz)
JOIN public.tbl_organisationseinheittyp type
USING (organisationseinheittyp_kurzbz)
LEFT JOIN public.tbl_organisationseinheit oe_parent
ON (oe_parent.oe_kurzbz = oe.oe_parent_kurzbz)
LEFT JOIN public.tbl_organisationseinheittyp type_parent
ON (oe_parent.organisationseinheittyp_kurzbz = type_parent.organisationseinheittyp_kurzbz)"
];
$config['room'] = [
'alias' => ['raum'],
'primarykey' => 'ort_kurzbz',
'table' => 'public.tbl_ort',
'searchfields' => [
'name' => [
'comparison' => 'similar',
'field' => 'ort_kurzbz'
]
],
'resultfields' => [
"ort.ort_kurzbz",
"ort.gebteil AS building",
"ort.ausstattung AS equipment",
"ort.stockwerk AS floor",
"ort.dislozierung AS room_number",
"ort.content_id",
"address.ort AS city",
"address.plz AS zip",
"address.strasse AS street",
"ort.max_person",
"ort.arbeitsplaetze AS workplaces"
],
'resultjoin' => "
JOIN public.tbl_ort ort
USING (ort_kurzbz)
LEFT JOIN public.tbl_standort
USING (standort_id)
LEFT JOIN public.tbl_adresse address
USING (adresse_id)"
];
$sprache = getUserLanguage();
$config['cms'] = [
'primarykey' => 'contentsprache_id',
'table' => 'campus.tbl_contentsprache',
'prepare' => "
cms_auth (content_id) AS (
SELECT content_id
FROM campus.tbl_content c
WHERE NOT EXISTS (SELECT 1 FROM campus.tbl_contentgruppe g WHERE g.content_id=c.content_id)
UNION
SELECT content_id
FROM public.vw_gruppen g
JOIN campus.tbl_contentgruppe c USING (gruppe_kurzbz)
WHERE uid = (TABLE auth)
),
cms_active (content_id, template_kurzbz) AS (
SELECT content_id, template_kurzbz
FROM cms_auth
JOIN campus.tbl_content USING (content_id)
WHERE aktiv = TRUE
),
cms_active_redirect (content_id) AS (
SELECT content_id
FROM cms_active
WHERE template_kurzbz = 'redirect'
),
cms_active_redirect_linked (content_id) AS (
SELECT content_id
FROM cms_active_redirect
JOIN campus.tbl_contentsprache USING (content_id)
WHERE LEFT((xpath('string(/content/url)', content))[1]::text, 1) <> '#'
),
cms_active_others (content_id) AS (
SELECT content_id
FROM cms_active
WHERE template_kurzbz IN ('contentmittitel', 'contentohnetitel', 'contentmittitel_filterwidget')
)
",
'searchfields' => [
'content' => [
'alias' => ['inhalt'],
'comparison' => "vector",
'field' => "(
setweight(to_tsvector('simple', COALESCE(titel, '')), 'A')
||
setweight(to_tsvector('simple', COALESCE(content, '')::text), 'B')
)"
],
'content_id' => [
'alias' => ['id'],
'comparison' => "equal-int",
'field' => "content_id"
],
'lang' => [
'alias' => ['language', 'sprache'],
'comparison' => "equals",
'field' => "sprache"
]
],
'resultfields' => [
"contentsprache.content_id",
"content.template_kurzbz",
"contentsprache.version",
"contentsprache.sprache AS language",
"contentsprache.titel AS title",
"contentsprache.content",
"(xpath('string(/content/url)', contentsprache.content))[1] AS content_url"
],
'resultjoin' => "
JOIN campus.tbl_contentsprache contentsprache
USING (contentsprache_id)
JOIN campus.tbl_content content
USING (content_id)
WHERE content_id IN (
SELECT content_id
FROM cms_active_redirect_linked
UNION
SELECT content_id
FROM cms_active_others
)
AND version = campus.get_highest_content_version(content_id)
AND contentsprache.sprache = '{$sprache}'"
];
$config['dms'] = [
'primarykey' => 'dms_id, version',
'table' => 'campus.tbl_dms_version',
'searchfields' => [
'keywords' => [
'alias' => ['keyword', 'keywords', 'schlagwort', 'schlagworte'],
'comparison' => "vector",
'field' => "(to_tsvector('simple', COALESCE(schlagworte, '')))"
]
],
'resultfields' => [
"v.dms_id",
"v.version",
"v.filename",
"v.mimetype",
"v.name",
"v.beschreibung AS description",
"v.schlagworte AS keywords"
],
'resultjoin' => "
JOIN campus.tbl_dms_version v
USING (dms_id, version)
WHERE cis_suche = TRUE
AND version=(SELECT MAX(version) FROM campus.tbl_dms_version WHERE dms_id=v.dms_id)
AND NOT EXISTS (
SELECT
1
FROM
fue.tbl_projekt_dokument p
WHERE p.dms_id = v.dms_id
) AND (
NOT EXISTS (
WITH RECURSIVE categories (kategorie_kurzbz) AS (
SELECT
kategorie_kurzbz
FROM
campus.tbl_dms c
WHERE c.dms_id = v.dms_id
UNION ALL
SELECT
cat.parent_kategorie_kurzbz AS kategorie_kurzbz
FROM
categories
JOIN campus.tbl_dms_kategorie cat USING (kategorie_kurzbz)
)
SELECT
1
FROM
categories
JOIN campus.tbl_dms_kategorie_gruppe USING (kategorie_kurzbz)
UNION
SELECT
1
FROM
categories
JOIN campus.tbl_dms_kategorie USING (kategorie_kurzbz)
WHERE
berechtigung_kurzbz IS NOT NULL
) OR EXISTS (
WITH RECURSIVE categories (kategorie_kurzbz) AS (
SELECT
kategorie_kurzbz
FROM
campus.tbl_dms c
WHERE c.dms_id = v.dms_id
UNION ALL
SELECT
cat.parent_kategorie_kurzbz AS kategorie_kurzbz
FROM
categories
JOIN campus.tbl_dms_kategorie cat USING (kategorie_kurzbz)
)
SELECT
1
FROM
categories
JOIN campus.tbl_dms_kategorie_gruppe USING (kategorie_kurzbz)
JOIN public.tbl_benutzergruppe USING(gruppe_kurzbz)
WHERE
uid = (TABLE auth)
)
)"
];
+48
View File
@@ -0,0 +1,48 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$CI =& get_instance();
$config['employee'] = $CI->config->item('employee', 'search');
$config['employee']['resultjoin'] = "
JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid)
JOIN public.tbl_benutzer b ON (b.uid = m.mitarbeiter_uid AND b.aktiv = true)
JOIN public.tbl_person p USING(person_id)
LEFT JOIN (
SELECT kontakt, standort_id
FROM public.tbl_kontakt
WHERE kontakttyp = 'telefon'
) k ON (k.standort_id = m.standort_id)";
$config['student'] = $CI->config->item('student', 'search');
unset($config['student']['searchfields']['email']);
unset($config['student']['searchfields']['tel']);
$config['student']['resultfields'] = [
"s.student_uid AS uid",
"s.matrikelnr",
"p.person_id",
"(p.vorname || ' ' || p.nachname) AS name",
"ARRAY[s.student_uid || '@' || '" . DOMAIN . "'] AS email",
"CASE
WHEN (p.foto_sperre = false AND p.foto IS NOT NULL) THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto
ELSE NULL END
AS photo_url",
"b.aktiv"
];
$config['student']['resultjoin'] = "
JOIN public.tbl_student s USING (student_uid)
JOIN public.tbl_benutzer b ON(b.uid = s.student_uid AND b.aktiv = true)
JOIN public.tbl_person p USING(person_id)";
$config['organisationunit'] = $CI->config->item('organisationunit', 'search');
$config['organisationunit']['prepare'] = 'active_organisationseinheit AS (SELECT * FROM public.tbl_organisationseinheit WHERE aktiv = true AND organisationseinheittyp_kurzbz <> \'Container\')';
$config['organisationunit']['table'] = 'active_organisationseinheit';
$config['room'] = $CI->config->item('room', 'search');
$config['cms'] = $CI->config->item('cms', 'search');
$config['dms'] = $CI->config->item('dms', 'search');
+35
View File
@@ -0,0 +1,35 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/*
* TODO: 2025-07-21 ma0080 bare integer comparision results in db error
* if searchstring is numeric but out of range of int, think about
* more sophisticated solution using column data type - quick fix
* convert field and search string to text
*/
$config['equal-int'] = [
'priority' => 4,
'rank' => "0",
'compare' => "{field}::text = {word}::text",
'force_integer' => true
];
$config['equals'] = [
'priority' => 3,
'rank' => "0",
'compare' => "LOWER({field}) = {word}"
];
$config['similar'] = [
'priority' => 2,
'rank' => "(COALESCE({field}, '') <->> {word})",
'compare' => "COALESCE({field}, '') %> {word}",
'compare_boolean' => "COALESCE({field}, '') ILIKE {like:word}"
];
$config['vector'] = [
'priority' => 1,
'rank' => "ts_rank({field}, plainto_tsquery('simple', {word}))",
'compare' => "plainto_tsquery('simple', {word}) @@ {field}"
];
+49
View File
@@ -0,0 +1,49 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$CI =& get_instance();
$config['student'] = $CI->config->item('student', 'search');
$config['student']['searchfields']['pkz'] = [
'alias' => ['personenkennzeichen', 'personalid'],
'comparison' => 'equals',
'field' => 'matrikelnr'
];
$config['student']['searchfields']['matrnr'] = [
'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
'comparison' => 'equals',
'field' => 'matr_nr',
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
];
$config['prestudent'] = $CI->config->item('prestudent', 'search');
$config['prestudent']['searchfields']['pkz'] = [
'alias' => ['personenkennzeichen', 'personalid'],
'comparison' => 'equals',
'field' => 'matrikelnr',
'join' => [
'table' => "public.tbl_student",
'using' => "prestudent_id"
]
];
$config['prestudent']['searchfields']['matrnr'] = [
'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
'comparison' => 'equals',
'field' => 'matr_nr',
'join' => [
'table' => "public.tbl_person",
'using' => "person_id"
]
];
+145
View File
@@ -0,0 +1,145 @@
<?php
$config['number_displayed_past_studiensemester_default'] = 5;
$config['tabs'] =
[
'details' => [
//all fields can be configured to be hidden, see class attribute stv-details-details-name for name
'hiddenFields' => [],
'hideUDFs' => false
],
'prestudent' => [
//all fields can be configured to be hidden, see class attribute stv-details-prestudent-name for name
'hiddenFields' => [
//propably used by FH-Communities
'aufnahmeschluessel', 'standort_code', 'facheinschlaegigBerufstaetig'
],
'hideUDFs' => false
],
'finalexam' => [
'documents' => [
'pruefungsprotokoll' => [
'de' => [
'Bakk' => 'PrProtBA',
'Master' => 'PrProtMA',
],
'en' => [
'Bakk' => 'PrProtBAEng',
'Master' => 'PrProtMAEng',
],
],
'pruefungszeugnis' => [
'de' => [
'Bakk' => 'Bakkzeugnis',
'Master' => 'Diplomzeugnis',
],
'en' => [
'Bakk' => 'BakkzeugnisEng',
'Master' => 'DiplomzeugnisEng',
],
],
'urkunde' => [
'de' => [
'Bakk' => 'Bakkurkunde',
'Master' => 'Diplomurkunde',
],
'en' => [
'Bakk' => 'BakkurkundeEng',
'Master' => 'DiplomurkundeEng',
],
],
],
],
'exemptions' => [
//if true, Anrechnungen can be added and edited in tab Anrechnungen
'editableAnrechnungen' => false,
],
'notes' => [
//if true, the count of Messages will be shown in the header of the Tab Messages
'showCountNotes' => true
],
'combinePeople' => [
//multitab should only be shown with this length of selection
'validCountMulti' => 2,
],
];
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code'];
// List of fields to show when ZGV_ERFUELLT_ANZEIGEN is defined
$fieldsZgvErfuellt = ['zgv_erfuellt', 'zgvmas_erfuellt','zgvdoktor_erfuellt'];
//order important: to show zgf_erfuellt_doktor just in case visibility of doktor is true
if (!defined('ZGV_ERFUELLT_ANZEIGEN') || !ZGV_ERFUELLT_ANZEIGEN) {
$config['tabs']['prestudent']['hiddenFields'] = array_merge(
$config['tabs']['prestudent']['hiddenFields'], $fieldsZgvErfuellt
);
}
if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
$config['tabs']['prestudent']['hiddenFields'] = array_merge(
$config['tabs']['prestudent']['hiddenFields'],
$fieldsZgvDoktor
);
}
$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] =
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR')
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR
: '0.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] =
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER')
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER
: '0.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0';
$config['student_tab_order'] = [
'details',
'notes',
'messages',
'contact',
'prestudent',
'status',
'documents',
'archive',
'banking',
'grades',
'exam',
'exemptions',
'projektarbeit',
'finalexam',
'mobility',
'jointstudies',
'admissionDates',
'groups',
'functions',
'coursedates',
'resources',
];
$config['students_tab_order'] = [
'banking',
'status',
'messages',
'groups',
'finalexam',
'combinePeople',
'archive',
];
$config['stv_prestudent_tags'] = [
'prioone' => ['readonly' => false],
'priotwo' => ['readonly' => true],
'hinweis' => ['readonly' => false],
'hinweis_assistenz' => ['readonly' => true],
'hinweis_kf' => ['readonly' => true],
'hinweis_lehrende' => ['readonly' => false],
'hinweis_stg_kf' => ['readonly' => true],
'finished_stg' => ['readonly' => true],
'finished_kf' => ['readonly' => true],
'inwork_kf' => ['readonly' => true],
];
+11
View File
@@ -0,0 +1,11 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
// changing the color theme
$config['theme_name']='default';
$config['theme_css']= "public/css/theme/default.css";
$config['theme_logo']= "public/images/logo_fh-complete_300x46.png";
$config['theme_modes']=['light','dark'];
@@ -0,0 +1,97 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class Abgabetool extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => self::PERM_LOGGED,
'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
'Assistenz' => array('basis/abgabe_assistenz:rw'),
'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
// TODO: routing from index based on berechtigung?
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
}
}
public function Student($student_uid_prop = '')
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
}
}
public function Mitarbeiter()
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
}
}
public function Assistenz($stg_kz_prop = '')
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
}
}
public function Deadlines()
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
}
}
}
+78
View File
@@ -0,0 +1,78 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class Auth extends FHC_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
// Load Helpers
$this->load->helper('form');
$this->load->helper('hlp_authentication');
// Loads phrases system
$this->loadPhrases([
'global'
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function login()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'required|trim|callback_validation');
$this->form_validation->set_rules('password', 'Password', 'required|trim');
if ($this->form_validation->run())
{
redirect($this->authlib->getLandingPage('/CisVue/Dashboard'));
}
else
{
$this->load->view('Cis/Login');
}
}
/**
* @return boolean
*/
public function validation()
{
$username = $this->input->post('username');
$password = $this->input->post('password');
$this->load->library('AuthLib', [false]); // without authentication otherwise loooooop!
$login = $this->authlib->loginLDAP($username, $password);
if (isSuccess($login))
return true;
$this->form_validation->set_message('validation', 'Incorrect username/password.');
return false;
}
/**
* @return void
*/
public function logout()
{
$this->load->library('AuthLib');
$this->authlib->logout();
setcookie('fhclogout', 'fhclogout', 0, '/');
redirect(base_url('/cis/private/logout.php'), 'refresh');
}
}
+192
View File
@@ -0,0 +1,192 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
*
*/
class Documents extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => [self::PERM_LOGGED],
'student' => ['admin:r'],
'download' => [self::PERM_LOGGED]
]);
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->loadPhrases([
'global',
'tools'
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
return $this->showDocuments(getAuthUID());
}
/**
* @param string $uid Administratoren dürfen die UID als Parameter übergeben um die Dokumente von anderen Personen anzuzeigen
* @return void
*/
public function student($uid)
{
return $this->showDocuments($uid);
}
/**
* @param string $uid
* @return void
*/
protected function showDocuments($uid)
{
$this->load->model('crm/Konto_model', 'KontoModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$stati = $this->PrestudentstatusModel->loadWhereUid($uid, null, true);
if (isError($stati))
return $this->load->view('errors/html/error_db.php', [
'heading' => 'Database Error',
'message' => getError($stati)
]);
$stati = getData($stati);
if (!$stati)
return $this->load->view('errors/html/error_general.php', [
'heading' => 'User ist kein Student',
'message' => 'Es konnten keine Studiensemester gefunden werden in denen der User als Student inskripiert ist'
]);
$stgs = [];
$stsemArray = [];
$buchungstypen = defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : [];
$person_ids = [];
foreach ($stati as $status) {
$person_ids[] = $status->person_id;
if(!in_array($status->studiensemester_kurzbz, $stsemArray)) {
$stsemArray[] = $status->studiensemester_kurzbz;
}
if (!isset($stgs[$status->studiengang_kz])) {
$stg = $this->StudiengangModel->load($status->studiengang_kz);
if (isError($stg))
return $this->load->view('errors/html/error_db.php', [
'heading' => 'Database Error',
'message' => getError($stg)
]);
$stg = getData($stg);
if (!$stg)
return $this->load->view('errors/html/error_db.php', [
'heading' => 'Database Error',
'message' => 'No Studiengang found for studiengang_kz ' . $status->studiengang_kz
]);
$stgs[$status->studiengang_kz] = current($stg);
$stgs[$status->studiengang_kz]->studiensemester = [];
}
if (!isset($stgs[$status->studiengang_kz]->studiensemester[$status->studiensemester_kurzbz])) {
$stgs[$status->studiengang_kz]->studiensemester[$status->studiensemester_kurzbz] = new stdClass();
$stgs[$status->studiengang_kz]->studiensemester[$status->studiensemester_kurzbz]->inskriptionsbestaetigung = (boolean)getData(
$this->KontoModel->checkStudienbeitragFromPrestudent(
$status->prestudent_id,
$status->studiensemester_kurzbz,
$buchungstypen
)
);
}
}
$person_ids = array_unique($person_ids);
$selfservice = null;
if (!defined('CIS_DOKUMENTE_SELFSERVICE') || CIS_DOKUMENTE_SELFSERVICE) {
$this->load->model('crm/Akte_model', 'AkteModel');
$selfservice = [];
foreach ($person_ids as $person_id) {
$result = $this->AkteModel->getArchiv($person_id, null, true);
if (isError($result))
return $this->load->view('errors/html/error_db.php', [
'heading' => 'Database Error',
'message' => getError($result)
]);
$selfservice = array_merge($selfservice, getData($result) ?: []);
}
}
$this->load->view('Cis/Documents', [
'stsemArray' => $stsemArray,
'stgs' => $stgs,
'uid' => $uid,
'studienbuchblatt' => defined('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN') && CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN,
'studienerfolgsbestaetigung' => defined('CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN') && CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN,
'selfservice' => $selfservice
]);
}
/**
* @param integer $akte_id
* @param string $uid (optional) Administratoren dürfen die UID als Parameter übergeben um die Dokumente von anderen Personen anzuzeigen
*
* @return void
*/
public function download($akte_id, $uid = null)
{
if (!is_numeric($akte_id))
return show_404();
$this->load->model('crm/Akte_model', 'AkteModel');
$result = $this->AkteModel->load($akte_id);
if (isError($result))
return show_error(getError($result));
$akte = getData($result);
if (!$akte)
return show_404();
$akte = current($akte);
$admin_access = false;
if ($uid !== null && $this->permissionlib->isBerechtigt('admin')) {
$stati = $this->PrestudentstatusModel->loadWhereUid($uid, null, true);
if (hasData($stati)) {
$person_ids = array_map(function ($status) {
return $status->person_id;
}, getData($stati));
$person_ids = array_unique($person_ids);
if (count($person_ids) == 1 && current($person_ids) == $akte->person_id) {
$admin_access = true;
}
}
}
if (!$admin_access && ($akte->person_id != getAuthPersonId() || !$akte->stud_selfservice))
return show_error('Forbidden', 403);
// NOTE(chris): Log bei einem Download vom Becheid
if (isset($akte->dokument_kurzbz) && ($akte->dokument_kurzbz === 'Bescheid' || $akte->dokument_kurzbz === 'BescheidEng')) {
$this->load->model('system/Webservicelog_model', 'WebservicelogModel');
$this->WebservicelogModel->insert([
'webservicetyp_kurzbz' => 'content',
'request_id' => (isset($akte->akte_id) && !empty($akte->akte_id)) ? $akte->akte_id : null,
'beschreibung' => 'Bescheidbestaetigungsdownload',
'request_data' => $_SERVER['QUERY_STRING'],
'execute_time' => date('c'),
'execute_user' => getAuthUID()
]);
}
$this->output->set_content_type($akte->mimetype);
$this->output->set_output(base64_decode($akte->inhalt));
}
}
@@ -3,30 +3,28 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Test VBform Vue Component
*
*/
class TestVBform extends Auth_Controller
class InfoTerminal extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'system/developer:r'
)
);
parent::__construct([
'index' => ['basis/cis:r'],
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
* @return void
*/
public function index()
{
$this->load->view('system/logs/testVBform.php');
$this->load->view('Cis/InfoTerminal.php', []);
}
}
+39
View File
@@ -0,0 +1,39 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class LvPlan extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r']
]);
// Load Config
$this->load->config('calendar');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$viewData = array(
'uid'=>getAuthUID(),
'timezone' => $this->config->item('timezone')
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'LvPlan']);
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class MyLv extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r'],
'Info' => [self::PERM_LOGGED]
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$viewData = array(
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
}
}
+39
View File
@@ -0,0 +1,39 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class MyLvPlan extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r']
]);
// Load Config
$this->load->config('calendar');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$viewData = array(
'uid'=>getAuthUID(),
'timezone' => $this->config->item('timezone')
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLvPlan']);
}
}
+755
View File
@@ -0,0 +1,755 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Profil extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r'],
'foto_sperre_function' => ['basis/cis:r'],
'getView' => ['basis/cis:r'],
'View' => ['basis/cis:r'],
'isMitarbeiter' => ['basis/cis:r'],
'isStudent' => ['basis/cis:r'],
'getZustellAdresse' => ['basis/cis:r'],
'getZustellKontakt' => ['basis/cis:r'],
'getAllNationen' => ['basis/cis:r'],
'getGemeinden' => ['basis/cis:r'],
]);
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('person/Adresse_model', 'AdresseModel');
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
$this->load->model('ressource/Betriebsmittelperson_model', 'BetriebsmittelpersonModel');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$this->load->model('person/Profil_update_model', 'ProfilUpdateModel');
$this->load->model('content/DmsVersion_model', 'DmsVersionModel');
//? put the uid and pid inside the controller for reusability
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* index loads the Profil view
* @access public
* @return void
*/
public function index()
{
$this->load->library('ProfilLib');
$profil_data = $this->profillib->getView(getAuthUID());
$profil_data = hasData($profil_data) ? getData($profil_data) : null;
$viewData = array(
'editable'=>true,
'profil_data' => $profil_data,
);
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilIndex']);
}
/**
* redirects to the index function (needed to allow calling this URI)
* @access public
* @return void
*/
public function View($uid)
{
$this->load->library('ProfilLib');
$profil_data = $this->profillib->getView($uid);
$profil_data = hasData($profil_data) ? getData($profil_data) : null;
$viewData = array (
'uid' => $uid,
'profil_data'=>$profil_data,
);
if($uid == getAuthUID()){
$viewData['editable'] = true;
}
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilViewUid']);
}
/**
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
* @access public
* @param $uid the userID used to check if it is a mitarbeiter
* @return boolean
*/
public function isStudent($uid)
{
$result = $this->StudentModel->isStudent($uid);
if (isError($result)) {
show_error("error when calling Student_model function isStudent with uid " . $uid);
}
$result = getData($result);
echo json_encode($result);
}
/**
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
* @access public
* @param $uid the userID used to check if it is a mitarbeiter
* @return boolean
*/
public function isMitarbeiter($uid)
{
$result = $this->MitarbeiterModel->isMitarbeiter($uid);
if (isError($result)) {
show_error("error when calling Mitarbeiter_model function isMitarbeiter with uid " . $uid);
}
$result = getData($result);
echo json_encode($result);
}
/**
* gets the adressen that are marked as zustell from the currenlty logged in user
* @access public
* @return array a list of adresse_id's
*/
public function getZustellAdresse()
{
$this->AdresseModel->addSelect(["adresse_id"]);
$adressen_res = $this->AdresseModel->loadWhere(['person_id' => $this->pid, 'zustelladresse' => true]);
$adressen_res = hasData($adressen_res) ? getData($adressen_res) : null;
$adressen_res = array_map(function ($item) {
return $item->adresse_id;
}, $adressen_res);
echo json_encode($adressen_res);
}
/**
* gets the kontakte that are marked as zustell from the currenlty logged in user
* @access public
* @return array a list of kontakt_id's
*/
public function getZustellKontakt()
{
$this->KontaktModel->addSelect(["kontakt_id"]);
$kontakt_res = $this->KontaktModel->loadWhere(['person_id' => $this->pid, 'zustellung' => true]);
$kontakt_res = hasData($kontakt_res) ? getData($kontakt_res) : null;
$kontakt_res = array_map(function ($item) {
return $item->kontakt_id;
}, $kontakt_res);
echo json_encode($kontakt_res);
}
/**
* function that returns the data used for the corresponding view
* the client side parses the @param $uid and calls this function to get the data to the correct view
* @access public
* @param boolean $uid the userID used to identify which information should be retrieved for which view
* @return stdClass all the data corresponding to a view of a user
*/
public function getView($uid)
{
$res = new stdClass();
// if parsing the URL did not found a UID then the UID of the logged in user is used
if ($uid == "Profil" || $uid == $this->uid) {
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter($this->uid);
if (isError($isMitarbeiter)) {
show_error("error while checking if UID: " . $this->uid . " is a mitarbeiter");
}
$isMitarbeiter = getData($isMitarbeiter);
if ($isMitarbeiter) {
$res->view = "MitarbeiterProfil";
$res->data = $this->mitarbeiterProfil();
$res->data->pid = $this->pid;
} else {
$res->view = "StudentProfil";
$res->data = $this->studentProfil();
$res->data->pid = $this->pid;
}
}
// UID is availabe when accessing Profil/View/:uid
else {
$this->PersonModel->addSelect(["person_id"]);
$pid = $this->PersonModel->getByUid($uid);
if (isError($pid)) {
show_error("error while trying to update table public.tbl_person while searching for a person with UID: " . $uid);
}
$pid = hasData($pid) ? getData($pid)[0] : null;
if (!$pid) {
show_error("Person with UID: " . $uid . " does not exist");
}
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter($uid);
if (isError($isMitarbeiter)) {
show_error("error while checking if UID: " . $uid . " is a mitarbeiter");
}
$isMitarbeiter = getData($isMitarbeiter);
if ($isMitarbeiter) {
$res->view = "ViewMitarbeiterProfil";
$res->data = $this->viewMitarbeiterProfil($uid);
} else {
$res->view = "ViewStudentProfil";
$res->data = $this->viewStudentProfil($uid);
}
}
echo json_encode($res);
}
/**
* update column foto_sperre in public.tbl_person
* @access public
* @param boolean $value new value for the column
* @return boolean the new value added to the column in public.tbl_person
*/
public function foto_sperre_function($value)
{
$res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]);
if (isError($res)) {
show_error("error while trying to update table public.tbl_person");
}
$this->PersonModel->addSelect("foto_sperre");
$res = $this->PersonModel->load($this->pid);
if (isError($res)) {
show_error("error while trying to query table public.tbl_person");
}
$res = hasData($res) ? getData($res)[0] : null;
echo json_encode($res);
}
/**
* gets all nations in the table bis.tbl_nation
*
* @access public
* @return array all the nations in table bis.tbl_nation
*/
public function getAllNationen()
{
$this->load->model('codex/Nation_model', "NationModel");
$this->NationModel->addSelect(["nation_code as code", "langtext"]);
$nation_res = $this->NationModel->load();
if (isError($nation_res)) {
show_error("error while trying to query table codex.tbl_nation");
}
$nation_res = hasData($nation_res) ? getData($nation_res) : null;
echo json_encode($nation_res);
}
/**
* gets specific gemeinden which are related to the ZIP and the Nation passed in the body of the get request
* @access public
* @var $_GET function uses GET request payload
* @return boolean the new value added to the column in public.tbl_person
*/
public function getGemeinden()
{
/** @var $nation value parsed out of the body of the get request */
$nation = $this->input->get('nation', true);
/** @var $zip value parsed out of the body of the get request and converted to a php integer with json_decode */
$zip = json_decode($this->input->get('zip', true));
$this->load->model('codex/Gemeinde_model', "GemeindeModel");
$this->GemeindeModel->addDistinct();
$this->GemeindeModel->addSelect(["name"]);
if ($nation == "A") {
if (isset($zip) && $zip > 999 && $zip < 32000) {
$gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]);
if (isError($gemeinde_res)) {
show_error("error while trying to query bis.tbl_gemeinde");
}
$gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null;
$gemeinde_res = array_map(function ($obj) {
return $obj->name;
}, $gemeinde_res);
echo json_encode($gemeinde_res);
} else {
echo json_encode(error("ortschaftskennziffer code was not valid"));
}
} else {
echo json_encode(error("Nation was not 'A' (Austria)"));
}
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* function that returns the data used for viewing another mitarbeiter profile
* @access private
* @param integer $uid the userID to retrieve the mitarbeiter data
* @return stdClass restricted mitarbeiter data
*/
private function viewMitarbeiterProfil($uid)
{
$mailverteiler_res = $this->getMailverteiler($uid);
$benutzer_funktion_res = $this->getBenutzerFunktion($uid);
$benutzer_res = $this->getBenutzerAlias($uid);
$person_res = $this->getPersonInfo($uid);
$mitarbeiter_res = $this->getMitarbeiterInfo($uid);
$telefon_res = $this->getTelefonInfo($uid);
$res = new stdClass();
$res->username = $uid;
//? Person Info
foreach ($person_res as $key => $val) {
$res->$key = $val;
}
//? Mitarbeiter Info
foreach ($mitarbeiter_res as $key => $val) {
$res->$key = $val;
}
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = $uid . "@" . DOMAIN;
$extern_email = array();
$extern_email["type"] = "alias";
$extern_email["email"] = $benutzer_res->alias . "@" . DOMAIN;
$res->emails = array($intern_email, $extern_email);
$res->funktionen = $benutzer_funktion_res;
$res->mailverteiler = $mailverteiler_res;
$res->standort_telefon = isset($telefon_res) ? $telefon_res->kontakt : null;
return $res;
}
/**
* function that returns the data used for viewing another student profile
* @access private
* @param integer $uid the userID to retrieve the student data
* @return stdClass restricted student data
*/
private function viewStudentProfil($uid)
{
$mailverteiler_res = $this->getMailverteiler($uid);
$person_res = $this->getPersonInfo($uid);
$student_res = $this->getStudentInfo($uid);
$matr_res = $this->getMatrikelNummer($uid);
$res = new stdClass();
$res->username = $uid;
//? Person Information
foreach ($person_res as $key => $value) {
$res->$key = $value;
}
//? Student Information
foreach ($student_res as $key => $value) {
$res->$key = $value;
}
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = $uid . "@" . DOMAIN;
$res->emails = [$intern_email];
$res->matrikelnummer = $matr_res->matr_nr;
$res->mailverteiler = $mailverteiler_res;
return $res;
}
/**
* function that returns the data used for the mitarbeiter profile
* @access private
* @return stdClass mitarbeiter data
*/
private function mitarbeiterProfil()
{
$zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($this->uid);
$adresse_res = $this->getAdressenInfo($this->pid);
$kontakte_res = $this->getKontaktInfo($this->pid);
$mailverteiler_res = $this->getMailverteiler($this->uid);
$person_res = $this->getPersonInfo($this->uid, true);
$benutzer_funktion_res = $this->getBenutzerFunktion($this->uid);
$betriebsmittelperson_res = $this->getBetriebsmittelInfo($this->pid);
$profilUpdates = $this->getProfilUpdates($this->uid);
$telefon_res = $this->getTelefonInfo($this->uid);
$mitarbeiter_res = $this->getMitarbeiterInfo($this->uid);
$res = new stdClass();
$res->username = $this->uid;
//? Person Information
foreach ($person_res as $key => $value) {
$res->$key = $value;
}
//? Mitarbeiter Information
foreach ($mitarbeiter_res as $key => $value) {
$res->$key = $value;
}
$res->adressen = $adresse_res;
$res->zutrittsdatum = $zutrittskarte_ausgegebenam;
$res->kontakte = $kontakte_res;
$res->mittel = $betriebsmittelperson_res;
$res->mailverteiler = $mailverteiler_res;
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = $this->uid . "@" . DOMAIN;
$extern_email = array();
$extern_email["type"] = "alias";
$extern_email["email"] = $mitarbeiter_res->alias . "@" . DOMAIN;
$res->emails = [$intern_email, $extern_email];
$res->funktionen = $benutzer_funktion_res;
$res->standort_telefon = $telefon_res;
$res->profilUpdates = $profilUpdates;
return $res;
}
/**
* function that returns the data used for the student profile
* @access private
* @return stdClass student data
*/
private function studentProfil()
{
$betriebsmittelperson_res = $this->getBetriebsmittelInfo($this->pid);
$kontakte_res = $this->getKontaktInfo($this->pid);
$zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($this->uid);
$adresse_res = $this->getAdressenInfo($this->pid);
$mailverteiler_res = $this->getMailverteiler($this->uid);
$person_res = $this->getPersonInfo($this->uid, true);
$zutrittsgruppe_res = $this->getZutrittsgruppen($this->uid);
$student_res = $this->getStudentInfo($this->uid);
$matr_res = $this->getMatrikelNummer($this->uid);
$profilUpdates = $this->getProfilUpdates($this->uid);
$res = new stdClass();
$res->username = $this->uid;
//? Person Information
foreach ($person_res as $key => $value) {
$res->$key = $value;
}
//? Student Information
foreach ($student_res as $key => $value) {
$res->$key = trim($value);
}
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = $this->uid . "@" . DOMAIN;
$res->emails = [$intern_email];
$res->adressen = $adresse_res;
$res->zutrittsdatum = $zutrittskarte_ausgegebenam;
$res->kontakte = $kontakte_res;
$res->mittel = $betriebsmittelperson_res;
$res->matrikelnummer = $matr_res->matr_nr;
$res->zuttritsgruppen = $zutrittsgruppe_res;
$res->mailverteiler = $mailverteiler_res;
$res->profilUpdates = $profilUpdates;
return $res;
}
/**
* gets all the mailverteiler using the tables: tbl_benutzer, tbl_benutzergruppe, tbl_gruppe
* @access private
* @param integer $uid the userID used to retrieve the mailverteiler
* @return array returns the mailvertailer corresponding to a userID
*/
private function getMailverteiler($uid)
{
$this->PersonModel->addSelect('gruppe_kurzbz, beschreibung');
$this->PersonModel->addJoin('tbl_benutzer', 'person_id');
$this->PersonModel->addJoin('tbl_benutzergruppe', 'uid');
$this->PersonModel->addJoin('tbl_gruppe', 'gruppe_kurzbz');
$mailverteiler_res = $this->PersonModel->loadWhere(array('mailgrp' => true, 'uid' => $uid));
if (isError($mailverteiler_res)) {
show_error("was not able to query the table public.tbl_benutzer:" . getData($mailverteiler_res));
}
$mailverteiler_res = hasData($mailverteiler_res) ? getData($mailverteiler_res) : null;
$mailverteiler_res = array_map(function ($element) {
$element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN;
return $element;
}, $mailverteiler_res);
return $mailverteiler_res;
}
/**
* gets all the Benutzerfunktionen of a corresponding user
* @access private
* @param integer $uid the userID used to retrieve the Benutzerfunktionen
* @return array returns the Benutzerfunktionen corresponding to a userID
*/
private function getBenutzerFunktion($uid)
{
$this->BenutzerfunktionModel->addSelect(["tbl_benutzerfunktion.bezeichnung as Bezeichnung", "tbl_organisationseinheit.bezeichnung as Organisationseinheit", "datum_von as Gültig_von", "datum_bis as Gültig_bis", "wochenstunden as Wochenstunden"]);
$this->BenutzerfunktionModel->addJoin("tbl_organisationseinheit", "oe_kurzbz");
$benutzer_funktion_res = $this->BenutzerfunktionModel->loadWhere(array('uid' => $uid));
if (isError($benutzer_funktion_res)) {
show_error("was not able to query the table public.tbl_benutzerfunktion:" . getData($benutzer_funktion_res));
}
$benutzer_funktion_res = hasData($benutzer_funktion_res) ? getData($benutzer_funktion_res) : null;
return $benutzer_funktion_res;
}
/**
* gets all the Betriebsmittel of a corresponding user
* @access private
* @param integer $uid the userID used to retrieve the Betriebsmittel
* @return array returns the Betriebsmittel corresponding to a userID
*/
private function getBetriebsmittelInfo($pid)
{
$this->BetriebsmittelpersonModel->addSelect(["CONCAT(betriebsmitteltyp, ' ' ,beschreibung) as Betriebsmittel", "nummer as Nummer", "ausgegebenam as Ausgegeben_am"]);
//? betriebsmittel are not needed in a view
$betriebsmittelperson_res = $this->BetriebsmittelpersonModel->getBetriebsmittel($pid);
if (isError($betriebsmittelperson_res)) {
show_error("was not able to query the table public.tbl_betriebsmittelperson:" . getData($betriebsmittelperson_res));
}
$betriebsmittelperson_res = hasData($betriebsmittelperson_res) ? getData($betriebsmittelperson_res) : null;
return $betriebsmittelperson_res;
}
/**
* gets the alias of a corresponding user
* @access private
* @param integer $uid the userID used to get the alias
* @return string the alias of the userID
*/
private function getBenutzerAlias($uid)
{
$this->BenutzerModel->addSelect(["alias"]);
$benutzer_res = $this->BenutzerModel->load([$uid]);
if (isError($benutzer_res)) {
show_error("was not able to query the table public.tbl_benutzer:" . getData($benutzer_res));
} else {
$benutzer_res = hasData($benutzer_res) ? getData($benutzer_res)[0] : null;
}
return $benutzer_res;
}
/**
* gets the person information corresponding to a user
* @access private
* @param integer $uid the userID used to get the person information
* @param integer $geburtsInfo flag wether to add the columns gebort, gebdatum, foto_sperre or not
* @return array all the person informaion corresponding to a userID
*/
private function getPersonInfo($uid, $geburtsInfo = null)
{
$selectClause = ["foto", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"];
/** @param integer $geburtsInfo */
if ($geburtsInfo) {
array_push($selectClause, "gebort");
array_push($selectClause, "gebdatum");
array_push($selectClause, "foto_sperre");
}
$this->BenutzerModel->addSelect($selectClause);
$this->BenutzerModel->addJoin("tbl_person", "person_id");
$person_res = $this->BenutzerModel->load([$uid]);
if (isError($person_res)) {
show_error("was not able to query the table public.tbl_benutzer:" . getData($person_res));
} else {
$person_res = hasData($person_res) ? getData($person_res)[0] : null;
}
return $person_res;
}
/**
* gets the mitarbeiter information corresponding to a user
* @access private
* @param integer $uid the userID used to get the mitarbeiter information
* @return array all the mitarbeiter informaion corresponding to a userID
*/
private function getMitarbeiterInfo($uid)
{
$this->MitarbeiterModel->addSelect(["kurzbz", "telefonklappe", "alias", "ort_kurzbz"]);
$this->MitarbeiterModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid");
$mitarbeiter_res = $this->MitarbeiterModel->load($uid);
if (isError($mitarbeiter_res)) {
show_error("was not able to query the table public.tbl_mitarbeiter:" . getData($mitarbeiter_res));
} else {
$mitarbeiter_res = hasData($mitarbeiter_res) ? getData($mitarbeiter_res)[0] : null;
}
return $mitarbeiter_res;
}
/**
* gets the telefon information corresponding to a user
* @access private
* @param integer $uid the userID used to get the telefon information
* @return array all the telefon informaion corresponding to a userID
*/
private function getTelefonInfo($uid)
{
$this->MitarbeiterModel->addSelect(["kontakt"]);
$this->MitarbeiterModel->addJoin("tbl_kontakt", "tbl_mitarbeiter.standort_id = tbl_kontakt.standort_id");
$this->MitarbeiterModel->addLimit(1);
$telefon_res = $this->MitarbeiterModel->loadWhere(["mitarbeiter_uid" => $uid, "kontakttyp" => "telefon"]);
if (isError($telefon_res)) {
show_error("was not able to query the table public.tbl_mitarbeiter:" . getData($telefon_res));
}
$telefon_res = hasData($telefon_res) ? getData($telefon_res)[0] : null;
return $telefon_res;
}
/**
* gets the student information corresponding to a user
* @access private
* @param integer $uid the userID used to get the student information
* @return array all the student informaion corresponding to a userID
*/
private function getStudentInfo($uid)
{
$this->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']);
$this->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz");
$student_res = $this->StudentModel->load([$uid]);
if (isError($student_res)) {
show_error("was not able to query the table public.tbl_student:" . getData($student_res));
}
$student_res = hasData($student_res) ? getData($student_res)[0] : null;
return $student_res;
}
/**
* gets the profil updates corresponding to a user
* @access private
* @param integer $uid the userID used to get the profil updates
* @return array all the profil updates corresponding to a userID
*/
private function getProfilUpdates($uid)
{
$profilUpdates = $this->ProfilUpdateModel->getProfilUpdatesWhere(['uid' => $uid]);
if (isError($profilUpdates)) {
show_error("was not able to query the table public.tbl_profil_update:" . getData($profilUpdates));
}
$profilUpdates = hasData($profilUpdates) ? getData($profilUpdates) : null;
return $profilUpdates;
}
/**
* gets the Matrikelnummer corresponding to a user
* @access private
* @param integer $uid the userID used to get the Matrikelnummer
* @return integer the Matrikelnummer corresponding to a userID
*/
private function getMatrikelNummer($uid)
{
$this->BenutzerModel->addSelect(["matr_nr"]);
$this->BenutzerModel->addJoin("tbl_person", "person_id");
$matr_res = $this->BenutzerModel->load([$uid]);
if (isError($matr_res)) {
show_error("was not able to query the table public.tbl_benutzer:" . getData($matr_res));
}
$matr_res = hasData($matr_res) ? getData($matr_res)[0] : [];
return $matr_res;
}
/**
* gets the Zutrittsgruppen corresponding to a user
* @access private
* @param integer $uid the userID used to get the Zutrittsgruppen
* @return array all the Zutrittsgruppen corresponding to a userID
*/
private function getZutrittsgruppen($uid)
{
$this->BenutzergruppeModel->addSelect(['bezeichnung']);
$this->BenutzergruppeModel->addJoin('tbl_gruppe', 'gruppe_kurzbz');
$zutrittsgruppe_res = $this->BenutzergruppeModel->loadWhere(array("uid" => $uid, "zutrittssystem" => true));
if (isError($zutrittsgruppe_res)) {
show_error("was not able to query the table public.tbl_benutzergruppe:" . getData($zutrittsgruppe_res));
}
$zutrittsgruppe_res = hasData($zutrittsgruppe_res) ? getData($zutrittsgruppe_res) : null;
return $zutrittsgruppe_res;
}
/**
* gets the address information corresponding to a user
* @access private
* @param integer $uid the userID used to get the address information
* @return array all the address information corresponding to a userID
*/
private function getAdressenInfo($pid)
{
$adresse_res = $this->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "zustelladresse", "gemeinde", "nation"]);
$adresse_res = $this->AdresseModel->addOrder("zustelladresse", "DESC");
$adresse_res = $this->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz");
$adresse_res = $this->AdresseModel->loadWhere(["person_id" => $pid]);
if (isError($adresse_res)) {
show_error("was not able to query the table public.tbl_adresse:" . getData($adresse_res));
}
$adresse_res = hasData($adresse_res) ? getData($adresse_res) : null;
return $adresse_res;
}
/**
* gets the kontakt information corresponding to a user
* @access private
* @param integer $uid the userID used to get the kontakt information
* @return array all the kontakt information corresponding to a userID
*/
private function getKontaktInfo($pid)
{
$this->KontaktModel->addSelect(['kontakttyp', 'kontakt_id', 'kontakt', 'tbl_kontakt.anmerkung', 'tbl_kontakt.zustellung']);
$this->KontaktModel->addJoin('public.tbl_standort', 'standort_id', 'LEFT');
$this->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT');
$this->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum');
$kontakte_res = $this->KontaktModel->loadWhere(['person_id' => $pid]);
if (isError($kontakte_res)) {
show_error("was not able to query the table public.tbl_kontakt:" . getData($kontakte_res));
}
$kontakte_res = hasData($kontakte_res) ? getData($kontakte_res) : null;
return $kontakte_res;
}
/**
* gets the date of issue of the FH access card corresponding to a user
* @access private
* @param integer $uid the userID used to get the date of issue of the FH access card
* @return string the date of issue of the FH access card corresponding to a userID
*/
private function getZutrittskarteDatum($uid)
{
$zutrittskarte_ausgegebenam = $this->BetriebsmittelpersonModel->getBetriebsmittelByUid($uid, "Zutrittskarte");
if (isError($zutrittskarte_ausgegebenam)) {
show_error("was not able to query the table wavi.tbl_bentriebsmittelperson:" . getData($zutrittskarte_ausgegebenam));
}
$zutrittskarte_ausgegebenam = hasData($zutrittskarte_ausgegebenam) ? getData($zutrittskarte_ausgegebenam)[0]->ausgegebenam : null;
//? formats date from 01-01-2000 to 01.01.2000
$zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam);
return $zutrittskarte_ausgegebenam;
}
}
@@ -0,0 +1,86 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/**
*
*/
class ProfilUpdate extends Auth_Controller
{
public function __construct()
{
parent::__construct([
'index' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'],
'show' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r', 'basis/cis:r'],
'id' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r']
]);
$this->load->model('person/Profil_update_model', 'ProfilUpdateModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
// Load language phrases
$this->loadPhrases(
array(
'profilUpdate'
)
);
$this->load->library('DmsLib');
$this->load->library('PermissionLib');
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
}
public function index()
{
$this->load->view('Cis/ProfilUpdate');
}
public function id($profil_update_id = null)
{
$this->load->view('Cis/ProfilUpdate', ['profil_update_id' => $profil_update_id]);
}
public function show($dms_id)
{
$profil_update = $this->ProfilUpdateModel->loadWhere(['attachment_id' => $dms_id]);
$profil_update = hasData($profil_update) ? getData($profil_update)[0] : null;
//? checks if an profil update exists with the dms_id requested from the user
if ($profil_update)
{
$is_mitarbeiter_profil_update = getData($this->MitarbeiterModel->isMitarbeiter($profil_update->uid));
$is_student_profil_update = getData($this->StudentModel->isStudent($profil_update->uid));
if (
$this->permissionlib->isBerechtigt('student/stammdaten:r') && $is_student_profil_update ||
$this->permissionlib->isBerechtigt('mitarbeiter/stammdaten:r') && $is_mitarbeiter_profil_update ||
$this->uid == $profil_update->uid
)
{
// Get file to be downloaded from DMS
$newFilename = $this->uid . "/document_" . $dms_id;
$download = $this->dmslib->download($dms_id);
if (isError($download))
return $download;
// Download file
$this->outputFile(getData($download));
}
else
{
show_error($this->p->t('profilUpdate', 'profilUpdate_permission_error'));
return;
}
}
else
{
show_error($this->p->t('profilUpdate', 'profilUpdate_dms_error'));
return;
}
}
}
+167
View File
@@ -0,0 +1,167 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class Pub extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'bild' => ['basis/cis:r', 'assistenz:r']
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @param string $source [person|akte]
* @param integer $id
* @return void
*/
public function bild($source, $id)
{
$this->load->model('person/Person_model', 'PersonModel');
$person_id_user = '';
$serverzugriff = false;
// Wenn das Bild direkt aufgerufen wird, ist eine Authentifizierung erforderlich
// Wenn es vom Server selbst aufgerufen wird, ist keine Auth. notwendig
// (z.B. fuer die Erstellung von PDFs)
if ($_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) {
// Wenn Session gesetzt ist, keine Abfrage, da diese Personen noch keine UID haben
if (isset($_SESSION['incoming/user'])) { // Von Incomingtool
$result = $this->PersonModel->loadWhere([
'zugangscode' => $_SESSION['incoming/user']
]);
if (hasData($result))
$person_id_user = current(getData($result))->person_id;
} elseif (isset($_SESSION['prestudent/user'])) { // Von Prestudententool
$result = $this->PersonModel->loadWhere([
'zugangscode' => $_SESSION['prestudent/user']
]);
if (hasData($result))
$person_id_user = current(getData($result))->person_id;
} elseif (isset($_SESSION['bewerbung/personId'])) { // Von Bewerbungstool
$person_id_user = $_SESSION['bewerbung/personId'];
} else {
$person_id_user = getAuthPersonId();
}
} else {
$serverzugriff = true;
}
// Default Bild (Dummy Profilbild)
$cTmpHEX = base64_encode(file_get_contents(FHCPATH . 'skin/images/profilbild_dummy.jpg'));
if ($source == 'person' && $id) {
$foto_gesperrt = false;
// Person laden und Fotosperre überprüfen
$result = $this->PersonModel->load($id);
if (hasData($result)) {
$person = current(getData($result));
if ($person->foto_sperre) {
// Wenn der User selbst darauf zugreift darf er das Bild sehen
$foto_gesperrt = ($person_id_user != $id);
} elseif (!$person_id_user && !$serverzugriff) {
$foto_gesperrt = true;
}
if ($person->foto && !$foto_gesperrt) {
$cTmpHEX = base64_decode($person->foto);
}
}
}
if($source == 'akte' && $id != '')
{
$this->load->model('crm/Akte_model', 'AkteModel');
$this->AkteModel->addJoin('public.tbl_person', 'person_id');
$result = $this->AkteModel->loadWhere([
'person_id' => $id,
'dokument_kurzbz' => 'Lichtbil'
]);
if (hasData($result)) {
$foto_gesperrt = false;
$akte = current(getData($result));
if ($akte->foto_sperre) {
// Wenn der User selbst darauf zugreift darf er das Bild sehen
$foto_gesperrt = ($person_id_user != $id);
} elseif (!$person_id_user && !$serverzugriff) {
$foto_gesperrt = true;
}
// Wenn das Foto nicht im Inhalt steht wird aus aus dem DMS geladen
if (!$akte->inhalt && $akte->dms_id) {
$this->load->model('content/Dms_model', 'DmsModel');
$this->load->model('content/DmsVersion_model', 'DmsVersionModel');
$this->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
$this->DmsModel->addOrder('version', 'DESC');
$this->DmsModel->addLimit(1);
$result = $this->DmsModel->load($akte->dms_id);
if (!hasData($result))
die('Kein Dokument vorhanden');
$dms = current(getData($result));
$filename = DMS_PATH . $dms->filename;
$this->DmsVersionModel->update([
'dms_id' => $dms->dms_id,
'version' => $dms->version
], [
'letzterzugriff' => date('c')
]);
if (file_exists($filename)) {
$handle = fopen($filename, "r");
if ($handle) {
while (!feof($handle)) {
$akte->inhalt .= fread($handle, 8192);
}
fclose($handle);
} else {
echo 'Fehler: Datei konnte nicht geoeffnet werden';
}
} else {
echo 'Die Datei existiert nicht';
}
}
if ($akte->inhalt && !$foto_gesperrt) {
$cTmpHEX = $akte->inhalt;
}
}
}
// die bilder werden, sofern es funktioniert, in jpg umgewandelt da es sonst zu fehlern beim erstellen
// von pdfs kommen kann.
$im = @imagecreatefromstring(base64_decode($cTmpHEX));
if ($im) {
@ob_clean();
header("Content-type: image/jpeg");
exit(imagejpeg($im));
} else {
// bei manchen Bildern funktioniert die konvertierung nicht
// diese werden dann einfach so angezeigt.
@ob_clean();
header("Content-type: image/gif");
exit($cTmpHEX);
}
}
}
+35
View File
@@ -0,0 +1,35 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class Raumsuche extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r']
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$viewData = array(
'uid'=>getAuthUID(),
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Raumsuche']);
}
}
+40
View File
@@ -0,0 +1,40 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Studium extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r'],
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* index loads the Studium view
* @access public
* @return void
*/
public function index()
{
$viewData = array(
);
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'studium']);
}
}
+45
View File
@@ -0,0 +1,45 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class Cis4 extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'basis/cis:r'
)
);
// Load Config
$this->load->config('calendar');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$this->load->model('person/Person_model', 'PersonModel');
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
$viewData = array(
'uid' => getAuthUID(),
'name' => $personData->vorname,
'person_id' => $personData->person_id,
'timezone' => $this->config->item('timezone')
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'FhcDashboard']);
}
}
+101
View File
@@ -0,0 +1,101 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/**
*
*/
class Cms extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'content' => 'basis/cis:r',
'getNews' => 'basis/cis:r',
'getNewsRowCount' => 'basis/cis:r',
'getRoomInformation' => 'basis/cis:r',
'news' => 'basis/cis:r'
)
);
// Loads Libraries
$this->load->library('CmsLib');
// Loads phrases system
$this->loadPhrases([
'global'
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @param int $content_id
* @param int $version
* @param string $sprache
* @param boolean $sichtbar
*
* @return void
*/
public function content($content_id, $version = null, $sprache = null, $sichtbar = true)
{
// return early if the content_id for the content is missing
if (!isset($content_id))
$this->terminateWithError("content_id is missing");
$content = $this->ContentModel->load($content_id);
if (isError($content))
$this->terminateWithError(getError($content));
$content = getData($content);
if (NULL === $content)
$this->terminateWithError("Content not found");
$content = current($content);
$viewData = array(
'content_id' => $content_id,
'template_kurzbz' => $content->template_kurzbz,
'version' => $version,
'sichtbar' => $sichtbar
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Content']);
}
/**
* @param boolean $infoscreen
* @param string | null $studiengang_kz
* @param int | null $semester
* @param boolean $mischen
* @param string $titel
* @param boolean $edit
* @param boolean $sichtbar
*
* @return void
*/
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$viewData = array();
$this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']);
}
public function getRoomInformation($ort_kurzbz)
{
// Load Config
$this->load->config('calendar');
$viewData = array(
'ort_kurzbz' => $ort_kurzbz,
'timezone' => $this->config->item('timezone')
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'CmsRoom']);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class Dashboard extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'dashboard/benutzer:r'
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$this->load->model('person/Person_model','PersonModel');
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
$viewData = array(
'uid' => getAuthUID(),
'name' => $personData->vorname,
'person_id' => $personData->person_id
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]);
}
}
+294
View File
@@ -0,0 +1,294 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller handles output and access to documents.
* It creates a XML file, transforms it with the XSL-FO Vorlage from the
* database and generates a PDF file with unoconv or docsbox.
* This file is then outputted as download.
*
* It is the CodeIgniter version of content/pdfExport.php when not using the
* get paremeters: "archivdokument" and "archive".
* Use exportSigned() instead of providing the "sign" get parameter and
* export() otherwise.
*/
class Documents extends Auth_Controller
{
public function __construct()
{
parent::__construct([
'export' => self::PERM_LOGGED,
'exportSigned' => self::PERM_LOGGED
]);
// Load Phrases
$this->loadPhrases([
'stv'
]);
}
/**
* Download a not signed document.
*
* @param string $xml
* @param string $xsl
*
* @return void
*/
public function export($xml, $xsl)
{
return $this->_export($xml, $xsl);
}
/**
* Download a signed document.
*
* @param string $xml
* @param string $xsl
*
* @return void
*/
public function exportSigned($xml, $xsl)
{
return $this->_export($xml, $xsl, getAuthUID());
}
/**
* Helper function for export() and exportSigned()
*
* @param string $xml
* @param string $xsl
* @param string $sign_user (optional)
*
* @return void
*/
protected function _export($xml, $xsl, $sign_user = null)
{
$xsl_oe_kurzbz = null;
$version = $this->input->post_get('version') ?: null;
// Get the OE or STG of the document
$xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz')
?: $this->input->post_get('xsl_stg_kz')
?: $this->input->post_get('stg_kz');
if (is_null($xsl_oe_kurzbz)) {
$uid = $this->input->post_get('uid');
if ($uid) {
$uid = current(explode(';', $uid));
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz)) {
$prestudent_id = $this->input->post_get('prestudent_id');
if ($prestudent_id) {
$prestudent_id = current(explode(';', $prestudent_id));
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->load($prestudent_id);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz))
$xsl_oe_kurzbz = 0;
// Access rights
if ($xsl == 'AccountInfo') {
$this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
$uids = $this->input->post_get('uid');
if ($uids) {
$uids = explode(';', $uids);
foreach ($uids as $uid) {
$result = $this->MitarbeiterModel->load($uid);
if (!isError($result) && hasData($result)) {
if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]);
} else {
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$student = current(getData($result));
if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('support', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]);
}
}
}
}
} else {
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version);
if (isError($result))
return show_error(getError($result));
if (!hasData($result))
return show_404();
$access_rights = current(getData($result))->berechtigung;
if (!$access_rights)
return show_404();
$allowed = false;
foreach ($access_rights as $access_right) {
if ($this->permissionlib->isBerechtigt($access_right)) {
$allowed = true;
break;
}
}
if (!$allowed)
return $this->_outputAuthError([$this->router->method => $access_rights]);
}
// Output format
$outputformat = $this->input->post_get('output') ?: 'pdf';
if ($outputformat != 'pdf'
// An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden
&& !(CAMPUS_NAME == 'FH Technikum Wien'
&& ($xsl == 'Studienblatt'
|| $xsl == 'StudienblattEng'
|| $xsl == 'PrProtBA'
|| $xsl == 'PrProtBAEng'
|| $xsl == 'PrProtMA'
|| $xsl == 'PrProtMAEng'
)
)
&& !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz)
) {
$outputformat = 'pdf';
}
// XML Params
$params = 'xmlformat=xml';
foreach ([
'uid',
'stg_kz',
'person_id',
'id',
'prestudent_id',
'buchungsnummern',
'ss',
'abschlusspruefung_id',
'typ',
'all',
'preoutgoing_id',
'lvid',
'projekt_kurzbz',
'von',
'bis',
'stundevon',
'stundebis',
'sem',
'lehreinheit',
'mitarbeiter_uid',
'studienordnung_id',
'fixangestellt',
'standort',
'abrechnungsmonat',
'form',
'projektarbeit_id',
'betreuerart_kurzbz',
'studiensemester_kurzbz'
] as $key) {
$value = $this->input->post_get($key);
if ($value !== null)
$params .= '&' . $key . '=' . urlencode($value);
}
$value = $this->input->post_get('vertrag_id');
if ($value !== null) {
foreach ($value as $id)
$params .= '&vertrag_id[]=' . urlencode($id);
}
$this->load->library('DocumentExportLib');
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
if (isError($result))
return show_error(getError($result));
if (!hasData($result))
show_404();
$vorlage = current(getData($result));
if ($sign_user && !$vorlage->signierbar)
return show_error($this->p->t("stv", "grades_error_sign"));
// Filename
$filename = ($vorlage->bezeichnung ?: $vorlage->vorlage_kurzbz);
switch ($xsl) {
case 'LV_Informationen':
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->load($this->input->post_get('stg_kz'));
if (!isError($result) && hasData($result))
$filename .= '_' . sanitizeProblemChars(current(getData($result))->kurzbzlang);
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->load($this->input->post_get('ss'));
if (!isError($result) && hasData($result))
$filename .= '_' . sanitizeProblemChars(current(getData($result))->studiensemester_kurzbz);
break;
case 'Honorarvertrag':
$uid = str_replace(';', '', $this->input->post_get('uid') ?: '');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
$result = $this->BenutzerModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$user = current(getData($result));
$filename .= '_' . sanitizeProblemChars($user->nachname) . '_' . sanitizeProblemChars($user->vorname);
}
break;
case 'Studienordnung':
$filename = 'Studienordnung-Studienplan-';
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
$result = $this->StudienordnungModel->load($this->input->post_get('studienordnung_id'));
if (!isError($result) && hasData($result)) {
$so = current(getData($result));
$filename .= sprintf("%'.04d", $so->studiengang_kz) . '-' . $so->studiengangkurzbzlang;
}
break;
default:
$uid = str_replace(';', '', $this->input->post_get('uid') ?: '');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
$result = $this->BenutzerModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$user = current(getData($result));
$filename .= '_' . sanitizeProblemChars($user->nachname);
}
break;
}
// XML Data
$result = $this->documentexportlib->getDataURL($xml, $params);
if (isError($result))
return show_error(getError($result));
$data = getData($result);
// Output
$this->documentexportlib->showContent($filename, $vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user);
}
}
+42
View File
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class LVVerwaltung extends Auth_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
/**
* @return void
*/
public function _remap()
{
$this->load->view('LVVerwaltung', [
'permissions' => [
'lehre/lehrveranstaltung' => $this->permissionlib->isBerechtigt('lehre/lehrveranstaltung'),
'lv-plan/gruppenentfernen' => $this->permissionlib->isBerechtigt('lv-plan/gruppenentfernen'),
'lv-plan/lektorentfernen' => $this->permissionlib->isBerechtigt('lv-plan/lektorentfernen'),
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
],
'configs' => [
'showVertragsdetails' => defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN,
'showGewichtung' => defined('CIS_GESAMTNOTE_GEWICHTUNG') && CIS_GESAMTNOTE_GEWICHTUNG,
'lehreinheitAnmerkungDefault' => defined('LEHREINHEIT_ANMERKUNG_DEFAULT') ? LEHREINHEIT_ANMERKUNG_DEFAULT : '',
'lehreinheitRaumtypDefault' => defined('DEFAULT_LEHREINHEIT_RAUMTYP') ? DEFAULT_LEHREINHEIT_RAUMTYP : '',
'lehreinheitRaumtypAlternativeDefault' => defined('DEFAULT_LEHREINHEIT_RAUMTYP_ALTERNATIV') ? DEFAULT_LEHREINHEIT_RAUMTYP_ALTERNATIV : ''
]
]);
}
}
+37
View File
@@ -0,0 +1,37 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class NeueNachricht extends Auth_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
parent::__construct($permissions);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
/**
* @return void
*/
public function _remap()
{
$typeid = $this->input->post('typeid');
$ids = ($this->input->post('ids') && strpos($this->input->post('ids'), ','))
? explode(',', $this->input->post('ids'))
: $this->input->post('ids');
//now working
$this->load->view('Nachrichten', [
'permissions' => [
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
],
'ids' => $ids,
'typeid' => $typeid
]);
}
}
@@ -28,9 +28,14 @@ class Studentenverwaltung extends Auth_Controller
'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'),
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
'admin' => $this->permissionlib->isBerechtigt('admin'),
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'),
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht')
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(),
'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(),
'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(),
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
@@ -38,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller
]);
}
}
-16
View File
@@ -1,16 +0,0 @@
<?php
if ( !defined("PHPUNIT_TEST") ) {
show_404();
}
class Test extends CI_Controller
{
public function index()
{
// Yep... This is all we need.
ini_set('error_reporting', E_ALL); // or error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
}
}
@@ -0,0 +1,30 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Vertragsverwaltung extends Auth_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
#$permissions[$router->method] = ['admin:rw'];
parent::__construct($permissions);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
/**
* @return void
*/
public function _remap()
{
$this->load->view('Vertragsverwaltung', [
'permissions' => [
'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid')
]
]);
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,145 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Ampeln extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'open' => self::PERM_LOGGED,
'all' => self::PERM_LOGGED,
'confirm' => self::PERM_LOGGED,
'alleAmpeln' => self::PERM_LOGGED,
]);
$this->load->model('content/Ampel_model', 'AmpelModel');
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* confirms ampel and inserts ampel_id in public.tbl_ampel_benutzer_bestaetigt
* @access public
*
*/
public function confirm($ampel_id)
{
$this->load->library('form_validation');
$this->form_validation->set_data(['ampel_id'=> $ampel_id]);
$this->form_validation->set_rules('ampel_id', 'Ampel ID', 'required|integer');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// load Ampel_benutzer_bestaetigt_model to confirm the ampel
$this->load->model('content/Ampel_Benutzer_Bestaetigt_model', 'AmpelBenutzerBestaetigtModel');
$insert_into_result = $this->AmpelBenutzerBestaetigtModel->insert(["ampel_id"=> $ampel_id, "uid"=> $this->uid]);
$insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
$this->terminateWithSuccess($insert_into_result);
}
/**
* queries active and not confirmed ampeln by the user
* @access public
*
*/
public function open()
{
$userAmpeln = array();
// fetch active ampeln
$activeAmpeln = $this->AmpelModel->openActive($this->uid, false);
$activeAmpeln = $this->getDataOrTerminateWithError($activeAmpeln);
foreach ($activeAmpeln as $ampel) {
// only include non confirmed active ampeln in the result
if (!$ampel->bestaetigt) {
// check if the user was assigned to the ampel
$zugeteilt = $this->AmpelModel->isZugeteilt($this->uid, $ampel->benutzer_select);
$zugeteilt = $this->getDataOrTerminateWithError($zugeteilt);
if($zugeteilt) $userAmpeln[] = $ampel;
}
}
$this->terminateWithSuccess($userAmpeln);
}
/**
* queries all ampeln of the user
* @access public
*
*/
public function all()
{
$userAmpeln = array();
$ampel_result = $this->AmpelModel->active(false, $this->uid);
$ampel_result = $this->getDataOrTerminateWithError($ampel_result);
foreach ($ampel_result as $ampel) {
// check if the ampel was assigned to the user
$zugeteilt = $this->AmpelModel->isZugeteilt($this->uid, $ampel->benutzer_select);
$zugeteilt = $this->getDataOrTerminateWithError($zugeteilt);
if ($zugeteilt) $userAmpeln[] = $ampel;
}
$this->terminateWithSuccess($userAmpeln);
}
/**
* queries all ampeln that were assigned to the user until start of first work day
* @access public
*
*/
public function alleAmpeln()
{
//fetch all ampeln
$alle_ampeln = $this->AmpelModel->alleAmpeln($this->uid);
$alle_ampeln = $this->getDataOrTerminateWithError($alle_ampeln);
$alle_ampeln = array_map(function ($ampel) {
// check if ampel is confirmed by user
$confirmedByUser = $this->AmpelModel->isConfirmed($ampel->ampel_id, $this->uid);
$ampel->bestaetigt = $confirmedByUser;
return $ampel;
}, $alle_ampeln);
$this->terminateWithSuccess($alle_ampeln);
}
}
@@ -0,0 +1,70 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
class AuthInfo extends FHCAPI_Controller
{
protected $uid;
protected $pid;
protected $isMitarbeiter;
protected $isStudent;
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getAuthUID' => self::PERM_LOGGED,
'getAuthInfo' => self::PERM_LOGGED,
]);
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
$this->isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($this->uid)) ?? false;
$this->isStudent = getData($this->StudentModel->isStudent($this->uid)) ?? false;
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* returns the uid of the currently logged in user
* @access public
*
*/
public function getAuthUID()
{
$this->terminateWithSuccess(['uid'=>$this->uid]);
}
public function getAuthInfo()
{
$data = (object) array(
'uid' => $this->uid,
'isMitarbeiter' => $this->isMitarbeiter,
'isStudent' => $this->isStudent
);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,138 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Bookmark extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getBookmarks' => self::PERM_LOGGED,
'delete' => self::PERM_LOGGED,
'insert' => self::PERM_LOGGED,
'update' => self::PERM_LOGGED,
]);
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* gets the bookmarks associated to a user
* @access public
* @return void
*/
public function getBookmarks()
{
$this->BookmarkModel->addOrder("bookmark_id");
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
$bookmarks = $this->getDataOrTerminateWithError($bookmarks);
$this->terminateWithSuccess($bookmarks);
}
/**
* deletes bookmark from associated user
* @access public
* @return void
*/
public function delete($bookmark_id)
{
$bookmark = $this->BookmarkModel->load($bookmark_id);
$bookmark = current($this->getDataOrTerminateWithError($bookmark));
// only delete bookmark if the user is the owner of the bookmark
if($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')){
$delete_result = $this->BookmarkModel->delete($bookmark_id);
$delete_result = $this->getDataOrTerminateWithError($delete_result);
$this->terminateWithSuccess($delete_result);
}else{
$this->_outputAuthError(['delete' => ['admin:rw']]);
}
}
/**
* inserts new bookmark into the bookmark table
* @access public
* @return void
*/
public function insert()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$url = $this->input->post('url',true);
$title = $this->input->post('title',true);
$tag = $this->input->post('tag', true);
$insert_into_result = $this->BookmarkModel->insert(['uid'=>$this->uid, 'url'=>$url, 'title'=>$title,'tag'=>$tag, 'insertvon'=>$this->uid, 'updateamum'=>NULL, 'updatevon'=>NULL]);
$insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
$this->terminateWithSuccess($insert_into_result);
}
/**
* updates bookmark in the bookmark table
* @access public
* @return void
*/
public function update($bookmark_id)
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$url = $this->input->post('url',true);
$title = $this->input->post('title',true);
$now = new DateTime();
$now = $now->format('Y-m-d H:i:s');
$update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]);
$update_result = $this->getDataOrTerminateWithError($update_result);
$this->terminateWithSuccess($update_result);
}
}
@@ -0,0 +1,58 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Cis4FhcApi extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getViewData' => self::PERM_LOGGED,
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches ViewData
*/
public function getViewData()
{
$this->load->model('person/Person_model','PersonModel');
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
$viewData = array(
'uid' => getAuthUID(),
'name' => $personData->vorname,
'person_id' => $personData->person_id
);
$this->terminateWithSuccess($viewData);
}
}
@@ -0,0 +1,58 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class CisMenu extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getMenu' => self::PERM_LOGGED,
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches the menu for CIS from the database based on the userLanguage
*/
public function getMenu()
{
$this->load->model('content/Content_model', 'ContentModel');
$this->load->config('cis');
$cis4_content_id =$this->config->item('cis_menu_root_content_id');
$result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage());
$result = $this->getDataOrTerminateWithError($result);
$menu = $result->childs ?? [];
$this->terminateWithSuccess($menu);
}
}
@@ -0,0 +1,207 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
* Provides data to the ajax get calls about the searchbar component
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Cms extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
// NOTE(chris): additional permission checks will be done in SearchBarLib
parent::__construct([
'ContentID' => self::PERM_LOGGED,
'getOrtKurzbzContent' => self::PERM_LOGGED,
'content' => self::PERM_LOGGED,
'news' => self::PERM_LOGGED,
'getNewsRowCount' => self::PERM_LOGGED,
'getNews' => self::PERM_LOGGED,
]);
$this->load->model('content/News_model', 'NewsModel');
// setting up the papgination_size
$this->page_size = 10;
$this->load->library('CmsLib');
// Loads phrases system
$this->loadPhrases([
'global'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches the content with the content_id and additional parameters
*/
public function content()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('content_id','Content ID','required|is_natural');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
// getting the get parameters
$content_id = $this->input->get("content_id",TRUE);
$version = $this->input->get("version",TRUE);
$sprache = $this->input->get("sprache",TRUE);
$sichtbar = $this->input->get("sichtbar",TRUE);
$content = $this->cmslib->getContent($content_id, $version, $sprache, $sichtbar);
$content = $this->getDataOrTerminateWithError($content);
$this->terminateWithSuccess($content);
}
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function ContentID()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('ort_kurzbz', 'Ort', 'required');
if ($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$ort_kurzbz = $this->input->get('ort_kurzbz',TRUE);
$content_id = $this->OrtModel->getContentID($ort_kurzbz);
$content_id = current($this->getDataOrTerminateWithError($content_id))->content_id;
$this->terminateWithSuccess($content_id);
}
public function news()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('limit','Limit','required|is_natural_no_zero');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$this->load->model('content/news_model', 'NewsModel');
$limit = $this->input->get('limit',TRUE);
//query the news
$news = $this->NewsModel->getAll($limit);
//get the data or terminate with error
$news = $this->getDataOrTerminateWithError($news);
// array that keeps track of which news don't have a betreff and have to be removed from the news array
$newsToRemove = array();
// collect the content of the news
foreach($news as $index=>$news_element){
$this->NewsModel->resetQuery();
$content = $this->cmslib->getContent($news_element->content_id);
if(isError($content))
{
// removes the news from the news array, so that the response does not include a invalid news
array_push($newsToRemove,$index);
//add the error to the api response? visual feedback
//$this->addError(print_r($content->retval,true));
continue;
}
$content = getData($content);
$news_element->content_obj = $content;
}
//removes all news that don't have a betreff
foreach($newsToRemove as $removeNewsIndex)
{
unset($news[$removeNewsIndex]);
}
$withContent = function($news) {
return $news->content_obj != null;
};
$newsWithContent = array_filter($news, $withContent);
$this->terminateWithSuccess($newsWithContent);
}
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
{
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
$all = $edit;
$this->load->model('content/News_model','NewsModel');
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen);
$num_rows = $this->getDataOrTerminateWithError($num_rows);
$this->terminateWithSuccess($num_rows);
}
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
//form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('page','Page','required|is_natural');
$this->form_validation->set_rules('page_size', 'PageSize', 'is_natural');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
// getting the GET parameters
$page = intval($this->input->get('page', true));
$page_size = intval($this->input->get('page_size', true));
$sprache = $this->input->get('sprache', true);
if(!$sprache)
{
$sprache = getUserLanguage();
}
// default value for the page_size is 10
$page_size = $page_size ?? 10;
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache);
$news = $this->getDataOrTerminateWithError($news);
$this->addMeta('phrases', json_decode($this->p->getJson()));
$this->terminateWithSuccess($news);
}
}
@@ -0,0 +1,496 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about documents
* Listens to ajax post calls to change the documents data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*
* This controller handles output and access to documents.
* It checks permissions to render documents in an alternative format
* or it creates a XML file, transforms it with the XSL-FO Vorlage from the
* database and generates a PDF file with unoconv or docsbox.
* This file is then archivated in the database.
*
* The last part is the CodeIgniter version of content/pdfExport.php when not
* using the get paremeter: "archivdokument" but using the get parameter:
* "archive".
* Use archiveSigned() instead of providing the "sign" get parameter and
* archive() otherwise.
*/
class Documents extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'permissionAlternativeFormat' => self::PERM_LOGGED,
'archive' => ['admin:rw', 'assistenz:rw'],
'archiveSigned' => ['admin:rw', 'assistenz:rw'],
'download' => ['admin:rw', 'assistenz:rw']
]);
// Load Phrases
$this->loadPhrases([
'stv'
]);
}
/**
* Checks if the current user has permission to render documents in an
* alternative format.
*
* @param string $oe_kurzbz Or studiengang_kz
*
* @return void
*/
public function permissionAlternativeFormat($oe_kurzbz)
{
$this->terminateWithSuccess($this->permissionlib->isBerechtigt('system/change_outputformat', null, $oe_kurzbz));
}
/**
* Archive a not signed document.
*
* @param string $xml (optional)
* @param string $xsl (optional)
*
* @return void
*/
public function archive($xml = null, $xsl = null)
{
return $this->_archive($xml, $xsl);
}
/**
* Archive a signed document.
*
* @param string $xml (optional)
* @param string $xsl (optional)
*
* @return void
*/
public function archiveSigned($xml = null, $xsl = null)
{
return $this->_archive($xml, $xsl, getAuthUID());
}
/**
*
* @return void
*/
public function download($xml, $xsl, $sign_user = null)
{
$akteExportData = $this->_getAkteExportData($xml, $xsl, $sign_user);
$akteData = $akteData['akteData'];
$exportData = $akteData['exportData'];
/**
* [
'vorlage' => $vorlage,
'xml_data' => $data,
'oe_kurzbz' => $xsl_oe_kurzbz,
'version' => $version,
'outputformat' => $outputformat,
'sign_user' => $sign_user
]
*/
// Output
$result = $this->documentexportlib->showContent(
$akteData['akteData']['inhalt'],
$exportData['vorlage'],
$exportData['xml_data'],
$exportData['oe_kurzbz'],
$exportData['version'],
$exportData['outputformat'],
$exportData['sign_user']
);
$this->terminateWithSuccess(true);
}
/**
* Helper function for archive() and archiveSigned()
*
* @param string $xml
* @param string $xsl
* @param string $sign_user (optional)
*
* @return void
*/
private function _archive($xml, $xsl, $sign_user = null)
{
$akteData = $this->_getAkteExportData($xml, $xsl, $sign_user);
$this->load->model('crm/Akte_model', 'AkteModel');
$result = $this->AkteModel->insert($akteData['akteData']);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
/**
* @param string $xml
* @param string $xsl
* @param string $sign_user (optional)
*
* @return array with Akte data and export data
*/
private function _getAkteExportData($xml, $xsl, $sign_user = null)
{
if (!$xml || !$xsl) {
$this->load->library('form_validation');
if (!$xml) {
$xml = $this->input->post_get('xml');
$this->addMeta('xml', $xml);
$this->form_validation->set_rules('xml', 'xml', 'required');
}
if (!$xsl) {
$xsl = $this->input->post_get('xsl');
$this->addMeta('xsl', $xsl);
$this->form_validation->set_rules('xsl', 'xsl', 'required');
}
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$xsl_oe_kurzbz = null;
$version = $this->input->post_get('version') ?: null;
// Get the OE or STG of the document
$xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz')
?: $this->input->post_get('xsl_stg_kz')
?: $this->input->post_get('stg_kz');
if (is_null($xsl_oe_kurzbz)) {
$uid = $this->input->post_get('uid');
if ($uid) {
$uid = current(explode(';', $uid));
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz)) {
$prestudent_id = $this->input->post_get('prestudent_id');
if ($prestudent_id) {
$prestudent_id = current(explode(';', $prestudent_id));
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->load($prestudent_id);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz))
$xsl_oe_kurzbz = 0;
// Vorlage
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
$vorlage = current($this->getDataOrTerminateWithError($result));
if (!$vorlage)
show_404();
// Akte Data
$akteData = [
'dokument_kurzbz' => $vorlage->dokument_kurzbz ?: 'Zeugnis',
'mimetype' => 'application/pdf',
'erstelltam' => date('Y-m-d'),
'gedruckt' => true,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
'uid' => $this->input->post_get('uid') ?: null,
'archiv' => true,
'signiert' => !!$sign_user,
'stud_selfservice' => $vorlage->stud_selfservice
];
$studiengang_kz = null;
if ($akteData['uid']) {
$this->load->model('crm/Student_model', 'StudentModel');
$this->StudentModel->addSelect('tbl_student.*, UPPER(typ || kurzbz) AS kuerzel');
$this->StudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$result = $this->StudentModel->load([$akteData['uid']]);
$student = current($this->getDataOrTerminateWithError($result));
$ss = $this->input->post_get('ss');
if ($ss !== null) {
$this->load->model('crm/prestudentstatus_model', 'PrestudentstatusModel');
$result = $this->PrestudentstatusModel->getLastStatus($student->prestudent_id, $ss);
$status = current($this->getDataOrTerminateWithError($result));
if (!$status)
$this->terminateWithError($this->p->t("stv", "grades_error_prestudentstatus"));
$semester = $status->ausbildungssemester;
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->StudentlehrverbandModel->addJoin('public.tbl_benutzer', 'uid = student_uid');
$this->StudentlehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$result = $this->StudentlehrverbandModel->load([
'studiensemester_kurzbz' => $ss,
'student_uid' => $akteData['uid']
]);
if (!hasData($result)) $this->terminateWithError($this->p->t("stv", "error_noLehrverbandAssigned"));
$res = current($this->getDataOrTerminateWithError($result));
$studiengang_kz = $res->studiengang_kz;
$akteData['person_id'] = $res->person_id;
switch ($xsl) {
case 'Ausbildungsver':
case 'AusbVerEng':
$akteData['titel'] = mb_substr($xsl .
"_" .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
"_" .
$semester .
"_" .
$ss, 0, 64);
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
break;
case 'LVZeugnisEng':
case 'LVZeugnis':
case 'Zertifikat':
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->load($this->input->post_get('lvid'));
$lv = current($this->getDataOrTerminateWithError($result));
$akteData['dokument_kurzbz'] = $xsl;
$akteData['titel'] = mb_substr($xsl .
"_" .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
"_" .
$semester .
'_' .
$ss .
'_' .
str_replace(' ', '_', $lv->bezeichnung), 0, 60);
$akteData['bezeichnung'] = mb_substr($xsl .
" " .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
" " .
$semester .
". Semester" .
' ' .
$ss .
' ' .
$lv->bezeichnung, 0, 64);
break;
case 'SZeugnis':
$akteData['titel'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
break;
default:
$akteData['titel'] = mb_substr($xsl .
"_" .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
"_" .
$semester .
"_" .
$ss, 0, 64);
$akteData['bezeichnung'] = mb_substr($xsl .
" " .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
" " .
$semester .
". Semester" .
' ' .
$ss, 0, 64);
break;
}
} else {
$studiengang_kz = $student->studiengang_kz;
$akteData['person_id'] = $student->person_id;
$akteData['titel'] = $vorlage->bezeichnung . '_' . $student->kuerzel;
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
}
} else {
$prestudent_id = $this->input->post_get('prestudent_id');
if ($prestudent_id) {
$this->load->model('crm/prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addSelect('tbl_prestudent.*, UPPER(typ || kurzbz) AS kuerzel');
$result = $this->PrestudentModel->load($prestudent_id);
$prestudent = current($this->getDataOrTerminateWithError($result));
$studiengang_kz = $prestudent->studiengang_kz;
$akteData['person_id'] = $prestudent->person_id;
$akteData['titel'] = mb_substr($xsl . "_" . $prestudent->kuerzel, 0, 64);
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $prestudent->kuerzel, 0, 64);
}
}
// Access rights
if (!$this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
if ($xsl == 'AccountInfo') {
$this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
$uids = $this->input->post_get('uid');
if ($uids) {
$uids = explode(';', $uids);
foreach ($uids as $uid) {
$result = $this->MitarbeiterModel->load($uid);
if (!isError($result) && hasData($result)) {
if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]);
} else {
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$student = current(getData($result));
if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('support', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]);
}
}
}
}
} else {
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version);
$access_rights = current($this->getDataOrTerminateWithError($result));
// TODO: was bedeutet wenn keine berechtigung?
if (!$access_rights || !$access_rights->berechtigung)
return show_404();
$allowed = false;
foreach ($access_rights->berechtigung as $access_right) {
if ($this->permissionlib->isBerechtigt($access_right)) {
$allowed = true;
break;
}
}
if (!$allowed)
return $this->_outputAuthError([$this->router->method => $access_rights]);
}
// Output format
$outputformat = $this->input->post_get('output') ?: 'pdf';
if ($outputformat != 'pdf'
// An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden
&& !(CAMPUS_NAME == 'FH Technikum Wien'
&& ($xsl == 'Studienblatt'
|| $xsl == 'StudienblattEng'
|| $xsl == 'PrProtBA'
|| $xsl == 'PrProtBAEng'
|| $xsl == 'PrProtMA'
|| $xsl == 'PrProtMAEng'
)
)
&& !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz)
) {
$outputformat = 'pdf';
}
// XML Params
$params = 'xmlformat=xml';
foreach ([
'uid',
'stg_kz',
'person_id',
'id',
'prestudent_id',
'buchungsnummern',
'ss',
'abschlusspruefung_id',
'typ',
'all',
'preoutgoing_id',
'lvid',
'projekt_kurzbz',
'von',
'bis',
'stundevon',
'stundebis',
'sem',
'lehreinheit',
'mitarbeiter_uid',
'studienordnung_id',
'fixangestellt',
'standort',
'abrechnungsmonat',
'form',
'projektarbeit_id',
'betreuerart_kurzbz',
'studiensemester_kurzbz'
] as $key) {
if (in_array($xsl, array('Ausbildungsver', 'AusbVerEng')) && $key === 'uid')
{
continue;
}
$value = $this->input->post_get($key);
if ($value !== null)
$params .= '&' . $key . '=' . urlencode($value);
}
$value = $this->input->post_get('vertrag_id');
if ($value !== null) {
foreach ($value as $id)
$params .= '&vertrag_id[]=' . urlencode($id);
}
if (!$vorlage->archivierbar)
$this->terminateWithError($this->p->t("stv", "grades_error_archive"));
if ($sign_user && !$vorlage->signierbar)
$this->terminateWithError($this->p->t("stv", "grades_error_sign"));
$this->load->library('DocumentExportLib');
// XML Data
$result = $this->documentexportlib->getDataURL($xml, $params);
$data = $this->getDataOrTerminateWithError($result);
$this->documentexportlib->addArchiveToData($data);
// Output
$result = $this->documentexportlib->getContent($vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user);
$content = $this->getDataOrTerminateWithError($result);
$akteData['titel'] .= '.pdf';
$akteData['inhalt'] = base64_encode($content);
return [
'akteData' => $akteData,
'exportData' =>
[
'vorlage' => $vorlage,
'xml_data' => $data,
'oe_kurzbz' => $xsl_oe_kurzbz,
'version' => $version,
'outputformat' => $outputformat,
'sign_user' => $sign_user
]
];
}
}
@@ -113,7 +113,7 @@ class Filter extends FHCAPI_Controller
*/
public function applyFilterFields()
{
$this->form_validation->set_rules('filterFields', 'filterFields', 'required');
$this->form_validation->set_rules('filterFields[]', 'filterFields', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
@@ -0,0 +1,47 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about languages
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Language extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'get' => self::PERM_LOGGED
]);
// Load models
$this->load->model('system/Sprache_model', 'SpracheModel');
}
public function get()
{
$this->SpracheModel->addOrder('sprache');
$result = $this->SpracheModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,104 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
//require_once('../../../include/studiengang.class.php');
//require_once('../../../include/student.class.php');
//require_once('../../../include/datum.class.php');
//require_once('../../../include/mail.class.php');
//require_once('../../../include/benutzerberechtigung.class.php');
//require_once('../../../include/phrasen.class.php');
//require_once('../../../include/projektarbeit.class.php');
//require_once('../../../include/projektbetreuer.class.php');
class Lehre extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
'Pruefungen' => self::PERM_LOGGED
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* constructs the emails of the groups from a lehrveranstaltung
*/
public function lvStudentenMail()
{
$lehreinheit_id = $this->input->get("lehreinheit_id",TRUE);
// return early if the required parameter is missing
if(!isset($lehreinheit_id))
{
$this->terminateWithError('Missing required parameter', self::ERROR_TYPE_GENERAL);
}
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$studentenMails = $this->LehreinheitModel->getStudentenMail($lehreinheit_id);
$studentenMails = $this->getDataOrTerminateWithError($studentenMails);
//convert array of objects into array of strings
$studentenMails = array_map(function($element){
return $element->mail;
}, $studentenMails);
$this->terminateWithSuccess($studentenMails);
}
public function LV($studiensemester_kurzbz, $lehrveranstaltung_id)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage(), $lehrveranstaltung_id);
$result = current($this->getDataOrTerminateWithError($result));
$this->terminateWithSuccess($result);
}
/**
* fetches all Pruefungen of a student for a specific lehrveranstaltung
* if the student passed the Pruefung on the first attempt, no information about the Pruefungen is stored in the database
* @param mixed $lehrveranstaltung_id
* @return void
*/
public function Pruefungen($lehrveranstaltung_id)
{
$this->load->model('education/Pruefung_model', 'PruefungModel');
$result = $this->PruefungModel->getByStudentAndLv(getAuthUID(), $lehrveranstaltung_id, getUserLanguage());
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
}
@@ -0,0 +1,277 @@
<?php
/**
* Copyright (C) 2025 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Lehrveranstaltung extends FHCAPI_Controller
{
private $_ci;
private $_uid;
public function __construct()
{
parent::__construct([
'getByEmp' => ['admin:r', 'assistenz:r'],
'getByStg' => ['admin:r', 'assistenz:r'],
'loadByLV' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->loadPhrases(
array(
'ui'
)
);
}
public function getByEmp($studiensemester_kurzbz = null, $mitarbeiter_uid = null, $stg_kz = null)
{
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
$tree = [];
foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
{
$lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid);
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
if (!isset($lehrveranstaltung->_children))
{
$lehrveranstaltung->_children = $lehreinheiten_data;
}
$tree[] = $lehrveranstaltung;
}
$this->terminateWithSuccess($tree);
}
public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
{
if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$verband = null;
if (!is_null($semester) && !is_numeric($semester))
{
$verband = $semester;
$semester = null;
}
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
$studienplan_ids = array();
$only_ids = array();
$placeholders = array();
if (hasData($studienplan_data))
{
foreach (getData($studienplan_data) as $studienplan) {
$placeholders[] = "(?, ?)";
$studienplan_ids[] = $studienplan->studienplan_id;
$studienplan_ids[] = $studienplan->semester;
$only_ids[] = $studienplan->studienplan_id;
}
}
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
$lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
$tree = [];
foreach ($lehrveranstaltungen_data as $row)
{
$rowData = $row;
$lehreinheiten_data = $this->_ci->LehreinheitModel->getByLvidStudiensemester($row->lehrveranstaltung_id, $studiensemester_kurzbz);
if (hasData($lehreinheiten_data))
{
$lehreinheiten = getData($lehreinheiten_data);
if (!isset($row->_children))
{
$row->_children = $lehreinheiten;
}
else
{
if (!is_array($row->_children))
{
$row->_children = [$row->_children];
}
$row->_children = array_merge($row->_children, $lehreinheiten);
}
}
if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent))
{
$child = $this->_ci->StudienplanModel->loadStudienplanLehrveranstaltung($row->studienplan_lehrveranstaltung_id_parent);
if (hasData($child))
{
$child = getData($child)[0];
$searchId = $child->lehrveranstaltung_id;
foreach ($lehrveranstaltungen_data as &$searchParent)
{
if ($searchParent->lehrveranstaltung_id === $searchId)
{
if (!isset($searchParent->_children))
{
$searchParent->_children = [];
}
if (is_array($searchParent->_children))
{
$searchParent->_children[] = $row;
}
else
{
$searchParent->_children = [$searchParent->_children, $row];
}
break;
}
}
}
}
else
{
$tree[] = $rowData;
}
}
$counter = 0;
$this->assignUniqueIndex($tree, $counter);
$this->terminateWithSuccess($tree);
}
public function loadByLV($lehrveranstaltung_id = null)
{
if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->_ci->LehrveranstaltungModel->addSelect('lehrveranstaltung_id, lehrform_kurzbz, lehre, bezeichnung as lvbezeichnung, sprache');
$lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id));
$lehrveranstaltung_result = $this->getDataOrTerminateWithError($lehrveranstaltung_result);
$lehrveranstaltung = $lehrveranstaltung_result[0];
$this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id');
$lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung->lehrveranstaltung_id));
$lehrfaecher_array = [];
if (hasData($lehrfaecher))
$lehrfaecher_array = array_merge($lehrfaecher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel'));
$lehrfaecher_array[] = $lehrveranstaltung->lehrveranstaltung_id;
$this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id');
$this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach");
$this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array);
$lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load();
$lehrfaecher_array = hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array();
$lehrveranstaltung->lehrfaecher = $lehrfaecher_array;
$this->terminateWithSuccess($lehrveranstaltung);
}
/*
* (david) ggf. im naechsten release
* public function loadByOrganization($oe_kurzbz)
{
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$lehrveranstaltungen = $this->LehrveranstaltungModel->getLvsByOrganization($oe_kurzbz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
$tree = [];
foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
{
$lehreinheiten = $this->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz);
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
if (!isset($lehrveranstaltung->_children))
{
$lehrveranstaltung->_children = $lehreinheiten_data;
}
$tree[] = $lehrveranstaltung;
}
$this->terminateWithSuccess($tree);
}*/
/*public function loadByFachbereich($fachbereich, $mitarbeiter_uid = null)
{
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
}*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
private function assignUniqueIndex(&$nodes, &$counter)
{
foreach ($nodes as &$node)
{
$node->uniqueindex = $counter++;
if (!empty($node->_children) && is_array($node->_children))
{
$this->assignUniqueIndex($node->_children, $counter);
}
}
}
private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
{
if (!is_null($studiensemester_kurzbz))
{
$studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
if (isError($studiensemester_result) || !hasData($studiensemester_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($studiensemester_result)[0]->studiensemester_kurzbz;
}
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
}
@@ -0,0 +1,544 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
/**
* This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
* Provides data to the ajax get calls about the searchbar component
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class LvMenu extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getLvMenu' => self::PERM_LOGGED
]);
$this->load->model("ressource/Mitarbeiter_model");
$this->load->model("education/Lehreinheit_model");
$this->load->model("education/Lehrveranstaltung_model");
$this->load->model("organisation/Studiengang_model");
$this->load->model("accounting/Vertrag_model");
$this->load->model("system/Variable_model");
$this->load->model("person/Benutzergruppe_model");
$this->load->model("education/Lvangebot_model");
$this->load->model("ressource/Lehretools_model");
$this->load->library("PermissionLib", null, 'PermissionLib');
$this->load->library("PhrasesLib", null, 'PhrasesLib');
$this->loadPhrases(array('global', 'lehre'));
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* alternative function to get multiple lvMenus with a single http request
*/
public function getMultipleLvMenu($lvMenuOptionList){
$result =[];
foreach($lvMenuOptionList as $lvMenuOptions){
$lvMenu = $this->getLvMenu($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
if(isError($lvMenu)){
// TODO: some lvMenu threw an error, handle error here
}
$result[$lvMenuOptions['lvid']]=$lvMenu;
}
$this->terminateWithSuccess($result);
}
/**
*
*/
public function getLvMenu($lvid, $studiensemester_kurzbz)
{
// return early if parameters are missing
if(!isset($lvid) || !isset($studiensemester_kurzbz))
$this->terminateWithError('Missing parameters', self::ERROR_TYPE_GENERAL);
// get the sprache
$sprache = getUserLanguage();
// get the user
if (!$user=getAuthUID())
$this->terminateWithError($this->p->t('global', 'nichtAngemeldet'));
// check if is_lector
$is_lector = false;
$mares = $this->Mitarbeiter_model->isMitarbeiter($user);
if(hasData($mares))
{
$is_lector = getData($mares);
}
// definition of user_is_allowed_to_upload
$user_is_allowed_to_upload=false;
$angezeigtes_stsem = $studiensemester_kurzbz;
// load lehrveranstaltung
$lvres = $this->Lehrveranstaltung_model->load($lvid);
if(!hasData($lvres))
{
$this->terminateWithError('LV ' . $lvid . ' not found.');
}
$lv = (getData($lvres))[0];
$this->addMeta('lvInfo',$lv);
// define studiengang_kz / semester / lehrverzeichnis
$studiengang_kz = $lv->studiengang_kz;
$semester = $lv->semester;
$short = $lv->lehreverzeichnis;
// return empty menu for studiengang_kz = 0
if($studiengang_kz == 0){
$this->terminateWithSuccess("organisatorische_einheit");
}
// load studiengang
$stgres = $this->Studiengang_model->load(strval($studiengang_kz));
if(!hasData($stgres))
{
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
}
$stg = (getData($stgres))[0];
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
$short_name = $lv->bezeichnung;
$short_short_name = $lv->lehreverzeichnis;
// angemeldet
$angemeldet = true;
if(defined('CIS_LEHRVERANSTALTUNG_WENNANGEMELDET_DETAILS_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_WENNANGEMELDET_DETAILS_ANZEIGEN && !$is_lector)
{
$angemeldet = false;
$lesres = $this->Lehreinheit_model->getLehreinheitenForStudentAndStudienSemester(
$lvid, $user, $angezeigtes_stsem
);
if(hasData($lesres) && count(getData($lesres)) > 0)
$angemeldet = true;
}
// lehrfach
$lehrfach_id='';
if(defined('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN)
{
// Wenn der eingeloggte User zu einer der Lehreinheiten zugeteilt ist
// wird zusätzlich das Lehrfach der Lehreinheit angezeigt.
if($is_lector )
{
$result = $this->Lehreinheit_model->getLehrfachIdMitarbeiter($angezeigtes_stsem,$user,$lvid);
}
else
{
$result = $this->Lehreinheit_model->getLehrfachIdStudierender($angezeigtes_stsem,$user,$lvid);
}
// Wenn die LV mehrere verschiedenen Lehrfaecher hat, und der User zu mehreren davon zugeteilt ist
// wird das Lehrfach nicht angezeigt damit es nicht zu verwirrungen kommt.
if( ($lehrfaecher = getData($result)) && count($lehrfaecher)==1 && ($lehrfach = $lehrfaecher[0]))
{
$lehrfach_id=$lehrfach->lehrfach_id;
}
}
// lektor der lv
$lektor_der_lv=false;
$leinfores = $this->Lehreinheit_model->getLehreinheitInfo($lvid,$angezeigtes_stsem,$lehrfach_id);
$db_result = hasData($leinfores) ? getData($leinfores) : array();
foreach($db_result as $row_lector)
{
// Lektor wird erst angezeigt wenn der Auftrag erteilt wurde
if (defined('CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON')
&& CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON != '')
{
if (!$this->Vertrag_model->isVertragErteiltLV($lvid, $angezeigtes_stsem, $row_lector->uid))
{
continue;
}
}
if($user == $row_lector->uid)
{
$lektor_der_lv=true;
$user_is_allowed_to_upload=true;
}
// style of the link
if($row_lector->lvleiter === true)
$style='style="font-weight: bold"';
else
$style='';
}
//Berechtigungen auf Fachbereichsebene
$lehrfach_oe_kurzbz_arr = array();
$fbres = $this->Lehrveranstaltung_model->getBerechtigungenAufFachberechsebene($lvid, $angezeigtes_stsem);
$fbs = (hasData($fbres)) ? getData($fbres) : array();
foreach($fbs as $row)
{
$lehrfach_oe_kurzbz_arr[] = $row->oe_kurzbz;
if($this->PermissionLib->isBerechtigt('lehre', null, $row->oe_kurzbz)
|| $this->PermissionLib->isBerechtigt('assistenz', null, $stg->oe_kurzbz))
{
$user_is_allowed_to_upload=true;
}
}
// FH-Core Menu Logic
// ##########################################################################################
$menu = array();
$this->fhc_menu_lvinfo($menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr);
$this->fhc_menu_feedback($menu, $angemeldet, $lvid);
$this->fhc_menu_gesamtnote($menu, $angemeldet, $lvid, $lv, $is_lector, $angezeigtes_stsem);
$this->fhc_menu_emailStudierende($menu, $user, $angemeldet, $lvid, $angezeigtes_stsem);
$this->fhc_menu_abmeldung($menu, $user, $is_lector, $lvid, $angezeigtes_stsem);
$this->fhc_menu_lehretools($menu, $lvid, $angezeigtes_stsem, $sprache);
$this->fhc_menu_anrechnungStudent($menu, $lvid, $angezeigtes_stsem);
$this->fhc_menu_anrechnungLector($menu, $angezeigtes_stsem);
// Addons Menu Logic
// ##########################################################################################
$params = [
'sprache'=>$sprache,
//'p'=>$p,
'ci_p'=> $this->p,
//'db'=>$db,
'user'=>$user,
'is_lector'=>$is_lector,
'user_is_allowed_to_upload'=>$user_is_allowed_to_upload,
//'rechte'=>$rechte,
'angezeigtes_stsem'=>$angezeigtes_stsem,
//'lehreinheit'=>$lehreinheit,
'lv_obj'=>$lv,
'lv'=>$lv,
'lvid'=>$lvid,
'studiengang_kz'=>$studiengang_kz,
'semester'=>$semester,
'short'=>$short,
'stg_obj'=>$stg,
'kurzbz'=>$kurzbz,
'short_name'=>$short_name,
'short_short_name'=>$short_short_name,
//'dir_name'=>$dir_name,
'angemeldet'=>$angemeldet,
'lehrfach_id'=>$lehrfach_id,
'lektor_der_lv'=>$lektor_der_lv,
'lehrfach_oe_kurzbz_arr'=>$lehrfach_oe_kurzbz_arr,
'permissionLib' => &$this->PermissionLib,
'phrasesLib' => &$this->PhrasesLib
];
Events::trigger('lvMenuBuild',
// passing $menu per reference
function & () use (&$menu) {
return $menu;
},
$params
);
// Menu sortieren
// ##########################################################################################
foreach ($menu as $key => $row){
// removes menu points that are not needed in the c4 lvUebersicht
if( !array_key_exists('c4_link',$row) || !array_key_exists('c4_icon',$row)){
unset($menu[$key]);
continue;
}
// fills pos array to sort the menu
$pos[$key] = $row['position'];
}
array_multisort($pos, SORT_ASC, SORT_NUMERIC, $menu);
// HTTP response
// ##########################################################################################
$this->terminateWithSuccess($menu);
}
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
// LVINFO
if(!defined('CIS_LEHRVERANSTALTUNG_LVINFO_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_LVINFO_ANZEIGEN)
{
$c4_linkList=array();
// Bearbeiten Button anzeigen wenn Lektor der LV und bearbeiten fuer Lektoren aktiviert ist
// Oder Berechtigung zum Bearbeiten eingetragen ist
if((!defined('CIS_LEHRVERANSTALTUNG_LVINFO_LEKTOR_EDIT') && $lektor_der_lv)
|| (defined('CIS_LEHRVERANSTALTUNG_LVINFO_LEKTOR_EDIT') && CIS_LEHRVERANSTALTUNG_LVINFO_LEKTOR_EDIT==true && $lektor_der_lv)
|| $this->PermissionLib->isBerechtigt('lehre/lvinfo',$studiengang_kz)
|| $this->PermissionLib->isBerechtigtMultipleOe('lehre/lvinfo', $lehrfach_oe_kurzbz_arr)
)
{
$c4_linkList[]= [$this->p->t('lehre', 'lvInfoBearbeiten'), 'ects/index.php?lvid='.$lvid];
}
elseif ($is_lector)
{
$c4_linkList[]= ["Bearbeiten der LV-Infos derzeit gesperrt",'#'];
}
$menu[]=array
(
'id'=>'core_menu_lvinfo',
'position'=>'10',
'name'=>$this->p->t('lehre', 'lehrveranstaltungsinformation'),
'phrase' => 'lehre/lehrveranstaltungsinformation',
'icon'=>'../../../skin/images/button_lvinfo.png',
'link'=>'',
'c4_icon'=> base_url('skin/images/button_lvinfo.png'),
'c4_link'=>'',
'c4_linkList'=>$c4_linkList
);
}
}
private function fhc_menu_feedback(&$menu, $angemeldet, $lvid){
//FEEDBACK
if((!defined('CIS_LEHRVERANSTALTUNG_FEEDBACK_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_FEEDBACK_ANZEIGEN) && $angemeldet)
{
$menu[]=array
(
'id'=>'core_menu_feedback',
'position'=>'60',
'name'=>$this->p->t('lehre', 'feedback'),
'phrase' => 'lehre/feedback',
'c4_icon'=> base_url('skin/images/button_feedback.png'),
'c4_link'=> base_url('feedback.php?lvid='.$lvid),
);
}
}
private function fhc_menu_gesamtnote(&$menu, $angemeldet, $lvid, $lv_obj, $is_lector, $angezeigtes_stsem){
//Gesamtnote
if($is_lector && ((!defined('CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN) && $angemeldet))
{
if($lv_obj->benotung)
{
$menu[]=array
(
'id'=>'core_menu_gesamtnote',
'position'=>'80',
'name'=>$this->p->t('lehre', 'gesamtnote'),
'phrase' => 'lehre/gesamtnote',
'c4_icon'=> base_url('skin/images/button_endnote.png'),
'c4_link'=> base_url('cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
//'c4_link'=> base_url('benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
);
}
else
{
$menu[]=array
(
'id'=>'core_menu_gesamtnote',
'position'=>'80',
'name'=>$this->p->t('lehre', 'gesamtnote'),
'phrase'=>'lehre/gesamtnote',
'c4_icon'=>base_url('skin/images/button_endnote.png'),
'c4_link'=>'#',
'c4_linkList'=>[[$this->p->t('lehre', 'noteneingabedeaktiviert'),'#']],
);
}
}
}
private function fhc_menu_emailStudierende(&$menu, $user, $angemeldet, $lvid, $angezeigtes_stsem){
// Email an Studierende
if((!defined('CIS_LEHRVERANSTALTUNG_MAILSTUDIERENDE_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_MAILSTUDIERENDE_ANZEIGEN) && $angemeldet)
{
$mailto='mailto:';
$c4_linkList=array();
$studentMailsRes = $this->Lehrveranstaltung_model->getStudentEMail($lvid, $angezeigtes_stsem);
// get the data of the database result and map the array of objects to their object property
$studentMails = $this->getDataOrTerminateWithError($studentMailsRes, 'No student mails found');
$nomail='';
$variablesres = $this->Variable_model->getVariables($user);
$variables = (hasData($variablesres)) ? getData($variablesres) : array();
foreach ($studentMails as $row)
{
if($row->gruppe_kurzbz != '')
{
$bngrp_uids = $this->Benutzergruppe_model->getUids($row->gruppe_kurzbz, $angezeigtes_stsem);
if(count($bngrp_uids) > 0)
{
if(!$row->mailgrp)
{
$nomail = $row->gruppe_kurzbz . ' ';
}
else
{
$mailto .= mb_strtolower($row->gruppe_kurzbz . '@'
. DOMAIN . $variables['emailadressentrennzeichen']);
}
}
}
else
{
$mailto .= mb_strtolower($row->stg_typ . $row->stg_kurzbz
. $row->semester . trim($row->verband) . trim($row->gruppe)
. '@' . DOMAIN . $variables['emailadressentrennzeichen']);
}
}
if($nomail != '')
{
$c4_linkList[] = array(
$this->p->t('lehre', 'keinMailverteiler', array('nomail' => $nomail)),
'#'
);
$link_onclick = 'alert(\''.$this->p->t('lehre', 'keinMailverteiler', array('nomail' => $nomail)) . '\');';
}
else
{
$link_onclick = '';
}
$menu[]=array
(
'id'=>'core_menu_mailanstudierende',
'position'=>'100',
'name'=>$this->p->t('lehre', 'mail'),
'phrase' => 'lehre/mail',
'c4_icon'=>base_url('skin/images/button_feedback.png'),
'c4_icon2' => 'fa-regular fa-envelope',
'c4_link'=>$mailto,
'c4_linkList'=>$c4_linkList,
'link_onclick'=>$link_onclick
);
}
}
private function fhc_menu_abmeldung(&$menu, $user, $is_lector, $lvid, $angezeigtes_stsem){
if(!defined('CIS_LEHRVERANSTALTUNG_ABMELDUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ABMELDUNG_ANZEIGEN)
{
if(!$is_lector)
{
$gruppen = $this->Lvangebot_model->AbmeldungMoeglich($lvid, $angezeigtes_stsem, $user);
if(count($gruppen) > 0)
{
$menu[]=array
(
'id'=>'core_menu_abmeldung',
'position'=>'120',
'name'=>$this->p->t('lehre', 'abmelden'),
'phrase'=>'lehre/abmelden',
'c4_icon'=>base_url('skin/images/button_studiupload.png'),
'c4_link'=>base_url('abmeldung.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem)),
);
}
}
}
}
private function fhc_menu_lehretools(&$menu, $lvid, $angezeigtes_stsem, $sprache){
//Anzeigen von zusaetzlichen Lehre-Tools
$lehretools = $this->Lehretools_model->getTools($lvid, $angezeigtes_stsem, $sprache);
foreach($lehretools as $row)
{
$menu[] = array(
'id' => 'core_menu_lehretools_' . $row->lehre_tools_id,
'position' => '1000',
'name' => $row->bezeichnung,
'c4_icon' => base_url('cms/dms.php?id='.$row->logo_dms_id),
'c4_link' => $row->basis_url,
);
}
}
private function fhc_menu_anrechnungStudent(&$menu, $lvid, $angezeigtes_stsem){
// Anerkennung nachgewiesener Kenntnisse (Anrechnung) - Anzeige fuer Studenten
if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN)
&& $this->PermissionLib->isBerechtigt('student/anrechnung_beantragen'))
{
$menu[]=array
(
'id' => 'core_menu_anerkennungNachgewiesenerKenntnisse',
'position' => '128',
'name' => $this->p->t('lehre', 'anrechnung'),
'phrase' => 'lehre/anrechnung',
'c4_icon' => base_url('skin/images/button_listen.png'),
'c4_icon2' => 'fa-regular fa-folder-open',
'c4_link' => base_url('cis.php/lehre/anrechnung/RequestAnrechnung?studiensemester='.urlencode($angezeigtes_stsem).'&lv_id='.urlencode($lvid))
);
}
}
private function fhc_menu_anrechnungLector(&$menu, $angezeigtes_stsem){
// Anerkennung nachgewiesener Kenntnisse (Anrechnung) - Anzeige fuer LektorInnen
if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN)
&& $this->PermissionLib->isBerechtigt('lehre/anrechnung_empfehlen'))
{
$menu[]=array
(
'id' => 'core_menu_anerkennungNachgewiesenerKenntnisse_empfehlen',
'position' => '128',
'name' => $this->p->t('lehre', 'anrechnungen'),
'phrase' => 'lehre/anrechnung',
'c4_icon'=> base_url('skin/images/button_listen.png'),
'c4_icon2' => 'fa-regular fa-folder-open',
'c4_link' => base_url('cis.php/lehre/anrechnung/ReviewAnrechnungUebersicht?studiensemester='.urlencode($angezeigtes_stsem))
);
}
}
}
@@ -0,0 +1,363 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
use \DateTime as DateTime;
use \DateTimeZone as DateTimeZone;
class LvPlan extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getRoomplan' => self::PERM_LOGGED,
'Stunden' => self::PERM_LOGGED,
'getReservierungen' => self::PERM_LOGGED,
'LvPlanEvents' => self::PERM_LOGGED,
'eventsPersonal' => self::PERM_LOGGED,
'eventsLv' => self::PERM_LOGGED,
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
'studiensemesterDateInterval' => self::PERM_LOGGED,
'getLvPlanForStudiensemester' => self::PERM_LOGGED,
'getLv' => self::PERM_LOGGED
]);
$this->load->library('LogLib');
$this->loglib->setConfigs(array(
'classIndex' => 5,
'functionIndex' => 5,
'lineIndex' => 4,
'dbLogType' => 'API', // required
'dbExecuteUser' => 'RESTful API'
));
$this->load->library('form_validation');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches LvPlan and Moodle events together
* @access public
*
*/
public function LvPlanEvents()
{
$hasLv = $this->input->post('lv_id');
return $hasLv ? $this->eventsLv() : $this->eventsPersonal();
}
/**
* fetches LvPlan, Moodle and Ferien events together for the logged in user
*
* @access public
*/
public function eventsPersonal()
{
$this->load->library('StundenplanLib');
// form validation
$this->form_validation->set_rules('start_date', "start_date", "required");
$this->form_validation->set_rules('end_date', "end_date", "required");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the post parameter in local variables
$start_date = $this->input->post('start_date', true);
$end_date = $this->input->post('end_date', true);
// fetching lvplan events
$result = $this->stundenplanlib->getEventsUser($start_date, $end_date);
$lvplanEvents = $this->getDataOrTerminateWithError($result);
// fetching moodle events
$moodleEvents = $this->fetchMoodleEvents($start_date, $end_date);
// fetching ferien events
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
$this->terminateWithSuccess(array_merge(
$lvplanEvents,
$moodleEvents,
$ferienEvents
));
}
/**
* fetches LvPlan and Ferien events together for the lv
*
* @access public
*/
public function eventsLv()
{
$this->load->library('StundenplanLib');
// form validation
$this->form_validation->set_rules('start_date', "start_date", "required");
$this->form_validation->set_rules('end_date', "end_date", "required");
$this->form_validation->set_rules('lv_id', "lv_id", "required|integer");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the post parameter in local variables
$start_date = $this->input->post('start_date', true);
$end_date = $this->input->post('end_date', true);
$lv_id = $this->input->post('lv_id', true);
// fetching lvplan events
$result = $this->stundenplanlib->getEventsLv($lv_id, $start_date, $end_date);
$lvplanEvents = $this->getDataOrTerminateWithError($result);
// fetching ferien events
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
$this->terminateWithSuccess(array_merge(
$lvplanEvents,
$ferienEvents
));
}
//TODO: delete this function if we don't use the old calendar export endpoints anymore
public function studiensemesterDateInterval($date){
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester =$this->StudiensemesterModel->getByDate(date_format(date_create($date),'Y-m-d'));
$studiensemester =current($this->getDataOrTerminateWithError($studiensemester));
$this->terminateWithSuccess($studiensemester);
}
public function getLvPlanForStudiensemester($studiensemester,$lvid){
$this->load->library('StundenplanLib');
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester]);
$studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result));
$timespan_start = new DateTime($studiensemester_result->start);
$timespan_ende = new DateTime($studiensemester_result->ende);
$lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid);
$this->terminateWithSuccess($lvplan);
}
/**
* fetches Stunden layout from database
* @access public
*
*/
public function Stunden()
{
$this->load->model('ressource/Stunde_model', 'StundeModel');
$this->StundeModel->addOrder('stunde', 'ASC');
$stunden = $this->StundeModel->load();
$stunden = $this->getDataOrTerminateWithError($stunden);
$this->terminateWithSuccess($stunden);
}
/**
* fetches room events from a certain date
* @access public
*
* @return void
*/
public function getRoomplan()
{
$this->form_validation->set_rules('ort_kurzbz', "Ort", "required");
$this->form_validation->set_rules('start_date', "start_date", "required");
$this->form_validation->set_rules('end_date', "end_date", "required");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the post parameter in local variables
$ort_kurzbz = $this->input->post('ort_kurzbz', true);
$start_date = $this->input->post('start_date', true);
$end_date = $this->input->post('end_date', true);
// get data
$this->load->library('StundenplanLib');
$roomplan_data = $this->stundenplanlib->getRoomplan($ort_kurzbz, $start_date, $end_date);
$roomplan_data = $this->getDataOrTerminateWithError($roomplan_data);
$this->terminateWithSuccess($roomplan_data);
}
/**
* gets the reservierungen of a room if the ort_kurzbz parameter is
* supplied otherwise gets the reservierungen of the lvplan of a student
* @access public
*
* @param string $ort_kurzbz
* @return void
*/
public function getReservierungen($ort_kurzbz = null)
{
$this->form_validation->set_rules('start_date', "StartDate", "required");
$this->form_validation->set_rules('end_date', "EndDate", "required");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the post parameter in local variables
$start_date = $this->input->post('start_date', true);
$end_date = $this->input->post('end_date', true);
// get data
$this->load->library('StundenplanLib');
$result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz);
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
public function getLehreinheitStudiensemester($lehreinheit_id){
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]);
$result = $this->LehreinheitModel->load($lehreinheit_id);
$result = current($this->getDataOrTerminateWithError($result))->studiensemester_kurzbz;
$this->terminateWithSuccess($result);
}
/**
* get details for a lv
* @access public
*
* @param integer $lehrveranstaltung_id
* @return void
*/
public function getLv($lehrveranstaltung_id)
{
if (!$lehrveranstaltung_id && $lehrveranstaltung_id !== 0 && $lehrveranstaltung_id !== '0')
return show_404();
// Load Phrases
$this->loadPhrases(['lehre']);
// Validation
$this->form_validation->set_data([
'lehrveranstaltung_id' => $lehrveranstaltung_id
]);
$this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung_id'), 'integer');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// Get Data
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
$result = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess(current($result));
}
/**
* fetch moodle events
*
* @param string $start_date
* @param string $end_date
* @return array
*/
private function fetchMoodleEvents($start_date, $end_date)
{
$this->load->config('calendar');
$tz = new DateTimeZone($this->config->item('timezone'));
$start = new DateTime($start_date);
$start->setTimezone($tz);
$end = new DateTime($end_date);
$end->setTimezone($tz);
$end->modify('+1 day -1 second');
$moodle_events = [];
Events::trigger(
'moodleCalendarEvents',
function & () use (&$moodle_events) {
return $moodle_events;
},
[
'start_date' => $start->format('c'),
'end_date' => $end->format('c'),
'username' => getAuthUID()
]
);
return $moodle_events;
}
/**
* fetch ferien events
*
* @param string $start_date
* @param string $end_date
* @return array
*/
private function fetchFerienEvents($start_date, $end_date)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('education/Studentlehrverband_model', 'StudentLehrverbandModel');
$currentStudiensemester = $this->StudiensemesterModel->getByDate($start_date);
$currentStudiensemester = $this->getDataOrTerminateWithError($currentStudiensemester);
if ($currentStudiensemester) {
$studentsemester_kurzbz = current($currentStudiensemester)->studiensemester_kurzbz;
$studiengang = $this->StudentLehrverbandModel->loadWhere([
"student_uid" => getAuthUID(),
"studiensemester_kurzbz" => $studentsemester_kurzbz
]);
$studiengang = $this->getDataOrTerminateWithError($studiengang);
if ($studiengang)
$studiengang_kz = current($studiengang)->studiengang_kz;
else
$studiengang_kz = 0;
} else {
$studiengang_kz = 0;
}
$ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang_kz);
return $this->getDataOrTerminateWithError($ferienEvents);
}
}
@@ -0,0 +1,178 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
* Provides data to the ajax get calls about the searchbar component
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Ort extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
// NOTE(chris): additional permission checks will be done in SearchBarLib
parent::__construct([
'ContentID' => self::PERM_LOGGED,
'getOrtKurzbzContent' => self::PERM_LOGGED,
'getRooms' => self::PERM_LOGGED,
'getTypes' => self::PERM_LOGGED
]);
$this->load->model('ressource/Ort_model', 'OrtModel');
$this->config->load('raumsuche');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves all Ort entries filtered by the provided parameters
*/
public function getRooms()
{
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('datum','Datum','required');
$this->form_validation->set_rules('von','Uhrzeit Von','required|regex_match[/^[0-9]{2}:[0-9]{2}$/]');
$this->form_validation->set_rules('bis','Uhrzeit Bis','required|regex_match[/^[0-9]{2}:[0-9]{2}$/]');
if($this->form_validation->run() == FALSE) {
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$datum = $this->input->get('datum', TRUE);
$von = $this->input->get('von', TRUE);
$bis = $this->input->get('bis', TRUE);
$typ = $this->input->get('typ', TRUE);
$personenanzahl = $this->input->get('personenanzahl', TRUE);
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID())->retval;
$this->load->model('ressource/Stunde_model', 'StundeModel');
$vonStunde = getData($this->StundeModel->getStundeForTime($von))[0]->stunde;
$bisStunde = getData($this->StundeModel->getStundeForTime($bis))[0]->stunde;
$params = array();
$qry = "SELECT DISTINCT tbl_ort.*
FROM public.tbl_ort JOIN public.tbl_ortraumtyp USING(ort_kurzbz)
WHERE aktiv AND lehre AND ort_kurzbz NOT LIKE '\\\\_%'";
if($typ) {
$params[] = $typ;
$qry.= "AND raumtyp_kurzbz = ?";
}
if(!$isMitarbeiter) { // students are only allowed to get a subset defined by config
$qry.= ' AND raumtyp_kurzbz IN ?';
$params[] = $this->config->item('roomtypes_student');
$this->addMeta('config', $this->config->item('roomtypes_student'));
}
$qry.= "AND (max_person>= ? OR max_person is null)";
$params[] = $personenanzahl;
$qry.=" AND ort_kurzbz NOT IN
(
SELECT ort_kurzbz FROM lehre.tbl_stundenplandev WHERE datum = ? AND stunde >= ? AND stunde <= ?
UNION
SELECT ort_kurzbz FROM campus.tbl_reservierung WHERE datum= ? AND stunde >= ? AND stunde <= ?
)
";
$params = array_merge($params, [$datum, $vonStunde, $bisStunde, $datum, $vonStunde, $bisStunde]);
// $this->addMeta('qry', $qry);
// $this->addMeta('params', $params);
$result = $this->OrtModel->execReadOnlyQuery($qry, $params);
$this->terminateWithSuccess($result);
}
public function getTypes()
{
$this->load->model('ressource/Raumtyp_model', 'RaumtypModel');
$qry = "SELECT * FROM public.tbl_raumtyp WHERE aktiv = true";
$params = array();
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID())->retval;
if(!$isMitarbeiter) { // students are only allowed to get a subset defined by config
$qry.= ' AND raumtyp_kurzbz IN ?';
$params[] = $this->config->item('roomtypes_student');
}
$qry .= " ORDER BY raumtyp_kurzbz;";
$result = $this->OrtModel->execReadOnlyQuery($qry, $params);
$this->terminateWithSuccess(getData($result));
}
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function ContentID()
{
// if error
//$this->terminateWithError(SearchBarLib::ERROR_WRONG_JSON, self::ERROR_TYPE_GENERAL);
$ort_kurzbz = $this->input->get('ort_kurzbz',TRUE);
if(!$ort_kurzbz){
$this->terminateWithError("missing ort_kurzbz parameter", self::ERROR_TYPE_GENERAL);
}
$result = $this->OrtModel->getContentID($ort_kurzbz);
if(isError($result)){
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$result = hasData($result) ? current(getData($result)) : null;
$this->terminateWithSuccess($result->content_id ?? NULL);
}
/**
* @param int $version
* @param string $sprache
* @param boolean $sichtbar
*
* @return $content
*/
public function getOrtKurzbzContent($version = null, $sprache = null, $sichtbar = true)
{
$content_id = $this->input->get("content_id",TRUE);
$this->load->library('CmsLib');
$content = $this->cmslib->getContent($content_id, $version, $sprache, $sichtbar);
if (isError($content))
$this->terminateWithError(getError($content), self::ERROR_TYPE_GENERAL);
$content = hasData($content) ? getData($content) : null;
$this->terminateWithSuccess($content);
}
}
@@ -28,8 +28,13 @@ class Phrasen extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'loadModule' => self::PERM_ANONYMOUS
'loadModule' => self::PERM_ANONYMOUS,
'setLanguage' => self::PERM_ANONYMOUS,
'getLanguage' => self::PERM_ANONYMOUS,
'getAllLanguages' => self::PERM_ANONYMOUS,
]);
$this->load->helper('hlp_language');
}
//------------------------------------------------------------------------------------------------------------------
@@ -43,4 +48,48 @@ class Phrasen extends FHCAPI_Controller
$this->load->library('PhrasesLib', [$module], 'pj');
$this->terminateWithSuccess(json_decode($this->pj->getJSON()));
}
}
public function setLanguage()
{
$postParams = $this->getPostJSON();
$language = $postParams->language;
$categories = $postParams->categories;
setUserLanguage($language);
$this->load->library('PhrasesLib', array($categories, $language), 'p');
$phrases = $this->p->setPhrases($categories, $language);
$this->terminateWithSuccess($phrases);
}
// gets the langauge of the currently logged in user session and otherwhise the system language
public function getLanguage()
{
$lang = getUserLanguage();
$this->terminateWithSuccess($lang);
}
// gets all languages that are set as active in the database
public function getAllLanguages()
{
$this->load->model('system/Sprache_model', 'SprachenModel');
// Add order clause by index and select the sprache,bezeichnung and index column
$this->SprachenModel->addOrder('index');
$this->SprachenModel->addSelect('sprache, bezeichnung, index');
// Retrieves from public.tbl_sprache
$langs = $this->SprachenModel->loadWhere(array('content' => true));
$langs = $this->getDataOrTerminateWithError($langs);
$langs = array_map(function($lang){
$data = new stdClass();
$data->sprache = $lang->sprache;
$data->bezeichnung = $lang->bezeichnung[($lang->index-1)];
return $data;
}, $langs);
$this->terminateWithSuccess($langs);
}
}
@@ -0,0 +1,172 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Profil extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'fotoSperre' => self::PERM_LOGGED,
'getGemeinden' => self::PERM_LOGGED,
'getAllNationen' => self::PERM_LOGGED,
'isMitarbeiter' => self::PERM_LOGGED,
'profilViewData' => self::PERM_LOGGED,
]);
$this->load->library('PermissionLib');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('person/Person_model', 'PersonModel');
//? put the uid and pid inside the controller for reusability
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function profilViewData($uid=null){
$this->load->library('ProfilLib');
$editable = false;
if(isset($uid) && $uid != null){
$profil_data = $this->profillib->getView($uid);
if($uid == getAuthUID()){
$editable = true;
}
}else{
$editable = true;
$profil_data = $this->profillib->getView(getAuthUID());
}
$profil_data = hasData($profil_data) ? getData($profil_data) : null;
$viewData = array(
'editable'=>$editable,
'profil_data' => $profil_data,
);
$this->terminateWithSuccess($viewData);
}
/**
* update column foto_sperre in public.tbl_person
* @access public
* @param boolean $value new value for the column
* @return boolean the new value added to the column in public.tbl_person
*/
public function fotoSperre($value)
{
if(!isset($value)){
$this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL);
}
$res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]);
if (isError($res)) {
$this->terminateWithError("error while trying to update table public.tbl_person");
}
$this->PersonModel->addSelect("foto_sperre");
$res = $this->PersonModel->load($this->pid);
$res = $this->getDataOrTerminateWithError($res);
$this->terminateWithSuccess(current($res));
}
/**
* gets all nations in the table bis.tbl_nation
*
* @access public
* @return array all the nations in table bis.tbl_nation
*/
public function getAllNationen()
{
// load the nationen from the database
$this->load->model('codex/Nation_model', "NationModel");
$this->NationModel->addSelect(["nation_code as code", "langtext"]);
$nation_res = $this->NationModel->load();
if (isError($nation_res)) {
$this->terminateWithError("error while trying to query table codex.tbl_nation", self::ERROR_TYPE_GENERAL);
}
$nation_res = $this->getDataOrTerminateWithError($nation_res);
$this->terminateWithSuccess($nation_res);
}
public function getGemeinden($nation, $zip)
{
if(!isset($nation) || !isset($zip)){
echo json_encode(error("Missing parameters"));
return;
}
$this->load->model('codex/Gemeinde_model', "GemeindeModel");
$gemeinde_res = $this->GemeindeModel->getGemeindeByPlz($zip);
if (isError($gemeinde_res)) {
$this->terminateWithError(getError($gemeinde_res),self::ERROR_TYPE_GENERAL);
}
$gemeinde_res = $this->getDataOrTerminateWithError($gemeinde_res);
/* $gemeinde_res = array_map(function ($obj) {
return $obj->ortschaftsname;
}, $gemeinde_res); */
$this->terminateWithSuccess($gemeinde_res);
}
/**
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
* @access public
* @param $uid the userID used to check if it is a mitarbeiter
* @return boolean
*/
public function isMitarbeiter($uid)
{
if(!$uid) $this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL);
$result = $this->MitarbeiterModel->isMitarbeiter($uid);
if (isError($result)) {
$this->terminateWithError("error when calling Mitarbeiter_model function isMitarbeiter with uid " . $uid, self::ERROR_TYPE_GENERAL);
}
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
}
@@ -0,0 +1,957 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class ProfilUpdate extends FHCAPI_Controller
{
public static $STATUS_PENDING = NULL;
public static $STATUS_ACCEPTED = NULL;
public static $STATUS_REJECTED = NULL;
public static $TOPICS = [];
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getStatus' => self::PERM_LOGGED,
'getTopic' => self::PERM_LOGGED,
'getProfilRequestFiles' => self::PERM_LOGGED,
'getProfilUpdateWithPermission' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'],
'denyProfilRequest' => ['student/stammdaten:rw', 'mitarbeiter/stammdaten:rw'],
'acceptProfilRequest' => ['student/stammdaten:rw', 'mitarbeiter/stammdaten:rw'],
'selectProfilRequest' => self::PERM_LOGGED,
'insertProfilRequest' => self::PERM_LOGGED,
'updateProfilRequest' => self::PERM_LOGGED,
'deleteProfilRequest' => self::PERM_LOGGED,
'insertFile' => self::PERM_LOGGED,
'updateProfilbild' => self::PERM_LOGGED,
'show' => self::PERM_LOGGED,
]);
$this->load->config('cis');
// Load language phrases
$this->loadPhrases(
array(
'ui',
'global',
'person',
'profil',
'profilUpdate'
)
);
$this->load->model('person/Profil_update_model', 'ProfilUpdateModel');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$this->load->model('person/Adresse_model', 'AdresseModel');
$this->load->model('person/Adressentyp_model', 'AdressenTypModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->load->model('person/Profil_update_status_model', 'ProfilUpdateStatusModel');
$this->load->model('person/Profil_update_topic_model', 'ProfilUpdateTopicModel');
$this->load->library('DmsLib');
$this->load->library('PermissionLib');
//? put the uid and pid inside the controller for reusability
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
// setup the ProfilUpdate states
$this->ProfilUpdateStatusModel->addSelect(['status_kurzbz']);
$status_kurzbz = $this->ProfilUpdateStatusModel->load();
if (hasData($status_kurzbz)) {
list($status_pending, $status_accepted, $status_rejected) = getData($status_kurzbz);
self::$STATUS_PENDING = $status_pending->status_kurzbz;
self::$STATUS_ACCEPTED = $status_accepted->status_kurzbz;
self::$STATUS_REJECTED = $status_rejected->status_kurzbz;
}
// setup the ProfilUpdate topics
$this->ProfilUpdateTopicModel->addSelect(['topic_kurzbz']);
$topic_kurzbz = $this->ProfilUpdateTopicModel->load();
if (hasData($topic_kurzbz)) {
foreach (getData($topic_kurzbz) as $topic) {
self::$TOPICS[$topic->topic_kurzbz] = $topic->topic_kurzbz;
}
}
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStatus()
{
$this->terminateWithSuccess([self::$STATUS_PENDING => self::$STATUS_PENDING, self::$STATUS_ACCEPTED => self::$STATUS_ACCEPTED, self::$STATUS_REJECTED => self::$STATUS_REJECTED]);
}
public function getTopic()
{
if(!count(self::$TOPICS)){
$this->terminateWithError('No topics found');
}
$this->terminateWithSuccess(self::$TOPICS);
}
public function show($dms_id)
{
$profil_update = $this->ProfilUpdateModel->loadWhere(['attachment_id' => $dms_id]);
$profil_update = hasData($profil_update) ? getData($profil_update)[0] : null;
//? checks if an profil update exists with the dms_id requested from the user
if ($profil_update) {
$is_mitarbeiter_profil_update = getData($this->MitarbeiterModel->isMitarbeiter($profil_update->uid));
$is_student_profil_update = getData($this->StudentModel->isStudent($profil_update->uid));
if (
$this->permissionlib->isBerechtigt('student/stammdaten:r') && $is_student_profil_update ||
$this->permissionlib->isBerechtigt('mitarbeiter/stammdaten:r') && $is_mitarbeiter_profil_update ||
$this->uid == $profil_update->uid
) {
// Get file to be downloaded from DMS
$download = $this->dmslib->download($dms_id);
$download = $this->getDataOrTerminateWithError($download);
// Download file
$this->outputFile($download);
} else {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_permission_error'));
}
} else {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_dms_error'));
}
}
public function selectProfilRequest()
{
$uid = $this->input->get('uid',true);
$id = $this->input->get('id',true);
$whereClause = ['uid' => $this->uid];
if (isset($uid))
$whereClause['uid'] = $uid;
if (isset($id))
$whereClause['id'] = $id;
$res = $this->ProfilUpdateModel->getProfilUpdatesWhere($whereClause);
$res = $this->getDataOrTerminateWithError($res);
$this->terminateWithSuccess($res);
}
public function insertProfilRequest()
{
$payload = $this->input->post('payload');
$topic = $this->input->post('topic',true);
$fileID = $this->input->post('fileID',true);
if(!isset($payload) || !isset($topic)){
$this->terminateWithError("required parameters are missing");
}
$identifier = array_key_exists("kontakt_id", $payload) ? "kontakt_id" : (array_key_exists("adresse_id", $payload) ? "adresse_id" : null);
$data = ["topic" => $topic, "uid" => $this->uid, "requested_change" => json_encode($payload), "insertamum" => "NOW()", "insertvon" => $this->uid, "status" => self::$STATUS_PENDING ?: 'Pending'];
//? insert fileID in the dataset if sent with post request
if (isset($fileID)) {
$data['attachment_id'] = $fileID;
}
//? loops over all updateRequests from a user to validate if the new request is valid
$res = $this->ProfilUpdateModel->getProfilUpdatesWhere(["uid" => $this->uid]);
$res = $this->getDataOrTerminateWithError($res);
//? the user cannot delete a zustelladresse/kontakt
if (isset($payload["delete"]) && $payload[$identifier == "kontakt_id" ? "zustellung" : "zustelladresse"]) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_deleteZustellung_error'));
}
//? if the user tries to delete a adresse, checks whether the adresse is a heimatadresse, if so an error is raised
if (isset($payload["delete"]) && $identifier == "adresse_id") {
$adr = $this->AdresseModel->load($payload[$identifier]);
$adr = $this->getDataOrTerminateWithError($adr)[0];
if ($adr->heimatadresse) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_deleteZustellung_error'));
}
}
if ($res) {
$pending_changes = array_filter($res, function ($element) {
return $element->status == (self::$STATUS_PENDING ?: "Pending");
});
foreach ($pending_changes as $update_request) {
$existing_change = $update_request->requested_change;
//? the user can add as many new kontakte/adressen as he likes
if (!isset($payload["add"]) && property_exists($existing_change, $identifier) && array_key_exists($identifier,$payload) && $existing_change->$identifier == $payload[$identifier]) {
//? the kontakt_id / adresse_id of a change has to be unique
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_changeTwice_error'));
}
//? if it is not updating any kontakt/adresse, the topic has to be unique
elseif (!$identifier && $update_request->topic == $topic) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_changeTopicTwice_error', ['0' => $update_request->topic]));
}
}
}
$insertID = $this->ProfilUpdateModel->insert($data);
if (isError($insertID)) {
$this->terminateWithError(getError($insertID));
} else {
$insertID = hasData($insertID) ? getData($insertID) : null;
//? sends emails to the correspondents of the $uid
$this->sendEmail_onProfilUpdate_insertion($this->uid, $insertID, $topic);
$this->terminateWithSuccess(success($insertID));
}
}
public function updateProfilRequest()
{
$topic = $this->input->post('topic', true);
$payload = $this->input->post('payload', true);
$ID = $this->input->post('ID', true);
$fileID = $this->input->post('fileID', true);//optional
if(!isset($topic) || !isset($payload) || !isset($ID)){
$this->terminateWithError("required parameters are missing");
}
$updateData = ["requested_change" => json_encode($payload), "updateamum" => "NOW()", "updatevon" => $this->uid];
if (isset($fileID)) {
$updateData['attachment_id'] = json_decode($fileID);
}
$updateID = $this->ProfilUpdateModel->update([$ID], $updateData);
//? insert fileID in the dataset if sent with post request
if (isError($updateID)) {
$this->terminateWithError(getError($updateID));
}
$updateID = $this->getDataOrTerminateWithError($updateID)[0];
$this->terminateWithSuccess(success($updateID));
}
public function deleteProfilRequest()
{
$requestID = $this->input->post('requestID', true);
$result = $this->ProfilUpdateModel->delete([$requestID]);
if (isError($result)) {
$this->terminateWithError(getError($result));
}
$this->terminateWithSuccess($result);
}
public function getProfilRequestFiles($id)
{
if(!$id){
$this->terminateWithError("parameter id is missing");
}
$this->ProfilUpdateModel->addSelect(["attachment_id"]);
$attachmentID = $this->ProfilUpdateModel->load([$id]);
if (isError($attachmentID)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loading_error'),self::ERROR_TYPE_GENERAL);
}
//? get the attachmentID
$dms_id = $this->getDataOrTerminateWithError($attachmentID)[0]->attachment_id;
//? get the name to the file
$this->DmsVersionModel->addSelect(["name", "dms_id"]);
$attachment = $this->DmsVersionModel->load([$dms_id, 0]);
if (isError($attachment)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_dmsVersion_error'),self::ERROR_TYPE_GENERAL);
}
$attachment = $this->getDataOrTerminateWithError($attachment);
//? returns {name:..., dms_id:...}
$this->terminateWithSuccess($attachment);
}
public function denyProfilRequest()
{
$id = $this->input->post('profil_update_id', true);
$uid = $this->input->post('uid', true);
$topic = $this->input->post('topic', true);
$status_message = $this->input->post('status_message', true); //optional
if(!isset($id) || !isset($uid) || !isset($topic)){
$this->terminateWithError("parameter id, uid, topic or status_message is missing");
}
$is_mitarbeiter = $this->MitarbeiterModel->isMitarbeiter($uid);
$is_mitarbeiter = $this->getDataOrTerminateWithError($is_mitarbeiter);
$is_student = $this->StudentModel->isStudent($uid);
$is_student = $this->getDataOrTerminateWithError($is_student);
if (
$is_student && $this->permissionlib->isBerechtigt('student/stammdaten', "suid", $this->getOE_from_student($uid)) ||
$is_mitarbeiter && $this->permissionlib->isBerechtigt('mitarbeiter/stammdaten', "suid")
) {
$this->sendEmail_onProfilUpdate_response($uid, $topic, self::$STATUS_REJECTED);
$this->terminateWithSuccess($this->setStatusOnUpdateRequest($id, self::$STATUS_REJECTED, $status_message));
} else {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_permission_error'),self::ERROR_TYPE_GENERAL);
}
}
public function acceptProfilRequest()
{
$id = $this->input->post('profil_update_id', true);
$uid = $this->input->post('uid', true);
$topic = $this->input->post('topic', true);
$requested_change = $this->input->post('requested_change');
$status_message = $this->input->post('status_message', true); //optional
//? fetching person_id using UID
$personID = $this->PersonModel->getByUid($uid);
$personID = $this->getDataOrTerminateWithError($personID)[0]->person_id;
//! check for required information
if (!isset($id) || !isset($uid) || !isset($personID) || !isset($requested_change) || !isset($topic)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_requiredInformation_error'));
}
$is_mitarbeiter = $this->MitarbeiterModel->isMitarbeiter($uid);
$is_mitarbeiter = $this->getDataOrTerminateWithError($is_mitarbeiter);
$is_student = $this->StudentModel->isStudent($uid);
$is_student = $this->getDataOrTerminateWithError($is_student);
//? check if the permissions are set correctly
if (
$is_student && $this->permissionlib->isBerechtigt('student/stammdaten', "suid", $this->getOE_from_student($uid)) ||
$is_mitarbeiter && $this->permissionlib->isBerechtigt('mitarbeiter/stammdaten', "suid")
) {
if (is_array($requested_change) && array_key_exists("adresse_id", $requested_change)) {
$insertID = $this->handleAdresse($requested_change, $personID);
$insertID = getData($insertID);
if (isset($insertID)) {
$requested_change['adresse_id'] = $insertID;
$update_res = $this->updateRequestedChange($id, $requested_change);
if (isError($update_res)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_address_error', [$insertID]));
}
}
} else if (is_array($requested_change) && array_key_exists("kontakt_id", $requested_change)) {
$insertID = $this->handleKontakt($requested_change, $personID);
$insertID = getData($insertID);
if (isset($insertID)) {
$requested_change['kontakt_id'] = $insertID;
$update_res = $this->updateRequestedChange($id, $requested_change);
if (isError($update_res)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_kontakt_error', [$insertID]));
}
}
} else {
switch ($topic) {
// mapping phrasen to database columns to make the update with the correct column names
case self::$TOPICS['Titel']:
$topic = "titelpre";
break;
case self::$TOPICS['Postnomen']:
$topic = "titelpost";
break;
case self::$TOPICS['Vorname']:
$topic = "vorname";
break;
case self::$TOPICS['Nachname']:
$topic = "nachname";
break;
default:
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_topic_error', [$topic]));
}
$result = $this->PersonModel->update($personID, [$topic => $requested_change["value"]]);
if (isError($result)) $this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_insert_error'));
}
$this->sendEmail_onProfilUpdate_response($uid, $topic, self::$STATUS_ACCEPTED);
$this->terminateWithSuccess($this->setStatusOnUpdateRequest($id, self::$STATUS_ACCEPTED, $status_message, $requested_change));
} else {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_permission_error'));
}
}
public function insertFile($replace)
{
$replace = json_decode($replace);
if (!count($_FILES)) {
$this->terminateWithError("No file available for upload");
}
//? if replace is set it contains the profil_update_id in which the attachment_id has to be replaced
if (isset($replace)) {
$this->ProfilUpdateModel->addSelect(["attachment_id"]);
$profilUpdate = $this->ProfilUpdateModel->load([$replace]);
if (isError($profilUpdate)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loading_error'));
}
//? get the attachmentID
$dms_id = $this->getDataOrTerminateWithError($profilUpdate)[0]->attachment_id;
//? delete old dms_file of Profil Update
$deleteOldFile_result = $this->deleteOldVersionFile($dms_id);
if(!$deleteOldFile_result){
$this->terminateWithError("error while deleting the old file");
}
}
$files = $_FILES['files'];
$file_count = count($files['name']);
$res = [];
for ($i = 0; $i < $file_count; $i++) {
$_FILES['files']['name'] = $files['name'][$i];
$_FILES['files']['type'] = $files['type'][$i];
$_FILES['files']['tmp_name'] = $files['tmp_name'][$i];
$_FILES['files']['error'] = $files['error'][$i];
$_FILES['files']['size'] = $files['size'][$i];
$dms = [
"kategorie_kurzbz" => "profil_aenderung",
"version" => 0,
"name" => $_FILES['files']['name'],
"mimetype" => $_FILES['files']['type'],
"beschreibung" => $this->uid . " Profil Änderung",
"insertvon" => $this->uid,
"insertamum" => "NOW()",
];
$tmp_res = $this->dmslib->upload($dms, 'files', array("jpg", "png", "pdf"));
if(isError($tmp_res)){
$this->addError(getError($tmp_res));
}
$tmp_res = $this->getDataOrTerminateWithError($tmp_res);
array_push($res, $tmp_res);
}
$this->terminateWithSuccess($res);
}
public function updateProfilbild()
{
$resize = function($filename, $width, $height){
// Hoehe und Breite neu berechnen
list($width_orig, $height_orig) = getimagesize($filename);
if ($width && ($width_orig < $height_orig))
{
$width = ($height / $height_orig) * $width_orig;
}
else
{
$height = ($width / $width_orig) * $height_orig;
}
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
//Bild nur verkleinern aber nicht vergroessern
if($width_orig>$width || $height_orig>$height)
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
else
$image_p = $image;
imagejpeg($image_p, $filename, 80);
@imagedestroy($image_p);
@imagedestroy($image);
};
if (!count($_FILES)) {
$this->terminateWithError("No file available for upload");
}
$files = $_FILES['files'];
$_FILES['files']['name'] = current($files['name']);
$_FILES['files']['type'] = current($files['type']);
$_FILES['files']['tmp_name'] = current($files['tmp_name']);
$_FILES['files']['error'] = current($files['error']);
$_FILES['files']['size'] = current($files['size']);
$_FILES['files']['tmp_name'] = current($files['tmp_name']);
$filename = $_FILES['files']['tmp_name'];
$ext = substr(current($files['name']), strrpos(current($files['name']), '.') + 1);
if($ext!='jpg' && $ext!='jpeg'){
$this->terminateWithError("Only jpg and jpeg files are allowed for profilbild upload");
}
// resize
$resize($filename, 827, 1063);
//akte
$fp = fopen($filename,'r');
//auslesen
$content = fread($fp, filesize($filename));
$base64_content = base64_encode($content);
$this->load->library('AkteLib');
$aktenInsertResult = $this->aktelib->add($this->pid,'Lichtbil',"Lichtbild_".$this->pid.".jpg","image/jpg",$fp,"Lichtbild gross");
fclose($fp);
if (isError($aktenInsertResult)) {
$this->terminateWithError(getError($aktenInsertResult));
}
// in person abspeichern
$resize($filename, 101, 130);
$fp = fopen($filename,'r');
$content = fread($fp, filesize($filename));
fclose($fp);
$base64_content = base64_encode($content);
$this->load->model('person/Person_model','PersonModel');
$personUpdate = $this->PersonModel->update($this->pid, ["foto"=>$base64_content]);
if(isError($personUpdate)){
$this->terminateWithError(getError($personUpdate));
}
// update foto status
$this->load->model('person/Fotostatusperson_model','FotostatusModel');
$fotoInsert = $this->FotostatusModel->insert(["person_id"=>$this->pid,"fotostatus_kurzbz"=>"hochgeladen","datum"=>date('Y-m-d'),"insertamum"=>date('Y-m-d H:i:s'),"insertvon"=>$this->uid,"updateamum"=>date('Y-m-d H:i:s'),"updatevon"=>$this->uid]);
if(isError($fotoInsert)){
$this->terminateWithError(getError($fotoInsert));
}
$this->terminateWithSuccess();
}
public function getProfilUpdateWithPermission($status = null)
{
// early return if no status has been passed as argument
if (!isset($status)) {
$this->terminateWithSuccess($this->ProfilUpdateModel->getProfilUpdateWithPermission());
}
// get the sprache of the user
$sprachenIndex = $this->SpracheModel->loadWhere(["sprache" => getUserLanguage()]);
$sprachenIndex = hasData($sprachenIndex) ? getData($sprachenIndex)[0]->index : null;
if (isset($sprachenIndex) && isset($status)) {
// get the corresponding status kurz_bz primary key out of the translation
$status = $this->ProfilUpdateStatusModel->execReadOnlyQuery("select * from public.tbl_profil_update_status where ? = ANY(bezeichnung_mehrsprachig)", [$status]);
$status = hasData($status) ? getData($status)[0]->status_kurzbz : null;
$res = $this->ProfilUpdateModel->getProfilUpdateWithPermission(isset($status) ? ['status' => $status] : null);
$this->terminateWithSuccess($res);
}
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
private function sendEmail_onProfilUpdate_insertion($uid, $profil_update_id, $topic)
{
if($this->config->item('cis_send_profil_update_mails') === false)
{
return;
}
$this->load->helper('hlp_sancho_helper');
$emails = [];
$is_mitarbeiter = $this->MitarbeiterModel->isMitarbeiter($uid);
if (isError($is_mitarbeiter)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_mitarbeiterCheck_error'));
}
$is_mitarbeiter = $this->getDataOrTerminateWithError($is_mitarbeiter);
//! if the $uid is a mitarbeiter and student, only the hr is notified by email
if ($is_mitarbeiter) {
//? user is not a student therefore he is a mitarbeiter, send email to Personalverwaltung
//? use constant variable MAIL_GST to mail to the personalverwaltung
$this->MitarbeiterModel->addSelect([TRUE]);
$this->MitarbeiterModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid");
//? check if the the userID is a mitarbeiter and if the benutzer is active
$res = $this->MitarbeiterModel->loadWhere(["public.tbl_mitarbeiter.mitarbeiter_uid" => $uid, "public.tbl_benutzer.aktiv" => TRUE]);
if (isError($res)) {
$this->terminateWithError("was not able to query the mitarbeiter and benutzer by the uid: " . $uid);
}
if (hasData($res)) {
array_push($emails, MAIL_GST);
} else {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_mitarbeiterCheck_error'));
}
} else {
//? if it is not a mitarbeiter, check whether it is a student and send email to studiengang
$is_student = $this->StudentModel->isStudent($uid);
if (isError($is_student)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_studentCheck_error'));
}
$is_student = $this->getDataOrTerminateWithError($is_student);
if ($is_student) {
//? Send email to the Studiengangsassistentinnen
$this->StudentModel->addSelect(["public.tbl_studiengang.email"]);
$this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid");
$this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id and public.tbl_student.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id");
$this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]);
//* check if the benutzer itself is active
//* check if the student status is Student or Diplomand (active students)
$this->StudentModel->db->where_in("public.tbl_prestudentstatus.status_kurzbz", ['Student', 'Diplomand']);
$res = $this->StudentModel->loadWhere(["public.tbl_benutzer.aktiv" => TRUE, "public.tbl_student.student_uid" => $uid]);
if (isError($res)) {
$this->terminateWithError(getError($res));
} else {
$res = $this->getDataOrTerminateWithError($res);
foreach ($res as $emailObj) {
array_push($emails, $emailObj->email);
}
}
}
}
$mail_res = [];
//? sending email
foreach ($emails as $email)
{
$href = $this->config->item('cis_vilesci_base_url') . $this->config->item('cis_vilesci_index_page') . '/Cis/ProfilUpdate/id/' . $profil_update_id;
array_push($mail_res, sendSanchoMail("profil_update", ['uid' => $uid, 'topic' => $topic, 'href' => $href], $email, ("Profil Änderung von " . $uid)));
}
foreach ($mail_res as $m_res) {
if (!$m_res) {
$this->addError($this->p->t('profilUpdate', 'profilUpdate_email_error'));
}
}
}
private function sendEmail_onProfilUpdate_response($uid, $topic, $status)
{
if($this->config->item('cis_send_profil_update_mails') === false)
{
return;
}
$this->load->helper('hlp_sancho_helper');
$email = $uid . "@" . DOMAIN;
function languageQuery($language)
{
return "select index from public.tbl_sprache where sprache = '" . $language . "'";
}
$this->ProfilUpdateStatusModel->addSelect(["bezeichnung_mehrsprachig[(" . languageQuery('German') . ")] as status_de", "bezeichnung_mehrsprachig[(" . languageQuery('English') . ")] as status_en"]);
$status_translation = $this->ProfilUpdateStatusModel->loadWhere(["status_kurzbz" => $status]);
if (isError($status_translation)) {
$this->terminateWithError($this->p->t('profilUpdate', 'ProfilUpdateStatusTranslationError'));
}
$status_translation = hasData($status_translation) ? getData($status_translation)[0] : null;
if (isset($status_translation))
{
$href = $this->config->item('cis_base_url') . $this->config->item('cis_index_page') . '/Cis/Profil';
$mail_res = sendSanchoMail("profil_update_response", ['topic' => $topic, 'status_de' => $status_translation->status_de, 'status_en' => $status_translation->status_en, 'href' => $href], $email, ("Profil Änderung " . $status_translation->status_de . ' / Profile Update ' . $status_translation->status_en));
if (!$mail_res) {
$this->addError($this->p->t('profilUpdate', 'profilUpdate_email_error'));
}
}
}
private function setStatusOnUpdateRequest($id, $status, $status_message)
{
return $this->ProfilUpdateModel->update([$id], [
"status" => $status,
"status_timestamp" => "NOW()",
"status_message" => $status_message,
"updateamum" => "NOW()",
"updatevon" => getAuthUID()
]);
}
private function updateRequestedChange($id, $requested_change)
{
return $this->ProfilUpdateModel->update([$id], ['requested_change' => json_encode($requested_change)]);
}
private function deleteOldVersionFile($dms_id)
{
if (!isset($dms_id)) {
return true;
}
// starting the transaction
$this->db->trans_start();
//? delete the file from the profilUpdate first
$profilUpdateFileDelete = $this->ProfilUpdateModel->removeFileFromProfilUpdate($dms_id);
if(isError($profilUpdateFileDelete)){
$this->terminateWithError(getError($profilUpdateFileDelete));
}
//? delete all the different versions of the dms_file
$dmsVersions = $this->DmsVersionModel->loadWhere(["dms_id" => $dms_id]);
$dmsVersions = $this->getDataOrTerminateWithError($dmsVersions);
$dms_versions = array_map(function ($item) {
return $item->version;
}, $dmsVersions);
$test_array = array();
foreach ($dms_versions as $version) {
$delete_result = $this->dmslib->removeVersion($dms_id, $version);
array_push($test_array, $delete_result);
if(isError($delete_result)){
$this->addError(getError($delete_result));
}
}
// transaction complete
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE)
{
return false;
}
else
{
return true;
}
}
private function getOE_from_student($student_uid)
{
//? returns the oe_einheit eines Studenten
$query = "SELECT public.tbl_studiengang.oe_kurzbz
FROM public.tbl_student
JOIN public.tbl_studiengang ON tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
WHERE public.tbl_student.student_uid = ?;";
$res = $this->StudentModel->execReadOnlyQuery($query, [$student_uid]);
$res = $this->getDataOrTerminateWithError($res, $this->p->t('profilUpdate', 'profilUpdate_loadingOE_error'));
$oe = ($res[0])->oe_kurzbz;
return $oe;
}
private function handleAdresse($requested_change, $personID)
{
$this->AdressenTypModel->addSelect(["adressentyp_kurzbz"]);
$adr_kurzbz = $this->AdressenTypModel->loadWhere(["bezeichnung" => $requested_change['typ']]);
$adr_kurzbz = $this->getDataOrTerminateWithError($adr_kurzbz)[0]->adressentyp_kurzbz;
//? replace the address_typ with its correct kurzbz foreign key
$requested_change['typ'] = $adr_kurzbz;
$adresse_id = $requested_change["adresse_id"];
//? removes the adresse_id because we don't want to update the kontakt_id in the database
unset($requested_change["adresse_id"]);
//! ADD
if (array_key_exists('add', $requested_change) && $requested_change['add']) {
//? removes add flag
unset($requested_change['add']);
$requested_change['insertamum'] = "NOW()";
$requested_change['insertvon'] = getAuthUID();
$requested_change['person_id'] = $personID;
//TODO: zustelladresse, heimatadresse, rechnungsadresse und nation werden nicht beachtet
$insertID = $this->AdresseModel->insert($requested_change);
$insert_adresse_id = $insertID;
$insert_adresse_id = $this->getDataOrTerminateWithError($insert_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error'));
if ($insert_adresse_id) {
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id, $personID);
}
}
//! DELETE
elseif (array_key_exists('delete', $requested_change) && $requested_change['delete']) {
$result = $this->AdresseModel->delete($adresse_id);
if (isError($result)) {
$this->terminateWithError(getError($result));
}
}
//! UPDATE
else {
$curadresse_res = $this->AdresseModel->load($adresse_id);
$curadresse = ($this->getDataOrTerminateWithError($curadresse_res))[0];
if($curadresse->heimatadresse)
{
$tmpadresse = array_merge((array) $curadresse, $requested_change);
unset($tmpadresse["adresse_id"]);
$tmpadresse['insertamum'] = "NOW()";
$tmpadresse['insertvon'] = getAuthUID();
$tmpadresse['person_id'] = $personID;
unset($tmpadresse["heimatadresse"]);
unset($tmpadresse["updateamum"]);
unset($tmpadresse["updatevon"]);
$tmpadresse_res = $this->AdresseModel->insert($tmpadresse);
$tmpadresse_id = $this->getDataOrTerminateWithError($tmpadresse_res, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error'));
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $tmpadresse_id, $personID);
}
else
{
$requested_change['updateamum'] = "NOW()";
$requested_change['updatevon'] = getAuthUID();
$update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change);
$update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error'));
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id, $personID);
}
}
return $insertID ?? null;
}
private function handleKontakt($requested_change, $personID)
{
$kontakt_id = $requested_change["kontakt_id"];
//? removes the kontakt_id because we don't want to update the kontakt_id in the database
unset($requested_change["kontakt_id"]);
//! ADD
if (array_key_exists('add', $requested_change) && $requested_change['add']) {
//? removes add flag
unset($requested_change['add']);
$requested_change['person_id'] = $personID;
$requested_change['insertamum'] = "NOW()";
$requested_change['insertvon'] = getAuthUID();
$insertID = $this->KontaktModel->insert($requested_change);
$insert_kontakt_id = $insertID;
$insert_kontakt_id = $this->getDataOrTerminateWithError($insert_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_insertKontakt_error'));
if ($insert_kontakt_id) {
$this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id, $requested_change['kontakttyp'], $personID);
}
}
//! DELETE
elseif (array_key_exists('delete', $requested_change) && $requested_change['delete']) {
$result = $this->KontaktModel->delete($kontakt_id);
if (isError($result)) {
$this->terminateWithError(getError($result));
}
}
//! UPDATE
else {
$requested_change['updateamum'] = "NOW()";
$requested_change['updatevon'] = getAuthUID();
$update_kontakt_id = $this->KontaktModel->update($kontakt_id, $requested_change);
$update_kontakt_id = $this->getDataOrTerminateWithError($update_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_updateKontakt_error'));
if ($update_kontakt_id) {
$this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id, $requested_change['kontakttyp'], $personID);
}
}
return isset($insertID) ? $insertID : null;
}
private function handleDupplicateZustellAdressen($zustellung, $adresse_id, $person_id)
{
if ($zustellung) {
$this->PersonModel->addSelect("public.tbl_adresse.adresse_id");
$this->PersonModel->addJoin("public.tbl_adresse", "public.tbl_adresse.person_id = public.tbl_person.person_id");
$zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $person_id, "zustelladresse" => TRUE]);
if (isError($zustellAdressenArray)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loadingZustellAdressen_error'));
}
$zustellAdressenArray = $this->getDataOrTerminateWithError($zustellAdressenArray);
if (count($zustellAdressenArray) > 0) {
$zustellAdressenArray = array_filter($zustellAdressenArray, function ($adresse) use ($adresse_id) {
return $adresse->adresse_id != $adresse_id;
});
$this->addMeta('bhzustelladressen', $zustellAdressenArray);
// remove the zustelladresse from all other zustelladressen
foreach ($zustellAdressenArray as $adresse) {
$this->AdresseModel->update($adresse->adresse_id, ["zustelladresse" => FALSE]);
}
}
}
}
private function handleDupplicateZustellKontakte($zustellung, $kontakt_id, $kontakttyp, $person_id)
{
if ($zustellung) {
$this->PersonModel->addSelect("public.tbl_kontakt.kontakt_id");
$this->PersonModel->addJoin("public.tbl_kontakt", "public.tbl_kontakt.person_id = public.tbl_person.person_id");
$zustellKontakteArray = $this->PersonModel->loadWhere([
"public.tbl_person.person_id" => $person_id,
"zustellung" => TRUE,
"kontakttyp" => $kontakttyp
]);
if (!isSuccess($zustellKontakteArray)) {
return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellkontakte_error'));
}
$zustellKontakteArray = hasData($zustellKontakteArray) ? getData($zustellKontakteArray) : null;
if ($zustellung && count($zustellKontakteArray) > 0) {
$zustellKontakteArray = array_filter($zustellKontakteArray, function ($kontakt) use ($kontakt_id) {
return $kontakt->kontakt_id != $kontakt_id;
});
foreach ($zustellKontakteArray as $kontakt) {
$this->KontaktModel->update($kontakt->kontakt_id, ["zustellung" => FALSE]);
}
}
}
}
}
@@ -0,0 +1,72 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
class RendererLoader extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'GetRenderers' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
$this->loglib->setConfigs(array(
'classIndex' => 5,
'functionIndex' => 5,
'lineIndex' => 4,
'dbLogType' => 'API', // required
'dbExecuteUser' => 'RESTful API'
));
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches Stundenplan and Moodle events together
* @access public
*
*/
public function GetRenderers(){
$renderer_paths = [];
Events::trigger(
'loadRenderers',
function & () use (&$renderer_paths)
{
return $renderer_paths;
}
);
$this->terminateWithSuccess($renderer_paths);
}
}
@@ -0,0 +1,60 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class RouteInfo extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'info' => self::PERM_LOGGED,
]);
$this->load->model('system/Webservicelog_model', 'WebservicelogModel');
}
public function info()
{
$payload = json_decode($this->input->raw_input_stream);
if (isset($payload->app) && isset($payload->path) && $this->isValidApp($payload->app) && $this->isValidPath($payload->path))
{
$this->WebservicelogModel->insert(array(
'webservicetyp_kurzbz' => 'content',
'beschreibung' => $payload->app,
'request_data' => $payload->path,
'execute_user' => getAuthUID(),
'execute_time' => 'NOW()'
));
}
$this->terminateWithSuccess(true);
}
protected function isValidApp($app)
{
return preg_match("/^[A-Za-z0-9\-_]+$/", $app);
}
protected function isValidPath($path)
{
return preg_match("/^[\/A-Za-z0-9_.\-~?%=&;]+$/", $path);
}
}
@@ -35,11 +35,12 @@ class Searchbar extends FHCAPI_Controller
{
// NOTE(chris): additional permission checks will be done in SearchBarLib
parent::__construct([
'search' => self::PERM_LOGGED
'search' => self::PERM_LOGGED,
'searchCis' => self::PERM_LOGGED,
'searchStv' => self::PERM_LOGGED
]);
// Load the library SearchBarLib
$this->load->library('SearchBarLib');
$this->load->model('system/Webservicelog_model', 'WebservicelogModel');
}
//------------------------------------------------------------------------------------------------------------------
@@ -50,6 +51,7 @@ class Searchbar extends FHCAPI_Controller
*/
public function search()
{
$this->load->library('SearchBarLib');
$this->load->library('form_validation');
// Checks if the searchstr and the types parameters are in the POSTed JSON
@@ -63,7 +65,64 @@ class Searchbar extends FHCAPI_Controller
$result = $this->searchbarlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM));
if (property_exists($result, 'error'))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess($result);
$this->addMeta('mode', 'simple');
$this->terminateWithSuccess($result->data);
}
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function searchCis()
{
return $this->searchAdvanced([ 'config' => 'searchcis' ]);
}
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function searchStv()
{
return $this->searchAdvanced([ 'config' => 'searchstv' ]);
}
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
private function searchAdvanced($config)
{
$this->load->library('SearchLib', $config);
$this->load->library('form_validation');
// Checks if the searchstr and the types parameters are in the POSTed JSON
$this->form_validation->set_rules(self::SEARCHSTR_PARAM, null, 'required');
$this->form_validation->set_rules(self::TYPES_PARAM . '[]', null, 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// Convert to json the result from searchlib->search
$result = $this->searchlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM));
$this->WebservicelogModel->insert(array(
'webservicetyp_kurzbz' => 'content',
'beschreibung' => $config['config'],
'request_data' => json_encode(array(
self::SEARCHSTR_PARAM => $this->input->post(self::SEARCHSTR_PARAM),
self::TYPES_PARAM => $this->input->post(self::TYPES_PARAM)
)),
'execute_user' => getAuthUID(),
'execute_time' => 'NOW()'
));
$data = $this->getDataOrTerminateWithError($result);
$this->addMeta('time', $result->meta['time']);
$this->addMeta('searchstring', $result->meta['searchstring']);
$this->addMeta('mode', 'advanced');
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,65 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Studgang extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getStudiengangInfo'=> self::PERM_LOGGED,
]);
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
// Loads phrases system
$this->loadPhrases([
'global'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStudiengangInfo(){
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
$isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter);
if($isMitarbeiter) {
$this->terminateWithSuccess(null);
}
// fetches the Studiengang Information which is used next to the news
$studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews();
$studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo);
$this->terminateWithSuccess($studiengangInfo);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
}
@@ -0,0 +1,329 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
class Studium extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getStudienAllSemester'=> self::PERM_LOGGED,
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
'getLvEvaluierungInfo'=> self::PERM_LOGGED,
]);
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('organisation/Studienordnung_model','StudienordnungModel');
$this->load->model('organisation/Studiensemester_model',"StudiensemesterModel");
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('codex/Orgform_model','OrgformModel');
$this->load->model('person/Person_model','PersonModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStudienAllSemester(){
$parameter_studiensemester = $this->input->get('studiensemester',true);
$parameter_studiengang = $this->input->get('studiengang',true);
$parameter_semester = $this->input->get('semester',true);
$parameter_studienplan = $this->input->get('studienplan',true);
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAktOrNextSemester()));
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
$student_studiengang = $studentLehrverband->studiengang_kz;
$student_semester = $studentLehrverband->semester;
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
if(!isset($parameter_studiensemester))
$parameter_studiensemester = $student_studiensemester;
if(!isset($parameter_studiengang))
$parameter_studiengang = $student_studiengang;
if(!isset($parameter_semester))
$parameter_semester = $student_semester;
if(!isset($parameter_studienplan))
$parameter_studienplan = $student_studienplan;
}
if(isset($parameter_studiensemester)){
$parameter_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $parameter_studiensemester])));
}
if(isset($parameter_studiengang)){
$parameter_studiengang = current($this->getDataOrTerminateWithError($this->StudiengangModel->loadWhere(["studiengang_kz" => $parameter_studiengang])));
}
if(isset($parameter_studienplan)){
$this->StudienplanModel->addJoin("lehre.tbl_studienordnung", "studienordnung_id");
$this->StudienplanModel->addJoin("lehre.tbl_studienplan_semester", "studienplan_id");
$parameter_studienplan = $this->StudienplanModel->loadWhere(["studienplan_id" => $parameter_studienplan, "aktiv" => TRUE]);
$parameter_studienplan = current($this->getDataOrTerminateWithError($parameter_studienplan));
}
// fetch studiensemester
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
}))){
$aktuelles_studiensemester = $parameter_studiensemester;
}
// fetch studiengaenge
$studiengaenge = $this->computeStudiengaenge($aktuelles_studiensemester->studiensemester_kurzbz);
$aktuelles_studiengang = current($studiengaenge);
if(!$aktuelles_studiengang){
$aktuelles_studiengang = null;
}
if(isset($parameter_studiengang) && !empty(array_filter( $studiengaenge,function($studiengang)use($parameter_studiengang){
return $studiengang->studiengang_kz == $parameter_studiengang->studiengang_kz;
}))){
$aktuelles_studiengang = $parameter_studiengang;
}
// compute semester and studienplaene
if($aktuelles_studiengang){
$studienplaene = $this->computeStudienplaene($aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz);
}else{
$studienplaene =[];
}
$semester = array_values(array_unique(array_map(function($item){
return $item->semester;
}, $studienplaene)));
$aktuelles_semester = current($semester);
if(!$aktuelles_semester){
$aktuelles_semester = null;
}
if(isset($parameter_semester) && in_array($parameter_semester, $semester)){
$aktuelles_semester = $parameter_semester;
}
$semester_studienplan = array_filter($studienplaene, function($item) use($aktuelles_semester){
return $item->semester == $aktuelles_semester;
});
// fetch current studienplan based on semester
$aktuelles_studienplan = current($semester_studienplan);
if(!$aktuelles_studienplan){
$aktuelles_studienplan = null;
}
if(isset($parameter_studienplan) && !empty(array_filter( $semester_studienplan, function($studienplan) use($parameter_studienplan){
return $studienplan->studienplan_id == $parameter_studienplan->studienplan_id;
}))){
$aktuelles_studienplan = $parameter_studienplan ;
}
// fetch studienplan lehrveranstaltungen
if($aktuelles_studienplan){
$lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester);
foreach($lehrveranstaltungen as $lehrv){
foreach($lehrv->lehrveranstaltungen as $lv){
$lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz);
$lv->lektoren = $lvLektoren;
}
}
$aktuelles_lehrveranstaltungen = $lehrveranstaltungen;
}else{
$aktuelles_lehrveranstaltungen = [];
}
// result object
$result = new stdClass();
$result->studienSemester = [];
$result->studienSemester["all"]= $allStudienSemester;
$result->studienSemester["preselected"]=$aktuelles_studiensemester;
$result->studiengang["all"]=$studiengaenge;
$result->studiengang["preselected"]=$aktuelles_studiengang;
$result->semester["all"] =$semester;
$result->semester["preselected"] =$aktuelles_semester;
$result->studienplan["all"]=$semester_studienplan;
$result->studienplan["preselected"]=$aktuelles_studienplan;
$result->lehrveranstaltungen=$aktuelles_lehrveranstaltungen;
$this->terminateWithSuccess($result);
}
public function getLvEvaluierungInfo($studiensemester_kurzbz, $lehrveranstaltung_id){
$result = [];
Events::trigger('lvEvaluierungsInfo', function & () use (&$result) {
return $result;
},$lehrveranstaltung_id, $studiensemester_kurzbz);
$this->terminateWithSuccess($result);
}
public function getStudiengaengeForStudienSemester($studiensemester){
$studiengaenge = $this->computeStudiengaenge($studiensemester);
$this->terminateWithSuccess($studiengaenge);
}
public function getStudienplaeneBySemester(){
$this->load->library('form_validation');
$this->form_validation->set_data($this->input->get());
$this->form_validation->set_rules('studiengang', 'studiengang', 'required');
$this->form_validation->set_rules('studiensemester', 'studiensemester', 'required');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$studiengang = $this->input->get('studiengang',true);
$studiensemester = $this->input->get('studiensemester',true);
$studienplaene = $this->computeStudienplaene($studiengang, $studiensemester);
$this->terminateWithSuccess($studienplaene);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
private function computeStudienplaene($studiengang, $studiensemester){
$studienplaene = $this->StudienplanModel->getStudienplaeneBySemester($studiengang, $studiensemester);
$studienplaene = $this->getDataOrTerminateWithError($studienplaene);
$studienplaene = array_map(function($studienplan){
$orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz])));
$studienplan->orgform_bezeichnung = $orgform->bezeichnung;
return $studienplan;
},$studienplaene);
return $studienplaene;
}
private function computeStudienplanLehrveranstaltungen($studienplan_id, $semester){
/*
SELECT tbl_lehrveranstaltung.*,
tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id,
tbl_studienplan_lehrveranstaltung.semester as stpllv_semester,
tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht,
tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator,
tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent,
tbl_studienplan_lehrveranstaltung.sort stpllv_sort,
tbl_studienplan_lehrveranstaltung.curriculum,
tbl_studienplan_lehrveranstaltung.export,
tbl_studienplan_lehrveranstaltung.genehmigung
FROM lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_studienplan_lehrveranstaltung
USING(lehrveranstaltung_id)
WHERE tbl_studienplan_lehrveranstaltung.studienplan_id=" . $this->db_add_param($studienplan_id, FHC_INTEGER);
if (defined("CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN") && CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN)
$qry .= " AND tbl_lehrveranstaltung.lehrtyp_kurzbz != 'modul'";
if (!is_null($semester))
{
$qry.=" AND tbl_studienplan_lehrveranstaltung.semester=" . $this->db_add_param($semester, FHC_INTEGER);
} */
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$query = "
SELECT tbl_lehrveranstaltung.*,
tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id,
tbl_studienplan_lehrveranstaltung.semester as stpllv_semester,
tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht,
tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator,
tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent,
tbl_studienplan_lehrveranstaltung.sort stpllv_sort,
tbl_studienplan_lehrveranstaltung.curriculum,
tbl_studienplan_lehrveranstaltung.export,
tbl_studienplan_lehrveranstaltung.genehmigung
FROM lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_studienplan_lehrveranstaltung
USING(lehrveranstaltung_id)
WHERE
tbl_lehrveranstaltung.lehre = true AND
tbl_studienplan_lehrveranstaltung.studienplan_id=? AND tbl_studienplan_lehrveranstaltung.semester=?";
if (defined("CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN") && CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN)
$query .= " AND tbl_lehrveranstaltung.lehrtyp_kurzbz != 'modul'";
$lehrveranstaltungen = $this->LehrveranstaltungModel->execReadOnlyQuery($query,[$studienplan_id, $semester]);
$lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen);
usort($lehrveranstaltungen, function($a, $b){
if($a->lehrtyp_kurzbz == "modul"){
return -1;
}
else if($b->lehrtyp_kurzbz == "modul"){
return 1;
}
return 0;
});
$lehrveranstaltungen= array_reduce($lehrveranstaltungen,function($carry, $lehrv){
if($lehrv->lehrtyp_kurzbz == "modul"){
$lehrv->lehrveranstaltungen = [];
array_push($carry, $lehrv);
}
else{
$parent =array_filter($carry, function($item)use($lehrv){
return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent;
});
$parent = current($parent);
if($parent){
$parent->lehrveranstaltungen[] = $lehrv;
}
}
return $carry;
}, []);
return $lehrveranstaltungen;
}
private function computeStudiengaenge($studiensemester){
$studiengang_studiensemester_result = $this->StudiengangModel->getStudiengaengeByStudiensemester($studiensemester);
$studiengang_studiensemester_result = $this->getDataOrTerminateWithError($studiengang_studiensemester_result);
return $studiengang_studiensemester_result;
}
private function getStudienPlanFromPrestudentStatus($person_id){
$studienplan_id = current($this->getDataOrTerminateWithError($this->PrestudentstatusModel->getLastStatusPerson($person_id)))->studienplan_id;
$studienplan =current($this->getDataOrTerminateWithError($this->StudienplanModel->loadWhere(["studienplan_id"=>$studienplan_id])));
return $studienplan;
}
private function computeLektorenFromLehrveranstaltung($lehreinheit_id, $semester, $studiengang, $studiensemester){
$this->load->library('StundenplanLib');
$lektoren = $this->stundenplanlib->getLektorenFromLehrveranstaltung($lehreinheit_id,$semester, $studiengang,$studiensemester);
$lektoren = $this->getDataOrTerminateWithError($lektoren) ?? [];
$lektoren = array_map(function($lektor){
return ["name"=>$this->getDataOrTerminateWithError($this->PersonModel->getFullName($lektor)), "email"=>$lektor."@".DOMAIN];
},$lektoren);
return $lektoren;
}
}
@@ -60,7 +60,11 @@ class BetriebsmittelP extends FHCAPI_Controller
public function getAllBetriebsmittel($type_id, $id)
{
$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($id, $type_id);
$betriebsmitteltypes = null;
if ($this->input->get('betriebsmitteltypes') !== null && !isEmptyArray($this->input->get('betriebsmitteltypes')))
$betriebsmitteltypes = $this->input->get('betriebsmitteltypes');
$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($id, $type_id, $betriebsmitteltypes);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
@@ -75,8 +79,9 @@ class BetriebsmittelP extends FHCAPI_Controller
'required' => $this->p->t('ui', 'error_fieldRequired')
]);
$this->form_validation->set_rules('kaution', 'Kaution', 'numeric|less_than_equal_to[9999.99]', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric')
$this->form_validation->set_rules('kaution', 'Kaution', 'callback_valid_number|callback_not_less_than_equal', [
'valid_number' => $this->p->t('ui', 'error_fieldNoValidNumber'),
'not_less_than_equal' => $this->p->t('ui', 'error_fieldLessThan1000'),
]);
$this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required|is_valid_date', [
@@ -158,6 +163,7 @@ class BetriebsmittelP extends FHCAPI_Controller
], [
'uid_in_person' => $this->p->t('person', 'error_uidNotInPerson')
]);
$this->validateNewOrUpdate();
$betriebsmitteltyp = $this->input->post('betriebsmitteltyp');
@@ -167,6 +173,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$betriebsmittel_id = $this->input->post('betriebsmittel_id');
$anmerkung = $this->input->post('anmerkung');
$kaution = $this->input->post('kaution');
if($kaution) $kaution = str_replace(',', '.', $kaution);
$ausgegebenam = $this->input->post('ausgegebenam');
$retouram = $this->input->post('retouram');
$uid = $this->input->post('uid');
@@ -250,6 +257,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$betriebsmittel_id = $this->input->post('betriebsmittel_id');
$anmerkung = $this->input->post('anmerkung');
$kaution = $this->input->post('kaution');
if($kaution) $kaution = str_replace(',', '.', $kaution);
$ausgegebenam = $this->input->post('ausgegebenam');
$retouram = $this->input->post('retouram');
@@ -342,7 +350,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(current(getData($result)));
return $this->terminateWithSuccess(current(getData($result)));
}
public function deleteBetriebsmittel($betriebsmittelperson_id)
@@ -358,7 +366,7 @@ class BetriebsmittelP extends FHCAPI_Controller
if (!hasData($result)) {
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(current(getData($result)));
$this->terminateWithSuccess(current(getData($result)));
}
public function getTypenBetriebsmittel()
@@ -366,6 +374,12 @@ class BetriebsmittelP extends FHCAPI_Controller
$this->load->model('ressource/Betriebsmitteltyp_model', 'BetriebsmitteltypModel');
$this->BetriebsmitteltypModel->addOrder('beschreibung', 'ASC');
if ($this->input->get('betriebsmitteltypes') !== null && !isEmptyArray($this->input->get('betriebsmitteltypes')))
{
$this->BetriebsmitteltypModel->db->where_in('betriebsmitteltyp', $this->input->get('betriebsmitteltypes'));
}
$result = $this->BetriebsmitteltypModel->load(); // load All
if (isError($result)) {
@@ -382,6 +396,26 @@ class BetriebsmittelP extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
public function valid_number($number)
{
if(is_null($number)) return true;
$number = str_replace(',', '.', $number);
if (!is_numeric($number))
{
return false;
}
return true;
}
public function not_less_than_equal($number)
{
$number = str_replace(',', '.', $number);
if ($number < 1000)
return true;
return false;
}
}
@@ -0,0 +1,121 @@
<?php
/**
* Copyright (C) 2026 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about addresses
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Board extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'list' => 'dashboard/admin:r',
'create' => 'dashboard/admin:rw',
'update' => 'dashboard/admin:rw',
'delete' => 'dashboard/admin:rw'
]);
// Models
$this->load->model('dashboard/Dashboard_model', 'DashboardModel');
}
public function list()
{
$result = $this->DashboardModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
public function create()
{
$dashboard_kurzbz = $this->input->post('dashboard_kurzbz');
$result = $this->DashboardModel->insert([
'dashboard_kurzbz' => $dashboard_kurzbz
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function update()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('dashboard_id', 'Dashboard ID', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$dashboard_id = $this->input->post('dashboard_id');
$dashboard_kurzbz = $this->input->post('dashboard_kurzbz');
$beschreibung = $this->input->post('beschreibung');
$result = $this->DashboardModel->update([
'dashboard_id' => $dashboard_id
], [
'dashboard_kurzbz' => $dashboard_kurzbz,
'beschreibung' => $beschreibung
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
public function delete()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('dashboard_id', 'Dashboard ID', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$dashboard_id = $this->input->post('dashboard_id');
//delete all presets
$this->load->model('dashboard/Dashboard_Preset_model', 'DashboardPresetModel');
$result = $this->DashboardPresetModel->delete([
'dashboard_id' => $dashboard_id
]);
$this->getDataOrTerminateWithError($result);
//delete all widgets
$this->load->model('dashboard/Dashboard_Widget_model', 'DashboardWidgetModel');
$result = $this->DashboardWidgetModel->delete([
'dashboard_id' => $dashboard_id
]);
$this->getDataOrTerminateWithError($result);
$result = $this->DashboardModel->delete($dashboard_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
}
@@ -0,0 +1,200 @@
<?php
/**
* Copyright (C) 2026 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about addresses
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Preset extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'list' => 'dashboard/admin:r',
'getBatch' => 'dashboard/admin:r',
'addWidget' => 'dashboard/admin:rw',
'removeWidget' => 'dashboard/admin:rw'
]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
// Libraries
$this->load->library('dashboard/DashboardLib');
// Models
$this->load->model('ressource/Funktion_model', 'FunktionModel');
}
public function list($dashboard_kurzbz)
{
$sql = "
WITH
dashboard_presets AS (
SELECT
*
FROM
dashboard.tbl_dashboard_preset dp
JOIN
dashboard.tbl_dashboard d ON d.dashboard_id = dp.dashboard_id
WHERE
d.dashboard_kurzbz = {$this->db->escape($dashboard_kurzbz)}
),
general AS (
SELECT
'general' AS funktion_kurzbz,
'Allgemein' AS beschreibung
)
(
SELECT
f.funktion_kurzbz,
f.beschreibung,
COUNT(p.preset_id) AS has_preset
FROM
general f
LEFT JOIN
dashboard_presets p ON p.funktion_kurzbz IS NULL
GROUP BY
f.funktion_kurzbz, f.beschreibung
)
UNION ALL
(
SELECT
f.funktion_kurzbz,
f.beschreibung,
COUNT(p.preset_id) AS has_preset
FROM
public.tbl_funktion f
LEFT JOIN
dashboard_presets p ON p.funktion_kurzbz = f.funktion_kurzbz
GROUP BY
f.funktion_kurzbz, f.beschreibung
ORDER BY
f.beschreibung ASC
)
";
$result = $this->FunktionModel->execReadOnlyQuery($sql);
$funktionen = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($funktionen);
}
public function getBatch()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('db', 'Dashboard', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$db = $this->input->post('db');
$funktionen = $this->input->post('funktionen') ?: [];
$result = [];
foreach ($funktionen as $funktion) {
$conf = $this->dashboardlib->getPreset($db, $funktion);
if ($conf) {
$preset = json_decode($conf->preset, true);
if (!isset($preset[$funktion]) || !isset($preset[$funktion]['widgets']))
$result[$funktion] = [];
else
$result[$funktion] = $preset[$funktion]['widgets'];
} else {
$result[$funktion] = [];
}
}
return $this->terminateWithSuccess($result);
}
public function addWidget()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('dashboard', 'Dashboard', 'required');
$this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required');
$this->form_validation->set_rules('widget[widget]', 'Widget', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$dashboard_kurzbz = $this->input->post('dashboard');
$funktion_kurzbz = $this->input->post('funktion_kurzbz');
$widget = $this->input->post('widget');
if (!isset($widget['widgetid']))
$widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
$preset = $this->dashboardlib->getPresetOrCreateEmptyPreset($dashboard_kurzbz, $funktion_kurzbz);
$preset_decoded = json_decode($preset->preset, true);
$this->dashboardlib->addWidgetsToWidgets($preset_decoded, $dashboard_kurzbz, $funktion_kurzbz, [$widget]);
$preset->preset = json_encode($preset_decoded);
$result = $this->dashboardlib->insertOrUpdatePreset($preset);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($widget['widgetid']);
}
public function removeWidget()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('db', 'Dashboard', 'required');
$this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required');
$this->form_validation->set_rules('widgetid', 'Widget', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$dashboard_kurzbz = $this->input->post('db');
$funktion_kurzbz = $this->input->post('funktion_kurzbz');
$widgetid = $this->input->post('widgetid');
$preset = $this->dashboardlib->getPreset($dashboard_kurzbz, $funktion_kurzbz);
if (!$preset)
show_404();
$preset_decoded = json_decode($preset->preset, true);
if (!$this->dashboardlib->removeWidgetFromWidgets($preset_decoded, $funktion_kurzbz, $widgetid))
show_404();
$preset->preset = json_encode($preset_decoded);
$result = $this->dashboardlib->insertOrUpdatePreset($preset);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(array('msg' => $this->p->t('dashboard', 'success_savePreset')));
}
}
@@ -0,0 +1,159 @@
<?php
/**
* Copyright (C) 2026 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about the users dashboard
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class User extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'get' => 'dashboard/benutzer:r',
'addWidget' => 'dashboard/benutzer:rw',
'removeWidget' => 'dashboard/benutzer:rw'
]);
// Libraries
$this->load->library('dashboard/DashboardLib');
// Models
$this->load->model('ressource/Funktion_model', 'FunktionModel');
}
public function get($dashboard_kurzbz)
{
$dashboard = $this->dashboardlib->getDashboardByKurzbz($dashboard_kurzbz);
if (!$dashboard)
show_404();
$uid = $this->authlib->getAuthObj()->username;
/*$mergedconfig = $this->dashboardlib->getMergedConfig($dashboard->dashboard_id, $uid);
$this->terminateWithSuccess([
'general' => call_user_func_array(
'array_merge_recursive',
$mergedconfig
)
]);*/
$defaultconfig = $this->dashboardlib->getDefaultConfig($dashboard->dashboard_id);
$userconfig = $this->dashboardlib->getUserConfig($dashboard->dashboard_id, $uid);
$defaultconfig_squashed = $defaultconfig ? call_user_func_array('array_replace_recursive', $defaultconfig) : [];
$userconfig_squashed = $userconfig ? call_user_func_array('array_replace_recursive', $userconfig) : [];
$mergedconfig = array_replace_recursive($defaultconfig_squashed, $userconfig_squashed);
$this->terminateWithSuccess([
DashboardLib::SECTION_IF_FUNKTION_KURZBZ_IS_NULL => $mergedconfig
]);
}
public function addWidget()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('dashboard', 'Dashboard', 'required');
$this->form_validation->set_rules('widget[widget]', 'Widget', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$widget = $this->input->post('widget');
$dashboard_kurzbz = $this->input->post('dashboard');
$uid = $this->authlib->getAuthObj()->username;
if (!isset($widget['widgetid']))
$widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
$override = $this->dashboardlib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid);
$override_decoded = json_decode($override->override, true);
if (!isset($override_decoded['general']) || !is_array($override_decoded['general']))
$override_decoded['general'] = [];
if (!isset($override_decoded['general']['widgets']))
$override_decoded['general']['widgets'] = [];
$override_decoded['general']['widgets'][$widget['widgetid']] = $widget;
// NOTE(chris): remove doubles in other funktionen
foreach ($override_decoded as $funktion => $array) {
if ($funktion == 'general')
continue;
if (isset($array['widgets']) && isset($array['widgets'][$widget['widgetid']]))
unset($override_decoded[$funktion]['widgets'][$widget['widgetid']]);
}
$override->override = json_encode($override_decoded);
$result = $this->dashboardlib->insertOrUpdateOverride($override);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($widget['widgetid']);
}
public function removeWidget()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('dashboard', 'Dashboard', 'required');
$this->form_validation->set_rules('widget', 'Widget', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$widget_id = $this->input->post('widget');
$dashboard_kurzbz = $this->input->post('dashboard');
$uid = $this->authlib->getAuthObj()->username;
$override = $this->dashboardlib->getOverride($dashboard_kurzbz, $uid);
if (!$override)
show_404();
$override_decoded = json_decode($override->override, true);
foreach (array_keys($override_decoded) as $k) {
if (!isset($override_decoded[$k]["widgets"])) {
unset($override_decoded[$k]);
continue;
}
if (isset($override_decoded[$k]["widgets"][$widget_id])) {
unset($override_decoded[$k]["widgets"][$widget_id]);
}
if (!$override_decoded[$k]["widgets"]) {
unset($override_decoded[$k]);
}
}
$override->override = json_encode($override_decoded);
$result = $this->dashboardlib->insertOrUpdateOverride($override);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess();
}
}
@@ -0,0 +1,137 @@
<?php
/**
* Copyright (C) 2026 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 <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about the users dashboard
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Widget extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'get' => ['dashboard/benutzer:r', 'dashboard/admin:r'],
'list' => 'dashboard/admin:r',
'listAllowed' => ['dashboard/benutzer:rw', 'dashboard/admin:r'],
'setAllowed' => 'dashboard/admin:rw'
]);
// Libraries
$this->load->library('dashboard/DashboardLib');
// Models
$this->load->model('dashboard/Widget_model', 'WidgetModel');
}
public function get($id)
{
$result = $this->WidgetModel->load($id);
$widget = $this->getDataOrTerminateWithError($result);
if (!$widget)
return $this->terminateWithSuccess([
"widget_id" => 0,
"widget_kurzbz" => "notfound",
"arguments" => [
"className" => 'alert-danger',
"title" => 'Widget Not Found',
"msg" => 'The widget with the id ' . $id . ' could not be found'
],
"setup" => [
"name" => 'Widget Not Found',
"file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'),
"width" => 1,
"height" => 1
]
]);
$widget = current($widget);
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
$this->terminateWithSuccess($widget);
}
public function list($dashboard)
{
$result = $this->WidgetModel->getWithAllowedForDashboard($dashboard);
$widgets = $this->getDataOrTerminateWithError($result);
$widgets = array_map(function ($widget) {
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $widget;
}, $widgets);
$this->terminateWithSuccess($widgets);
}
public function listAllowed($dashboard)
{
$result = $this->WidgetModel->getForDashboard($dashboard);
$widgets = $this->getDataOrTerminateWithError($result);
$widgets = array_map(function ($widget) {
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $widget;
}, $widgets);
$this->terminateWithSuccess($widgets);
}
public function setAllowed()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('dashboard_id', 'Dashboard', 'required');
$this->form_validation->set_rules('widget_id', 'Widget', 'required');
$this->form_validation->set_rules('allowed', 'Allowed', 'is_bool');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$data = [
'dashboard_id' => $this->input->post('dashboard_id'),
'widget_id' => $this->input->post('widget_id')
];
$this->load->model('dashboard/Dashboard_Widget_model', 'DashboardWidgetModel');
if ($this->input->post('allowed'))
$result = $this->DashboardWidgetModel->insert($data);
else
$result = $this->DashboardWidgetModel->delete($data);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,53 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Detailheader extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getHeader' => ['vertrag/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
]);
}
public function getHeader($person_id)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getHeader($person_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getPersonAbteilung($mitarbeiter_uid)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getLeitungOrg($oekurzbz)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
}
@@ -0,0 +1,237 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Foto extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'uploadFoto' => ['admin:r', 'assistenz:r'],
'deleteFoto' => ['admin:r', 'assistenz:r'],
]);
//Load Models and Libraries
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model("crm/Akte_model", "AkteModel");
$this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel');
$this->loadPhrases([
'ui',
'header'
]);
}
public function uploadFoto($person_id)
{
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
}
$data = json_decode(file_get_contents("php://input"), true);
if (!empty($data['image']))
{
$base64 = $data['image'];
$resizedImage1 = $this->_resize($base64, 827, 1063);
if (is_null($resizedImage1))
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
$akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil'));
$akteUpdateData = array(
'dokument_kurzbz' => 'Lichtbil',
'person_id' => $person_id,
'inhalt' => $resizedImage1,
'mimetype' => 'image/jpg',
'erstelltam' => date('c'),
'gedruckt' => false,
'titel' => 'Lichtbild_' . $person_id . '.jpg',
'bezeichnung' => 'Lichtbild gross',
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
);
if (hasData($akte)) {
$akte_id = getData($akte)[0]->akte_id;
$akteUpdateData['updateamum'] = date('c');
$akteUpdateData['updatevon'] = getAuthUID();
$akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData);
} else {
$akteResult = $this->AkteModel->insert($akteUpdateData);
}
if (isError($akteResult)) {
return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL);
}
$resizedImage2 = $this->_resize($base64, 101, 130);
if (is_null($resizedImage2))
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
$result = $this->_updateFoto($person_id, $resizedImage2);
if (!isError($result)) {
$this->FotostatusPersonModel->insert(array(
'person_id' => $person_id,
'fotostatus_kurzbz' => 'hochgeladen',
'datum' => date('Y-m-d'),
'updateamum' => date('c'),
'updatevon' => getAuthUID(),
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
));
return $this->terminateWithSuccess($base64);
}
}
else
{
$this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL);
}
}
public function deleteFoto($person_id)
{
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
}
$result = $this->_deleteFoto($person_id);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess($result);
}
private function _resize($imageData, $maxwidth, $maxheight, $quality = 90)
{
$meta = getimagesize($imageData);
if (!$meta)
{
return null;
}
$src_width = $meta[0];
$src_height = $meta[1];
$mime = $meta['mime'];
switch ($mime) {
case 'image/jpeg':
case 'image/jpg':
$imagecreated = imagecreatefromjpeg($imageData);
break;
case 'image/png':
$imagecreated = imagecreatefrompng($imageData);
break;
case 'image/gif':
$imagecreated = imagecreatefromgif($imageData);
break;
default:
return null;
}
if (!$imagecreated)
{
return null;
}
$src_aspect_ratio = $src_width / $src_height;
$thu_aspect_ratio = $maxwidth / $maxheight;
if ($src_width <= $maxwidth && $src_height <= $maxheight)
{
$thu_width = $src_width;
$thu_height = $src_height;
}
elseif ($thu_aspect_ratio > $src_aspect_ratio)
{
$thu_width = (int) ($maxheight * $src_aspect_ratio);
$thu_height = $maxheight;
}
else
{
$thu_width = $maxwidth;
$thu_height = (int) ($maxwidth / $src_aspect_ratio);
}
$imageScaled = imagecreatetruecolor($thu_width, $thu_height);
if ($mime === 'image/png')
{
$background = imagecolorallocate($imageScaled , 0, 0, 0);
imagecolortransparent($imageScaled, $background);
imagealphablending($imageScaled, false);
imagesavealpha($imageScaled, true);
}
imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height);
if ($mime === "image/gif")
{
$background = imagecolorallocate($imageScaled, 0, 0, 0);
imagecolortransparent($imageScaled, $background);
}
if (!empty($imageScaled))
{
ob_start();
if ($mime == 'image/png')
imagepng($imageScaled, NULL);
else if ($mime === 'image/gif')
imagegif($imageScaled, NULL);
else
imagejpeg($imageScaled, NULL, $quality);
$resizedImageData = ob_get_contents();
ob_end_clean();
@imagedestroy($imagecreated);
@imagedestroy($imageScaled);
if (!empty($resizedImageData))
{
return base64_encode($resizedImageData);
}
return null;
}
return null;
}
private function _updateFoto($person_id, $foto)
{
$personJson['foto'] = $foto;
$result = $this->PersonModel->update($person_id, $personJson);
if (isError($result))
{
return error($result->msg, EXIT_ERROR);
}
return $result;
}
private function _deleteFoto($person_id)
{
$personJson['foto'] = null;
$result = $this->PersonModel->update($person_id, $personJson);
if (isError($result))
{
return error($result->msg, EXIT_ERROR);
}
return $result;
}
}
@@ -0,0 +1,328 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Funktionen extends FHCAPI_Controller
{
public function __construct()
{
//TODO(Manu) check permissions
parent::__construct(array(
'getAllFunctions' => ['admin:r', 'assistenz:r'],
'getAllUserFunctions' => ['admin:r', 'assistenz:r'],
'getOrgHeads' => ['admin:r', 'assistenz:r'],
'getOrgetsForCompany' => ['admin:r', 'assistenz:r'],
'getAllOrgUnits' => ['admin:r', 'assistenz:r'],
'loadFunction' => ['admin:r', 'assistenz:r'],
'insertFunction' => ['admin:rw', 'assistenz:rw'],
'updateFunction' => ['admin:rw', 'assistenz:rw'],
'deleteFunction' => ['admin:rw', 'assistenz:rw'],
)
);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
]);
// Load models
$this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model', 'ApiModel');
$this->load->model('ressource/Funktion_model', 'FunktionModel');
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
}
public function getAllFunctions()
{
$this->FunktionModel->addSelect("funktion_kurzbz");
$this->FunktionModel->addSelect("beschreibung");
$this->FunktionModel->addSelect("aktiv");
$this->FunktionModel->addSelect("beschreibung AS label");
$this->FunktionModel->addOrder("beschreibung");
$result = $this->FunktionModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getOrgHeads()
{
$result = $this->OrganisationseinheitModel->getHeads();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getAllUserFunctions($uid)
{
if(!$uid)
{
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'UID']), self::ERROR_TYPE_GENERAL);
}
$sql = "
SELECT
dv.dienstverhaeltnis_id,
un.bezeichnung || ' (' || TO_CHAR(dv.von, 'DD.MM.YYYY') || CASE WHEN dv.bis IS NOT NULL THEN ' - '
|| TO_CHAR(dv.bis, 'DD.MM.YYYY') ELSE '' END || ')' AS dienstverhaeltnis_unternehmen ,
'[' || oet.bezeichnung || '] ' || oe.bezeichnung AS funktion_oebezeichnung,
f.beschreibung AS funktion_beschreibung,
bf.*,
fb.bezeichnung AS fachbereich_bezeichnung,
CASE
WHEN
bf.datum_bis IS NOT NULL AND bf.datum_bis::date < now()::date
THEN
false
ELSE
true
END aktiv
FROM
public.tbl_benutzerfunktion bf
JOIN
public.tbl_organisationseinheit oe ON oe.oe_kurzbz = bf.oe_kurzbz
JOIN
public.tbl_organisationseinheittyp oet ON oe.organisationseinheittyp_kurzbz = oet.organisationseinheittyp_kurzbz
JOIN
public.tbl_funktion f ON f.funktion_kurzbz = bf.funktion_kurzbz
LEFT JOIN
hr.tbl_vertragsbestandteil_funktion vf ON vf.benutzerfunktion_id = bf.benutzerfunktion_id
LEFT JOIN
hr.tbl_vertragsbestandteil v ON vf.vertragsbestandteil_id = v.vertragsbestandteil_id
LEFT JOIN
hr.tbl_dienstverhaeltnis dv ON v.dienstverhaeltnis_id = dv.dienstverhaeltnis_id
LEFT JOIN
public.tbl_organisationseinheit un ON dv.oe_kurzbz = un.oe_kurzbz
LEFT JOIN
public.tbl_fachbereich fb ON fb.fachbereich_kurzbz = bf.fachbereich_kurzbz
WHERE
bf.uid = ?
ORDER BY
bf.datum_von, bf.datum_von ASC";
$benutzerfunktionen = $this->BenutzerfunktionModel->execReadOnlyQuery($sql, array($uid));
$data = $this->getDataOrTerminateWithError($benutzerfunktionen);
$this->terminateWithSuccess($data);
}
/*
* returns list of all organisation units
* as key value list to be used in select or autocomplete
*/
public function getAllOrgUnits()
{
$sql = "
SELECT
oe.oe_kurzbz, oe.aktiv,
'[' || COALESCE(oet.bezeichnung, oet.organisationseinheittyp_kurzbz) ||
'] ' || COALESCE(oe.bezeichnung, oe.oe_kurzbz) AS label
FROM public.tbl_organisationseinheit oe
JOIN public.tbl_organisationseinheittyp oet ON oe.organisationseinheittyp_kurzbz = oet.organisationseinheittyp_kurzbz
ORDER BY oet.bezeichnung ASC, oe.bezeichnung ASC";
$result = $this->OrganisationseinheitModel->execReadOnlyQuery($sql);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/*
* return list of child orgets for a given company orget_kurzbz
* as key value list to be used in select or autocomplete
*/
public function getOrgetsForCompany($companyOrgetkurzbz = null)
{
$sql = "
SELECT
oe.oe_kurzbz, oe.aktiv,
'[' || COALESCE(oet.bezeichnung, oet.organisationseinheittyp_kurzbz) ||
'] ' || COALESCE(oe.bezeichnung, oe.oe_kurzbz) AS label
FROM (
WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz) as
(
SELECT oe_kurzbz, oe_parent_kurzbz FROM public.tbl_organisationseinheit
WHERE oe_kurzbz=?
UNION ALL
SELECT o.oe_kurzbz, o.oe_parent_kurzbz FROM public.tbl_organisationseinheit o, oes
WHERE o.oe_parent_kurzbz=oes.oe_kurzbz
)
SELECT oe_kurzbz
FROM oes
GROUP BY oe_kurzbz
) c
JOIN public.tbl_organisationseinheit oe ON oe.oe_kurzbz = c.oe_kurzbz
JOIN public.tbl_organisationseinheittyp oet ON oe.organisationseinheittyp_kurzbz = oet.organisationseinheittyp_kurzbz
ORDER BY oet.bezeichnung ASC, oe.bezeichnung ASC";
$childorgets = $this->OrganisationseinheitModel->execReadOnlyQuery($sql, array($companyOrgetkurzbz));
$data = $this->getDataOrTerminateWithError($childorgets);
$this->terminateWithSuccess($data);
}
public function loadFunction($benutzerfunktion_id)
{
$this->BenutzerfunktionModel->addSelect("*");
$result = $this->BenutzerfunktionModel->loadWhere(
array('benutzerfunktion_id' => $benutzerfunktion_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function insertFunction()
{
$this->load->library('form_validation');
$authUID = getAuthUID();
$uid = $this->input->post('uid');
if(!$uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$datum_von = $formData['datum_von'] ?? null;
$datum_bis = $formData['datum_bis'] ?? null;
$formData['oe_kurzbz'] = is_array($formData['oe_kurzbz']) ? $formData['oe_kurzbz']['oe_kurzbz'] : $formData['oe_kurzbz'];
$formData['funktion_kurzbz'] = is_array($formData['funktion_kurzbz'])
? $formData['funktion_kurzbz']['funktion_kurzbz']
: $formData['funktion_kurzbz'];
$bezeichnung = $formData['bezeichnung'] ?? null;
$wochenstunden = $formData['wochenstunden'] ?? null;
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('datum_von', 'VonDatum', 'required|is_valid_date', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'VonDatum']),
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
]);
$this->form_validation->set_rules('datum_bis', 'BisDatum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'BisDatum'])
]);
$this->form_validation->set_rules('oe_kurzbz', 'Organisationseinheit', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Organisationseinheit'])
]);
$this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Funktion'])
]);
$this->form_validation->set_rules('wochenstunden', 'Wochenstunden', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Wochenstunden'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->BenutzerfunktionModel->insert([
'uid' => $uid,
'datum_von' => $datum_von,
'datum_bis' => $datum_bis ,
'oe_kurzbz' => $formData['oe_kurzbz'],
'funktion_kurzbz' => $formData['funktion_kurzbz'],
'bezeichnung' => $bezeichnung,
'wochenstunden' => $wochenstunden,
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function updateFunction()
{
$this->load->library('form_validation');
$authUID = getAuthUID();
$uid = $this->input->post('uid');
if(!$uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'UID']), self::ERROR_TYPE_GENERAL);
}
$benutzerfunktion_id = $this->input->post('benutzerfunktion_id');
if(!$benutzerfunktion_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Benutzerfunktion ID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$datum_von = $formData['datum_von'] ?? null;
$datum_bis = $formData['datum_bis'] ?? null;
$formData['oe_kurzbz'] = is_array($formData['oe_kurzbz']) ? $formData['oe_kurzbz']['oe_kurzbz'] : $formData['oe_kurzbz'];
$formData['funktion_kurzbz'] = is_array($formData['funktion_kurzbz'])
? $formData['funktion_kurzbz']['funktion_kurzbz']
: $formData['funktion_kurzbz'];
$bezeichnung = $formData['bezeichnung'] ?? null;
$wochenstunden = $formData['wochenstunden'] ?? null;
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('datum_von', 'VonDatum', 'required|is_valid_date', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'VonDatum']),
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
]);
$this->form_validation->set_rules('datum_bis', 'BisDatum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'BisDatum'])
]);
$this->form_validation->set_rules('oe_kurzbz', 'Organisationseinheit', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Organisationseinheit'])
]);
$this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Funktion'])
]);
$this->form_validation->set_rules('wochenstunden', 'Wochenstunden', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Wochenstunden'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->BenutzerfunktionModel->update(
[
'benutzerfunktion_id' => $benutzerfunktion_id,
],
[
'uid' => $uid,
'datum_von' => $datum_von,
'datum_bis' => $datum_bis ,
'oe_kurzbz' => $formData['oe_kurzbz'],
'funktion_kurzbz' => $formData['funktion_kurzbz'],
'bezeichnung' => $bezeichnung,
'wochenstunden' => $wochenstunden,
'updateamum' => date('c'),
'updatevon' => $authUID,
]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function deleteFunction($benutzerfunktion_id)
{
$result = $this->BenutzerfunktionModel->delete(
array('benutzerfunktion_id' => $benutzerfunktion_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,110 @@
<?php
/**
* Copyright (C) 2025 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class DirektGruppe extends FHCAPI_Controller
{
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->loadPhrases([
'ui'
]);
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
}
public function add()
{
$uid = $this->input->post('uid');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$this->checkPermission($lehreinheit_id, $uid);
$result = $this->_ci->LehreinheitgruppeModel->direktUserAdd($uid, $lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function delete()
{
$uid = $this->input->post('uid');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$this->checkPermission($lehreinheit_id, $uid);
$result = $this->_ci->LehreinheitgruppeModel->direktUserDelete($uid, $lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function getByLehreinheit($lehreinheit_id = null)
{
$this->checkPermission($lehreinheit_id);
$gruppen = $this->_ci->LehreinheitgruppeModel->getDirectGroup($lehreinheit_id);
$this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : array());
}
private function checkPermission($lehreinheit_id, $uid = false)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if ($uid)
{
$benuzuer_result = $this->_ci->BenutzerModel->load(array($uid));
if (!hasData($benuzuer_result) || isError($benuzuer_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
}
}
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Favorites extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'index' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
]);
// Load models
$this->load->model('system/Variable_model', 'VariableModel');
}
public function index()
{
$result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
$this->terminateWithSuccess(null);
else
$this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null);
}
public function set()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('favorites', 'Favorites', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$favorites = $this->input->post('favorites');
$result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
}
@@ -0,0 +1,250 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Gruppe extends FHCAPI_Controller
{
private $_uid;
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'],
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
'getAllSearch' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui',
'lehre'
)
);
$this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel');
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->model('person/Person_model', 'PersonModel');
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
}
public function delete()
{
$lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id');
$lehreinheit_id = $this->input->post('lehreinheit_id');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->LehreinheitgruppeModel->deleteGroup($lehreinheit_id, $lehreinheitgruppe_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function add()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$gid = $this->input->post('gid');
$lehrverband = $this->input->post('lehrverband');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($gid) || !ctype_digit((string)$gid) || is_null($lehrverband))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false'));
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function getByLehreinheit($lehreinheit_id = null)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$gruppen = $this->_ci->LehreinheitgruppeModel->getByLehreinheit($lehreinheit_id);
$this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : array());
}
public function deleteFromLVPlan()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->StundenplandevModel->deleteGroupPlanning($lehreinheit_id, $lehreinheitgruppe_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function getAllSearch()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->GruppeModel->addSelect('gruppe_kurzbz,
studiengang_kz,
semester,
bezeichnung,
gid,
\'false\' as lehrverband');
$this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
$this->_ci->GruppeModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->GruppeModel->db->group_start();
$this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%");
$this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%");
$this->_ci->GruppeModel->db->group_end();
}
$this->_ci->GruppeModel->db->group_end();
$gruppen_result = $this->_ci->GruppeModel->load();
$gruppen_array = array();
if (isError($gruppen_result))
$this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL);
if (hasData($gruppen_result))
$gruppen_array = getData($gruppen_result);
$this->_ci->LehrverbandModel->addSelect('CONCAT(UPPER(CONCAT(typ, kurzbz)), \'\', semester, verband, COALESCE(gruppe,\'\')) as gruppe_kurzbz,
studiengang_kz,
semester,
tbl_lehrverband.bezeichnung,
gid,
\'true\' as lehrverband');
$this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehrverbandModel->addOrder('verband');
$this->_ci->LehrverbandModel->addOrder('gruppe');
$this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true));
$this->_ci->LehrverbandModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->LehrverbandModel->db->group_start();
$this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%");
$this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%");
$this->_ci->LehrverbandModel->db->group_end();
}
$this->_ci->LehrverbandModel->db->group_end();
$lehrverband_result = $this->_ci->LehrverbandModel->load();
$lehrverband_array = array();
if (isError($lehrverband_result))
$this->terminateWithError(getError($lehrverband_result), self::ERROR_TYPE_GENERAL);
if (hasData($lehrverband_result))
$lehrverband_array = getData($lehrverband_result);
$all_gruppen = array_merge($gruppen_array, $lehrverband_array);
$this->terminateWithSuccess($all_gruppen);
}
public function getBenutzerSearch()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang');
$this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->_ci->PersonModel->db->where(array('tbl_benutzer.aktiv' => true));
$this->_ci->PersonModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->PersonModel->db->group_start();
$this->_ci->PersonModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('uid ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz) ILIKE', "%" . $word . "%");
if (is_numeric($word))
{
$this->_ci->PersonModel->db->or_where('semester', $word);
}
$this->_ci->PersonModel->db->group_end();
}
$this->_ci->PersonModel->db->group_end();
$personen = $this->_ci->PersonModel->load();
$this->terminateWithSuccess(hasData($personen) ? getData($personen) : array());
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
private function checkPermission($lehreinheit_id)
{
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
}
}
@@ -0,0 +1,478 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Lehreinheit extends FHCAPI_Controller
{
private $_uid;
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'copy' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'update' => ['admin:rw', 'assistenz:rw'],
'get' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getLehrfach' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
'getLehrform' => ['admin:r', 'assistenz:r']
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->_ci->load->library('PhrasesLib');
$this->loadPhrases(
array(
'global',
'ui'
)
);
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
}
public function get($lehreinheit_id)
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$lehreinheit->lehrfaecher = $this->getLehrfaecher($lehreinheit);
$this->terminateWithSuccess($lehreinheit);
}
private function getLehrfaecher($lehreinheit)
{
$lehrfacher_array = array($lehreinheit->lehrfach_id);
$this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id');
$lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehreinheit->lehrveranstaltung_id));
if (hasData($lehrfaecher))
$lehrfaecher_array = array_merge($lehrfacher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel'));
$lehrfaecher_array[] = $lehreinheit->lehrveranstaltung_id;
$this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id');
$this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach");
$this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array);
$lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load();
return hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array();
}
public function add()
{
$lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id));
if (!hasData($lehrveranstaltung_result) || isError($lehrveranstaltung_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehrveranstaltung = getData($lehrveranstaltung_result)[0];
$oe_result = $this->_ci->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id);
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array();
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
$this->_ci->load->library('form_validation');
$updatableFields = array(
'lehrveranstaltung_id',
'studiensemester_kurzbz',
'lehrfach_id',
'lehrform_kurzbz',
'stundenblockung',
'wochenrythmus',
'gewicht',
'start_kw',
'raumtyp',
'raumtypalternativ',
'sprache',
'lehre',
'anmerkung',
'lvnr',
'unr',
);
foreach ($updatableFields as $field)
{
switch ($field) {
case 'lehrveranstaltung_id':
$this->form_validation->set_rules($field, 'Lehrveranstaltung ID', 'required|integer');
break;
case 'studiensemester_kurzbz':
$this->form_validation->set_rules($field, 'Studiensemester', 'required|max_length[16]');
break;
case 'lehrfach_id':
$this->form_validation->set_rules($field, 'Lehrfach ID', 'required|integer');
break;
case 'lehrform_kurzbz':
$this->form_validation->set_rules($field, 'Lehrform', 'required|max_length[8]');
break;
case 'stundenblockung':
$this->form_validation->set_rules($field, 'Stundenblockung', 'required|integer|greater_than_equal_to[0]');
break;
case 'wochenrythmus':
$this->form_validation->set_rules($field, 'Wochenrhytmus', 'required|integer|greater_than_equal_to[0]');
break;
case 'start_kw':
$this->form_validation->set_rules($field, 'Start KW', 'integer|greater_than[0]|less_than_equal_to[53]');
break;
case 'gewicht':
$this->form_validation->set_rules($field, 'Gewicht', 'numeric');
break;
case 'raumtyp':
$this->form_validation->set_rules($field, 'Raumtyp', 'required|max_length[16]');
break;
case 'raumtypalternativ':
$this->form_validation->set_rules($field, 'Raumtyp Alternativ', 'required|max_length[16]');
break;
case 'sprache':
$this->form_validation->set_rules($field, 'Sprache', 'required|max_length[16]');
break;
case 'lvnr':
$this->form_validation->set_rules($field, 'LVNR', 'integer');
break;
case 'unr':
$this->form_validation->set_rules($field, 'UNR', 'integer');
break;
case 'lehre':
$this->form_validation->set_rules($field, 'Lehre', 'trim');
break;
case 'anmerkung':
$this->form_validation->set_rules($field, 'Anmerkung', 'trim');
break;
}
}
if ($this->form_validation->run() === false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$updateData = array();
foreach ($updatableFields as $field)
{
$value = $this->input->post($field);
if ($field === 'lehre')
{
$value = (bool)$value;
}
if ($value !== null)
{
$updateData[$field] = $value;
}
}
$updateData['insertvon'] = $this->_uid;
$updateData['insertamum'] = date('Y-m-d H:i:s');
$result = $this->_ci->LehreinheitModel->insert(
$updateData
);
if (!isset($updateData['unr']))
{
$unr = getData($result);
$this->_ci->LehreinheitModel->update($unr, array('unr' => $unr));
}
$this->terminateWithSuccess($result);
}
public function copy()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$art = $this->input->post('art');
$lehreinheit_old = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_old->lehreinheit_id);
$lehreinheit_new = $lehreinheit_old;
$lehreinheit_new->unr = null;
unset($lehreinheit_new->lehreinheit_id);
$lehreinheit_new->updateamum = date('Y-m-d H:i:s');
$lehreinheit_new->updatevon = $this->_uid;
$lehreinheit_new->insertamum = date('Y-m-d H:i:s');
$lehreinheit_new->insertvon = $this->_uid;
$insert_result = $this->_ci->LehreinheitModel->insert($lehreinheit_new);
if (isError($insert_result))
$this->terminateWithError(getError($insert_result), self::ERROR_TYPE_GENERAL);
$lehreinheit_id_new = getData($insert_result);
$this->_ci->LehreinheitModel->update(array('lehreinheit_id' => $lehreinheit_id_new), array('unr' => $lehreinheit_id_new));
if (in_array($art, array('gruppen', 'alle')))
{
$gruppen_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($gruppen_result))
$this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL);
if (hasData($gruppen_result))
{
$gruppen = getData($gruppen_result);
foreach ($gruppen as $gruppe)
{
$gruppe_new = $gruppe;
unset($gruppe_new->lehreinheitgruppe_id);
$gruppe_new->lehreinheit_id = $lehreinheit_id_new;
$gruppe_new->insertamum = date('Y-m-d H:i:s');
$gruppe_new->insertvon = $this->_uid;
$gruppe_new->updateamum = date('Y-m-d H:i:s');
$gruppe_new->updatevon = $this->_uid;
$gruppe_new_result = $this->_ci->LehreinheitgruppeModel->insert($gruppe_new);
if (isError($gruppe_new_result))
$this->terminateWithError(getError($gruppe_new_result), self::ERROR_TYPE_GENERAL);
}
}
}
if (in_array($art, array('lektoren', 'alle')))
{
$lektoren_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($lektoren_result))
$this->terminateWithError(getError($lektoren_result), self::ERROR_TYPE_GENERAL);
if (hasData($lektoren_result))
{
$lektoren = getData($lektoren_result);
foreach ($lektoren as $lektor)
{
$lektor_new = $lektor;
$lektor_new->lehreinheit_id = $lehreinheit_id_new;
$lektor_new->insertamum = date('Y-m-d H:i:s');
$lektor_new->insertvon = $this->_uid;
$lektor_new->updateamum = date('Y-m-d H:i:s');
$lektor_new->updatevon = $this->_uid;
unset($lektor_new->vertrag_id);
$lektor_new_result = $this->_ci->LehreinheitmitarbeiterModel->insert((array)$lektor_new);
if (isError($lektor_new_result))
$this->terminateWithError(getError($lektor_new_result), self::ERROR_TYPE_GENERAL);
}
}
}
$this->terminateWithSuccess("Erfolgeich gespeichert");
}
public function delete()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$errors = array();
if (is_array($lehreinheit_id))
{
foreach ($lehreinheit_id as $le_id)
{
$lehreinheit = $this->checkLehreinheit($le_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
if (isError($result))
{
$errors[] = getError($result);
}
}
}
else
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
}
if (!isEmptyArray($errors))
{
if (count($errors) !== count($lehreinheit_id))
$this->terminateWithSuccess(array('errors' => $errors));
else
$this->terminateWithError($errors);
}
else
$this->terminateWithSuccess('Erfolgreich geloescht');
}
public function update()
{
$lehreinheit = $this->checkLehreinheit($this->input->post('lehreinheit_id'));
$this->checkPermission($lehreinheit->lehreinheit_id);
$this->_ci->load->library('form_validation');
$formData = $this->input->post('formData');
$updatableFields = array(
'lehrveranstaltung_id',
'studiensemester_kurzbz',
'lehrfach_id',
'lehrform_kurzbz',
'stundenblockung',
'wochenrythmus',
'gewicht',
'start_kw',
'raumtyp',
'raumtypalternativ',
'sprache',
'lehre',
'anmerkung',
'lvnr',
'unr',
);
$this->form_validation->set_data($formData);
foreach ($updatableFields as $field)
{
if (array_key_exists($field, $formData))
{
switch ($field)
{
case 'lehrveranstaltung_id':
$this->form_validation->set_rules($field, 'Lehrveranstaltung ID', 'required|integer');
break;
case 'studiensemester_kurzbz':
$this->form_validation->set_rules($field, 'Studiensemester', 'required|max_length[16]');
break;
case 'lehrfach_id':
$this->form_validation->set_rules($field, 'Lehrfach ID', 'required|integer');
break;
case 'lehrform_kurzbz':
$this->form_validation->set_rules($field, 'Lehrform', 'required|max_length[8]');
break;
case 'stundenblockung':
$this->form_validation->set_rules($field, 'Stundenblockung', 'required|integer|greater_than_equal_to[0]');
break;
case 'wochenrythmus':
$this->form_validation->set_rules($field, 'Wochenrhytmus', 'required|integer|greater_than_equal_to[0]');
break;
case 'start_kw':
$this->form_validation->set_rules($field, 'Start KW', 'integer|greater_than[0]|less_than_equal_to[53]');
break;
case 'gewicht':
$this->form_validation->set_rules($field, 'Gewicht', 'numeric|greater_than_equal_to[0]');
break;
case 'raumtyp':
$this->form_validation->set_rules($field, 'Raumtyp', 'required|max_length[16]');
break;
case 'raumtypalternativ':
$this->form_validation->set_rules($field, 'Raumtyp Alternativ', 'required|max_length[16]');
break;
case 'sprache':
$this->form_validation->set_rules($field, 'Sprache', 'required|max_length[16]');
break;
case 'lvnr':
$this->form_validation->set_rules($field, 'LVNR', 'integer');
break;
case 'unr':
$this->form_validation->set_rules($field, 'UNR', 'integer|greater_than_equal_to[0]');
break;
case 'lehre':
$this->form_validation->set_rules($field, 'Lehre', 'trim');
break;
case 'anmerkung':
$this->form_validation->set_rules($field, 'Anmerkung', 'trim');
break;
}
}
}
if ($this->form_validation->run() === false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$updateData = [];
foreach ($updatableFields as $field)
{
if (array_key_exists($field, $formData))
{
$updateData[$field] = $formData[$field];
}
}
$updateData['updatevon'] = $this->_uid;
$updateData['updateamum'] = date('Y-m-d H:i:s');
$result = $this->_ci->LehreinheitModel->update(
[
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
],
$updateData
);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess($this->p->t('global', 'gespeichert'));
}
private function checkPermission($lehreinheit_id)
{
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
}
private function checkLehreinheit($lehreinheit_id)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($lehreinheit_result)[0];
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -0,0 +1,432 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Lektor extends FHCAPI_Controller
{
private $_uid;
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'update' => ['admin:rw', 'assistenz:rw'],
'cancelVertrag' => ['admin:rw', 'assistenz:rw'],
'deleteLVPlan' => ['admin:rw', 'assistenz:rw'],
'deletePerson' => ['admin:rw', 'assistenz:rw'],
'getLehrfunktionen' => ['admin:r', 'assistenz:r'],
'getLektorenSearch' => ['admin:r', 'assistenz:r'],
'getLektorenByLE' => ['admin:r', 'assistenz:r'],
'getLektorDaten' => ['admin:r', 'assistenz:r'],
'getLektorVertrag' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->_ci->load->library('PermissionLib');
$this->_ci->load->library('LektorLib');
$this->_ci->load->library('form_validation');
$this->loadPhrases([
'ui'
]);
$this->_ci->load->model('accounting/Vertrag_model', 'VertragModel');
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->_ci->load->model('ressource/Stundensatz_model', 'StundensatzModel');
}
private function checkMitarbeiter($mitarbeiter_uid)
{
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
public function add()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkMitarbeiter($mitarbeiter_uid);
$lehrfach_permission = $this->checkLehrfachPermission($lehreinheit_id, array('assistenz', 'admin'));
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
if (!$lehrfach_permission && !$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
$result = $this->_ci->lektorlib->addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid);
if (isError($result)) $this->terminateWithError(getError($result));
$this->terminateWithSuccess("Erfolgreich gespeichert");
}
public function update()
{
$formData = $this->input->post('formData');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkMitarbeiter($mitarbeiter_uid);
$updatableFields = array(
'lehrfunktion_kurzbz',
'planstunden',
'stundensatz',
'faktor',
'anmerkung',
'bismelden',
'semesterstunden',
'mitarbeiter_uid'
);
$this->form_validation->set_data($formData);
foreach ($updatableFields as $field)
{
if (array_key_exists($field, $formData))
{
switch ($field)
{
case 'lehrfunktion_kurzbz':
$this->form_validation->set_rules($field, 'Lehrfunktion', 'required|max_length[16]');
break;
case 'planstunden':
$this->form_validation->set_rules($field, 'Planstunden', 'integer|greater_than_equal_to[0]');
break;
case 'stundensatz':
$formData['stundensatz'] = str_replace(',', '.', $formData['stundensatz']);
$this->form_validation->set_rules($field, 'Stundensatz', 'callback__check_stundensatz');
break;
case 'faktor':
$this->form_validation->set_rules($field, 'Faktor', 'numeric|greater_than_equal_to[0]');
break;
case 'anmerkung':
$this->form_validation->set_rules($field, 'Anmerkung', 'max_length[256]');
break;
case 'bismelden':
$this->form_validation->set_rules($field, 'Bis Melden', 'trim');
break;
case 'semesterstunden':
$formData['semesterstunden'] = str_replace(',', '.', $formData['semesterstunden']);
$this->form_validation->set_rules($field, 'Semesterstunden', 'callback__check_semesterstunden');
break;
case 'mitarbeiter_uid':
$this->form_validation->set_rules($field, 'Semesterstunden', 'required|max_length[32]');
break;
}
}
}
if (!$this->form_validation->run())
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === ''))
{
$formData['semesterstunden'] = null;
}
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
if (!$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
$result = $this->_ci->lektorlib->updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $formData);
if (isError($result)) $this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function _check_stundensatz($value)
{
$value = str_replace(',', '.', $value);
if (!is_numeric($value))
{
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.');
return false;
}
if ($value < 0 || $value >= 10000) {
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss zwischen 0 und 10000 liegen.');
return false;
}
return true;
}
public function _check_semesterstunden($value)
{
if ($value === null || $value === '') {
return true;
}
if (!is_numeric($value))
{
$this->form_validation->set_message(
'_check_semesterstunden',
'Das Feld {field} muss eine Zahl sein.'
);
return false;
}
if ($value < 0)
{
$this->form_validation->set_message(
'_check_semesterstunden',
'Das Feld {field} muss eine Zahl größer oder gleich 0 sein.'
);
return false;
}
if ($value > 999.99)
{
$this->form_validation->set_message(
'_check_semesterstunden',
'Das Feld {field} darf maximal 999,99 betragen.'
);
return false;
}
return true;
}
public function getLehrfunktionen()
{
$this->_ci->load->model('education/Lehrfunktion_model', 'LehrfunktionModel');
$this->_ci->LehrfunktionModel->addOrder('lehrfunktion_kurzbz');
$this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load()));
}
public function getLektorenSearch()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
$this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true);
$this->_ci->MitarbeiterModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->MitarbeiterModel->db->group_start();
$this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->group_end();
}
$this->_ci->MitarbeiterModel->db->group_end();
$this->_ci->MitarbeiterModel->addOrder('nachname');
$this->_ci->MitarbeiterModel->addOrder('vorname');
$result = $this->_ci->MitarbeiterModel->load();
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
private function checkLehreinheit($lehreinheit_id)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($lehreinheit_result)[0];
}
public function getLektorenByLE($lehreinheit_id = null)
{
$this->checkLehreinheit($lehreinheit_id);
$le_mitarbeiter_data = $this->_ci->LehreinheitmitarbeiterModel->getLektorenByLe($lehreinheit_id);
$this->terminateWithSuccess(hasData($le_mitarbeiter_data) ? getData($le_mitarbeiter_data) : array());
}
public function getLektorDaten($lehreinheit_id = null, $mitarbeiter_uid = null)
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
if (is_null($mitarbeiter_uid))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
$studiensemester = getData($studiensemester_result)[0];
$defaultStundensatz = $this->_ci->StundensatzModel->getDefaultStundensatz($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre');
$le_mitarbeiter_result = $this->_ci->LehreinheitmitarbeiterModel->getByLeLektor($lehreinheit_id, $mitarbeiter_uid);
$le_mitarbeiter_data = array();
if (hasData($le_mitarbeiter_result))
{
$le_mitarbeiter_data = getData($le_mitarbeiter_result)[0];
$le_mitarbeiter_data->default_stundensatz = $defaultStundensatz;
}
$vertrag = $this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid);
$le_mitarbeiter_data->vertrag = $vertrag;
$this->terminateWithSuccess($le_mitarbeiter_data);
}
private function getLektorVertrag($lehreinheit_id = null, $mitarbeiter_uid = null)
{
$this->_ci->load->model('accounting/Vertrag_model', 'VertragModel');
$vertrag = $this->_ci->VertragModel->getVertrag($mitarbeiter_uid, $lehreinheit_id);
return hasData($vertrag) ? getData($vertrag)[0] : null;
}
private function checkLehrfachPermission($lehreinheit_id, $permissions)
{
$lehrfach_oe_kurzbz = $this->_ci->LehreinheitModel->getLehrfachOe($lehreinheit_id);
if (isError($lehrfach_oe_kurzbz))
$this->terminateWithError(getError($lehrfach_oe_kurzbz), self::ERROR_TYPE_GENERAL);
$lehrfach_oe_kurzbz = array('');
if (hasData($lehrfach_oe_kurzbz))
$lehrfach_oe_kurzbz = array_column(getData($lehrfach_oe_kurzbz), 'oe_kurzbz');
return $this->checkPermissionGenerel($permissions, $lehrfach_oe_kurzbz);
}
private function checkPermissionGenerel($permissions, $oe_array)
{
$hasPermission = false;
foreach ($permissions as $permission)
{
if ($this->_ci->permissionlib->isBerechtigtMultipleOe($permission, $oe_array, 'suid'))
{
$hasPermission = true;
break;
}
}
return $hasPermission;
}
private function checkPermission($lehreinheit_id, $permissions)
{
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
return $this->checkPermissionGenerel($permissions, $oe_array);
}
public function cancelVertrag()
{
$vertrag_id = $this->input->post('vertrag_id');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_id, array('admin', 'lehre/lehrauftrag_bestellen'));
if (is_null($vertrag_id) || !ctype_digit((string)$vertrag_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$vertrag_result = $this->_ci->VertragModel->load($vertrag_id);
if (!hasData($vertrag_result) || isError($vertrag_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if (is_null($mitarbeiter_uid))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$result = $this->_ci->VertragModel->cancelVertrag($vertrag_id, $mitarbeiter_uid);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function deletePerson()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$delete_result =$this->_ci->LehreinheitmitarbeiterModel->deleteLektorFromLe($lehreinheit_id, $mitarbeiter_uid);
if (isError($delete_result))
$this->terminateWithError(getError($delete_result));
$this->terminateWithSuccess($delete_result);
}
public function deleteLVPlan()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_id, array('lv-plan/lektorentfernen'));
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$delete_result = $this->_ci->StundenplandevModel->deleteLektorPlanning($lehreinheit_id, $mitarbeiter_uid);
if (isError($delete_result))
$this->terminateWithError(getError($delete_result));
$this->terminateWithSuccess($delete_result);
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -0,0 +1,121 @@
<?php
/**
* Copyright (C) 2025 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Setup extends FHCAPI_Controller
{
private $_ci;
private $_uid;
public function __construct()
{
parent::__construct([
'getTabs' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
'getLehrform' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
}
public function getTabs()
{
$tabs['details'] = array (
'title' => 'Details',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'),
'config' => []
);
$tabs['gruppen'] = array (
'title' => 'Gruppen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'),
'config' => []
);
$tabs['lektor'] = array (
'title' => 'LektorInnenzuteilung',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
'config' => []
);
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'config' => []
);
$this->terminateWithSuccess($tabs);
}
public function getStudiensemester()
{
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->_ci->StudiensemesterModel->addOrder('start', 'DESC');
$this->terminateWithSuccess(getData($this->_ci->StudiensemesterModel->load()));
}
public function getSprache()
{
$this->_ci->load->model('system/Sprache_model', 'SpracheModel');
$this->terminateWithSuccess(getData($this->_ci->SpracheModel->load()));
}
public function getRaumtyp()
{
$this->_ci->load->model('ressource/Raumtyp_model', 'RaumtypModel');
$this->_ci->RaumtypModel->addOrder('raumtyp_kurzbz');
$this->terminateWithSuccess(getData($this->_ci->RaumtypModel->loadWhere(array('aktiv' => true))));
}
public function getLehrform()
{
$language = $this->_getLanguageIndex();
$this->_ci->load->model('codex/lehrform_model', 'LehrformModel');
$this->_ci->LehrformModel->addSelect(
'*,
bezeichnung_kurz[('.$language.')] as bez_kurz,
bezeichnung_lang[('.$language.')] as bez
'
);
$this->terminateWithSuccess(getData($this->_ci->LehrformModel->load()));
}
private function _getLanguageIndex()
{
$this->_ci->load->model('system/Sprache_model', 'SpracheModel');
$this->_ci->SpracheModel->addSelect('index');
$result = $this->_ci->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
return hasData($result) ? getData($result)[0]->index : 1;
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -0,0 +1,117 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class StgTree extends FHCAPI_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
public function _remap($method, $params = [])
{
if ($method == '' || $method == 'index')
return $this->getBase();
if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
&& !$this->permissionlib->isBerechtigt('admin', 's', $method)
) {
return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
}
return $this->getStudiengang($method);
show_404();
}
protected function getBase()
{
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
$this->StudiengangModel->addDistinct();
$this->StudiengangModel->addSelect("v.studiengang_kz AS link");
$this->StudiengangModel->addSelect(
"CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
false
);
$this->StudiengangModel->addSelect('erhalter_kz');
$this->StudiengangModel->addSelect('typ');
$this->StudiengangModel->addSelect('kurzbz');
$this->StudiengangModel->addSelect('studiengang_kz');
$this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
$this->StudiengangModel->addOrder('erhalter_kz');
$this->StudiengangModel->addOrder('typ');
$this->StudiengangModel->addOrder('kurzbz');
$stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
$stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
if (!$stgs)
$this->terminateWithSuccess([]);
$this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
$result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
$list = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($list);
}
protected function getStudiengang($studiengang_kz)
{
$link = $studiengang_kz . '/';
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
$this->StudiengangModel->addDistinct();
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect("TRUE AS leaf", false);
$this->StudiengangModel->addSelect('semester');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
$this->StudiengangModel->addOrder('semester');
$result = $this->StudiengangModel->loadWhere([
'v.studiengang_kz' => $studiengang_kz,
'v.aktiv' => true
]);
$list = $this->getDataOrTerminateWithError($result);
$result = $this->StudiengangModel->load($studiengang_kz);
$result = $this->getDataOrTerminateWithError($result);
if ($result)
{
if (current($result)->mischform)
{
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
$this->StudienordnungModel->addDistinct();
$this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
$this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
$this->StudienordnungModel->addSelect("TRUE as leaf", false);
$this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
$result = $this->StudienordnungModel->loadWhere([
'aktiv' => true,
'studiengang_kz' => $studiengang_kz,
'p.orgform_kurzbz !=' => 'DDP'
]);
$result = $this->getDataOrTerminateWithError($result);
$list = array_merge($list, $result);
}
}
$this->terminateWithSuccess($list);
}
}
@@ -0,0 +1,50 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Tags extends Tag_Controller
{
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:r'];
public function __construct()
{
parent::__construct([
'getTag' => self::BERECHTIGUNG_KURZBZ,
'getTags' => self::BERECHTIGUNG_KURZBZ,
'addTag' => self::BERECHTIGUNG_KURZBZ,
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
'updateLehre' => self::BERECHTIGUNG_KURZBZ,
'doneLehre' => self::BERECHTIGUNG_KURZBZ,
'deleteLehre' => self::BERECHTIGUNG_KURZBZ,
]);
$this->config->load('lvverwaltung');
}
public function getTag($readonly_tags = null)
{
parent::getTag($this->config->item('lvverwaltung_tags'));
}
public function getTags($tags = null)
{
parent::getTags($this->config->item('lvverwaltung_tags'));
}
public function addTag($withZuordnung = true, $updatable_tags = null)
{
parent::addTag(true, $this->config->item('lvverwaltung_tags'));
}
public function updateTag($updatable_tags = null)
{
parent::updateTag($this->config->item('lvverwaltung_tags'));
}
public function deleteTag($withZuordnung = true, $updatable_tags = null)
{
parent::deleteTag(true, $this->config->item('lvverwaltung_tags'));
}
public function doneTag($updatable_tags = null)
{
parent::doneTag($this->config->item('lvverwaltung_tags'));
}
}
@@ -0,0 +1,564 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Messages extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getMessages' => ['admin:r', 'assistenz:r'],
'getVorlagen' => ['admin:r', 'assistenz:r'],
'getMessageVarsPerson' => ['admin:r', 'assistenz:r'],
'getMsgVarsPrestudent' => ['admin:r', 'assistenz:r'],
'getMsgVarsLoggedInUser' => ['admin:r', 'assistenz:r'],
'getNameOfDefaultRecipient' => ['admin:r', 'assistenz:r'],
'getNameOfDefaultRecipients' => ['admin:r', 'assistenz:r'],
'sendMessage' => ['admin:r', 'assistenz:r'],
'deleteMessage' => ['admin:r', 'assistenz:r'],
'getDataVorlage' => ['admin:r', 'assistenz:r'],
'getPreviewText' => ['admin:r', 'assistenz:r'],
'getReplyData' => ['admin:r', 'assistenz:r'],
'getPersonId' => ['admin:r', 'assistenz:r'],
'getUid' => ['admin:r', 'assistenz:r'],
'getUids' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('system/Message_model', 'MessageModel');
$this->load->model('CL/Messages_model', 'MessagesModel');
// Additional Permission Checks
//TODO(manu) check permissions
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
$this->load->library('MessageLib');
// Load language phrases
$this->loadPhrases([
'ui', 'messages'
]);
}
public function getMessages($id, $type_id, $size=null, $page=null)
{
if($type_id != 'person_id'){
$id = $this->_getPersonId($id, $type_id);
}
if(!(is_null($size) && is_null($page)))
{
$offset = $size * ($page - 1);
$limit = $size;
}
else
{
$offset = null;
$limit = null;
}
$result = $this->MessageModel->getMessagesForTable($id, $offset, $limit);
if (hasData($result))
{
$data = getData($result);
$this->addMeta('count', $data['count']);
$this->terminateWithSuccess($data['data']);
}
$this->terminateWithSuccess(array());
}
public function getVorlagen()
{
//get oe of user
$uid = getAuthUID();
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
if (hasData($result))
{
$this->load->model('system/Vorlage_model', 'VorlageModel');
$data = getData($result);
$oe_kurzbz = array_column($data, 'oe_kurzbz');
$result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
$this->terminateWithSuccess(array());
}
public function getDataVorlage($vorlage_kurzbz)
{
$studiengang_kz = 0;
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$this->VorlagestudiengangModel->addOrder('version', 'DESC');
$result = $this->VorlagestudiengangModel->loadWhere(
[
'vorlage_kurzbz' =>$vorlage_kurzbz,
'studiengang_kz' => $studiengang_kz
]);
$data = $this->getDataOrTerminateWithError($result);
$vorlage = current($data);
$this->terminateWithSuccess($vorlage);
}
public function getMessageVarsPerson($typeId)
{
$ids = $this->input->post('ids');
$messageVarsPerson = [];
foreach ($ids as $id)
{
$person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id;
$result = $this->MessageModel->getMsgVarsDataByPersonId($person_id);
$data = $this->getDataOrTerminateWithError($result);
$messageVarsPerson[] = current($data);
}
$this->terminateWithSuccess($messageVarsPerson);
}
public function getMsgVarsPrestudent($typeId)
{
$ids = $this->input->post('ids');
if(!is_array($ids)) {
$ids = array($ids);
}
$messageVarsPrestudent = [];
if($typeId == 'uid')
{
$prestudent_ids = [];
foreach ($ids as $id)
{
$prestudent_ids[] = $this->_getPrestudentIdFromUid($id);
}
}
else
$prestudent_ids = $ids;
foreach ($prestudent_ids as $prestudent_id)
{
$result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$messageVarsPrestudent[] = current($data);
}
$this->terminateWithSuccess($messageVarsPrestudent);
}
public function getMsgVarsLoggedInUser()
{
$result = $this->MessageModel->getMsgVarsLoggedInUser();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getNameOfDefaultRecipients($type_id)
{
$ids = $this->input->post('ids');
if(!is_array($ids)) {
$ids = array($ids);
}
$recipients = [];
if (empty($ids)) {
throw new InvalidArgumentException($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL);
}
$this->load->model('person/Person_model', 'PersonModel');
if($type_id != 'person_id'){
foreach ($ids as $id)
{
$person_id = $this->_getPersonId($id, $type_id);
$result = $this->PersonModel->load($person_id);
$data = $this->getDataOrTerminateWithError($result);
$name = current($data);
$recipients[$id] = $name->vorname . " " . $name->nachname;
}
}
else {
foreach ($ids as $id) {
$result = $this->PersonModel->load($id);
$data = $this->getDataOrTerminateWithError($result);
$name = current($data);
$recipients[$id] = $name->vorname . " " . $name->nachname;
}
}
$this->terminateWithSuccess($recipients);
}
public function sendMessage($typeId)
{
$resultReturn = [];
$uid = getAuthUID();
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['uid' => $uid]
);
$data = $this->getDataOrTerminateWithError($result);
$benutzer = current($data);
if (isset($_POST['data']))
{
$data = json_decode($_POST['data']);
unset($_POST['data']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
$this->load->library('form_validation');
$this->form_validation->set_rules('subject', 'Betreff', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Betreff'])
]);
$this->form_validation->set_rules('body', 'Text', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Text'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$subject = $this->input->post('subject');
$body = $this->input->post('body');
$relationmessage_id = $this->input->post('relationmessage_id');
if (isset($_POST['ids']))
{
$ids = json_decode($_POST['ids']);
unset($_POST['ids']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
if (!is_array($ids)) {
$ids = [$ids];
}
foreach ($ids as $id)
{
$receiversPersonId = $typeId == "person_id" ? $id : $this->_getPersonId($id, $typeId);
if($typeId == 'uid')
{
$prestudent_id = $this-> _getPrestudentIdFromUid($id);
$result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
if($typeId == 'mitarbeiter_uid')
{
$person_id = $this->_getPersonId($id, $typeId);
$result = $this->MessagesModel->parseMessageTextPerson($person_id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
elseif($typeId == 'person_id')
{
$result = $this->MessagesModel->parseMessageTextPerson($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
elseif($typeId == 'prestudent_id')
{
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$result =$this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id);
$data = $this->getDataOrTerminateWithError($result);
$resultReturn[] = current($data);
}
$this->terminateWithSuccess($resultReturn);
}
public function getPreviewText($type_id)
{
if (isset($_POST['data']))
{
$data = json_decode($_POST['data']);
unset($_POST['data']);
}
else
$this->terminateWithError($this->p->t('messages', 'errorMissingOrInvalidParameters', ['parameter'=> "Textbody"]), self::ERROR_TYPE_GENERAL);
if (isset($_POST['ids']))
{
$ids = json_decode($_POST['ids']);
if(!is_array($ids))
{
$ids = array($ids);
}
unset($_POST['ids']);
}
else
$this->terminateWithError($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL);
$bodyParsed = [];
foreach ($ids as $id)
{
switch($type_id)
{
case 'uid':
$prestudent_id = $this->_getPrestudentIdFromUid($id);
$result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
break;
case 'prestudent_id':
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
break;
case 'person_id':
$result = $this->MessagesModel->parseMessageTextPerson($id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
break;
case 'mitarbeiter_uid':
{
$person_id = $this->_getPersonId($id, $type_id);
$result = $this->MessagesModel->parseMessageTextPerson($person_id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
}
break;
default:
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $type_id]), self::ERROR_TYPE_GENERAL);
break;
}
}
$this->terminateWithSuccess($bodyParsed);
}
public function getReplyData($messageId)
{
if (!is_numeric($messageId)) {
$this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value'=> 'Message ID']), self::ERROR_TYPE_GENERAL);
}
$this->MessageModel->addSelect('public.tbl_msg_message.*');
$this->MessageModel->addSelect('r.*');
$this->MessageModel->addSelect('p.nachname');
$this->MessageModel->addSelect('p.vorname');
$this->MessageModel->addJoin('public.tbl_msg_recipient r', 'ON (r.message_id = public.tbl_msg_message.message_id)');
$this->MessageModel->addJoin('public.tbl_person p', 'ON (p.person_id = public.tbl_msg_message.person_id)');
$result = $this->MessageModel->loadWhere(
array('r.message_id' => $messageId)
);
$dataMessage = $this->getDataOrTerminateWithError($result);
$prefix = "Re: "; // reply subject prefix
$subject = $dataMessage[0]->subject;
$body = $dataMessage[0]->body;
$replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum);
$dataMessage[0]->replyBody = $replyBody;
$dataMessage[0]->replySubject = $prefix . $subject;
$this->terminateWithSuccess($dataMessage);
}
public function deleteMessage($messageId)
{
// Start DB transaction
$this->db->trans_begin();
$result = $this->MessageModel->deleteMessageRecipient($messageId);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$result = $this->MessageModel->deleteMessageStatus($messageId);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$result = $this->MessageModel->deleteMessage($messageId);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->db->trans_commit();
$this->terminateWithSuccess($result);
}
public function getPersonId($id, $typeId)
{
if ($typeId == 'uid' || $typeId == 'mitarbeiter_uid')
{
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['uid' => $id]
);
}
elseif($typeId == 'prestudent_id')
{
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->loadWhere(
['prestudent_id' => $id]
);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$data = $this->getDataOrTerminateWithError($result);
$person = current($data);
$this->terminateWithSuccess($person->person_id);
}
public function getUids($typeId)
{
$ids = $this->input->post('ids');
$benutzerIds = [];
if (!$typeId)
{
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Type ID']), self::ERROR_TYPE_GENERAL);
}
elseif ($typeId == 'person_id')
{
$this->load->model('person/Benutzer_model', 'BenutzerModel');
foreach ($ids as $id)
{
$result = $this->BenutzerModel->loadWhere(
['person_id' => $id]
);
$data = $this->getDataOrTerminateWithError($result);
$benutzer = current($data);
$benutzerIds[$id] = $benutzer->uid;
}
}
elseif($typeId == 'prestudent_id')
{
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
foreach ($ids as $id)
{
$result = $this->PrestudentModel->loadWhere(
['prestudent_id' => $id]
);
$data = $this->getDataOrTerminateWithError($result);
$person = current($data);
$person_id = $person->person_id;
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['person_id' => $person_id]
);
$data = $this->getDataOrTerminateWithError($result);
$benutzer = current($data);
$benutzerIds[$id] = $benutzer->uid;
}
}
elseif($typeId == 'uid' || $typeId == 'mitarbeiter_uid')
{
$this->terminateWithSuccess($ids);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($benutzerIds);
}
private function _getPersonId($id, $typeId)
{
if ($typeId == 'uid' || $typeId == 'mitarbeiter_uid')
{
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['uid' => $id]
);
}
elseif($typeId == 'prestudent_id')
{
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->loadWhere(
['prestudent_id' => $id]
);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$data = $this->getDataOrTerminateWithError($result);
if (count($data) < 1)
{
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
}
$person = current($data);
return $person->person_id;
}
private function _getPrestudentIdFromUid($uid)
{
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(
['student_uid' => $uid]
);
$data = $this->getDataOrTerminateWithError($result);
if (count($data) < 1)
{
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
}
$student = current($data);
return $student->prestudent_id;
}
private function _getReplyBody($body, $receiverName, $receiverSurname, $sentDate)
{
// To quote a reply body message
$bodyFormat = "<br>
<br>
<blockquote>
<i>
On %s %s %s wrote:
</i>
</blockquote>
<blockquote style='border-left:2px solid; padding-left: 8px'>
%s
</blockquote>";
return sprintf(
$bodyFormat,
date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body
);
}
}
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizAnrechnung extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "anrechnung_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizBestellung extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "bestellung_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,122 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class NotizLehreinheit extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'getUid' => ['admin:r', 'assistenz:r'],
'getNotizen' => ['admin:r', 'assistenz:r'],
'loadNotiz' => ['admin:r', 'assistenz:r'],
'addNewNotiz' => ['admin:rw', 'assistenz:rw'],
'updateNotiz' => ['admin:rw', 'assistenz:rw'],
'deleteNotiz' => ['admin:rw', 'assistenz:rw'],
'loadDokumente' => ['admin:r', 'assistenz:r'],
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
//Permission checks for allowed Oes
$allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: [];
if ($this->router->method == 'addNewNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$lehreinheit_id = $post_data['id'];
if(!$lehreinheit_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
}
if ($this->router->method == 'updateNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $post_data['notiz_id'];
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
//get lehreinheit_id
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
$data = $this->getDataOrTerminateWithError($result);
$lehreinheit_id = current($data)->lehreinheit_id;
if(!$lehreinheit_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
}
if ($this->router->method == 'deleteNotiz')
{
$notiz_id = $this->input->post('notiz_id');
$lehreinheit_id = $this->input->post('id');
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
if(!$lehreinheit_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
}
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes)
{
//get oe from lehreinheit
$result = $this->LehreinheitModel->getOes($lehreinheit_id);
$data = $this->getDataOrTerminateWithError($result);
$oes = current($data);
if (!in_array($oes, $allowedOes))
{
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL);
}
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "lehreinheit_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizMitarbeiter extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "mitarbeiter_uid")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -18,34 +18,102 @@ class NotizPerson extends Notiz_Controller
'loadDokumente' => ['admin:r', 'assistenz:r'],
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
'isBerechtigt' => ['admin:r', 'assistenz:r'],
'getCountNotes' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
//Permission checks for allowed Oes
if ($this->router->method == 'addNewNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$person_id = $post_data['id'];
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
}
if ( $this->router->method == 'updateNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $post_data['notiz_id'];
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
//get person_id
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
$data = $this->getDataOrTerminateWithError($result);
$person_id = current($data)->person_id;
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
}
if ($this->router->method == 'deleteNotiz' )
{
$notiz_id = $this->input->post('notiz_id');
$person_id = $this->input->post('id');
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL);
}
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
}
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "person_id")
{
return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre', 'error_keineSchreibrechte');
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
public function loadDokumente()
//stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs)
{
$notiz_id = $this->input->post('notiz_id');
$result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]);
$data = $this->getDataOrTerminateWithError($result);
// TODO(chris): make CI variant of endpoint
$this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview');
return parent::loadDokumente();
$checkarray = [];
foreach ($data as $item)
{
if(in_array($item->studiengang_kz, $allowedStgs))
{
return true;
}
}
$this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
}
}
@@ -0,0 +1,117 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizPrestudent extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
$this->load->model('crm/Student_model', 'StudentModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
//Permission checks for Studiengangsarray
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
if ($this->router->method == 'addNewNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$prestudent_id = $post_data['id'];
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
}
if ($this->router->method == 'updateNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $post_data['notiz_id'];
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
//get prestudent_id
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
$data = $this->getDataOrTerminateWithError($result);
$prestudent_id = current($data)->prestudent_id;
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
}
if ($this->router->method == 'deleteNotiz')
{
$notiz_id = $this->input->post('notiz_id');
$prestudent_id = $this->input->post('id');
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
}
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "prestudent_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs)
{
$student_uid = $this->StudentModel->getUID($prestudent_id);
$result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
$data = $this->getDataOrTerminateWithError($result);
$studiengang_kz = current($data)->studiengang_kz;
if (!in_array($studiengang_kz, $allowedStgs))
{
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjekt extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "projekt_kurzbz")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjektphase extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "projektphase_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjekttask extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "projekttask_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,57 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class StudiengangEP extends FHCAPI_Controller
{
/**
* StudiengangEP API constructor.
*/
public function __construct()
{
parent::__construct(
array(
'getStudiengangByKz' => self::PERM_LOGGED
)
);
// Load model StudiengangModel
$this->load->model('organisation/studiengang_model', 'StudiengangModel');
}
/**
* @return void
*/
public function getStudiengangByKz()
{
$studiengang_kz = intval($this->input->get('studiengang_kz'));
$this->StudiengangModel->addSelect('studiengang_kz, kurzbz, kurzbzlang, '
. 'typ, bezeichnung, english, aktiv, orgform_kurzbz, sprache, '
. 'oe_kurzbz');
$result = $this->StudiengangModel->load($studiengang_kz);
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$stg = null;
if(hasData($result))
{
$stg = (getData($result))[0];
}
$this->terminateWithSuccess($stg);
}
}
@@ -0,0 +1,80 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Studienjahr extends FHCAPI_Controller
{
/**
* Studienjahr API constructor.
*/
public function __construct()
{
parent::__construct(
array(
'getAll' => self::PERM_LOGGED,
'getNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
$this->load->model('organisation/studienjahr_model', 'StudienjahrModel');
}
/**
* Get all Studienjahre.
*
* @param null|string $order Sorting order for the Studienjahr, 'asc' or 'desc'. Defaults to 'asc'.
* @param null|string $start Starting Studienjahre with given studienjahr_kurzbz
*/
public function getAll()
{
$order = $this->input->get('order');
$start = $this->input->get('studienjahr_kurzbz');
if (strcasecmp($order, 'DESC') == 0) {
$this->StudienjahrModel->addOrder('studienjahr_kurzbz', 'DESC');
} else {
$this->StudienjahrModel->addOrder('studienjahr_kurzbz', 'ASC');
}
if ($start) {
$result = $this->StudienjahrModel->loadWhere([
'studienjahr_kurzbz >= ' => $start
]);
} else {
$result = $this->StudienjahrModel->load();
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
public function getNext()
{
$this->StudienjahrModel->addJoin('public.tbl_studiensemester', 'studienjahr_kurzbz');
$this->StudienjahrModel->addOrder('start');
$this->StudienjahrModel->addLimit(1);
$result = $this->StudienjahrModel->loadWhere(['start >' => 'NOW()']);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess(current(getData($result)));
}
}
@@ -0,0 +1,69 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Studienplan extends FHCAPI_Controller
{
public function __construct()
{
// TODO(chris): access!
parent::__construct([
'getBySemester' => self::PERM_LOGGED
]);
}
public function getBySemester()
{
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$studiengang_kz = $this->input->get('studiengang_kz');
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
$ausbildungssemester = $this->input->get('ausbildungssemester') ?: null;
$orgform_kurzbz = $this->input->get('orgform_kurzbz') ?: null;
if (!$studiengang_kz || !is_numeric($studiengang_kz))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL);
if (!$studiensemester_kurzbz)
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiensemester']), self::ERROR_TYPE_GENERAL);
if (isset($ausbildungssemester) && !is_numeric($ausbildungssemester))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Ausbildungssemester']), self::ERROR_TYPE_GENERAL);
//~ $this->load->library('form_validation');
//~ $this->form_validation->set_rules('studiengang_kz', 'StudiengangKz', 'required|numeric');
//~ $this->form_validation->set_rules('studiensemester_kurzbz', 'StudiensemesterKurbz', 'required');
//~ $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'numeric');
//~ if (!$this->form_validation->run())
//~ {
//~ $this->addMeta('fail2', 'fail2');
//~ return $this->terminateWithValidationErrors($this->form_validation->error_array());
//~ }
$this->addMeta('stg_kz', $studiengang_kz);
$this->addMeta('sem', $studiensemester_kurzbz);
$this->addMeta('sem2', $ausbildungssemester);
$this->addMeta('org', $orgform_kurzbz);
$result = $this->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester, $orgform_kurzbz);
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
}
@@ -24,7 +24,9 @@ class Studiensemester extends FHCAPI_Controller
parent::__construct(
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -115,4 +117,53 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess((getData($result) ?: ''));
}
/**
* Get Studienjahr by Studiensemester.
* input param semester: studiensemester_kurzbz
*/
public function getStudienjahrByStudiensemester()
{
$semester = $this->input->get('semester');
$studienjahrObj = null;
if (!is_numeric($semester))
{
$this->StudiensemesterModel->addSelect('studienjahr_kurzbz');
$result = $this->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz =' => $semester));
}
if (hasData($result))
{
$studienjahr = getData($result)[0]->studienjahr_kurzbz;
$startstudienjahr = substr($studienjahr, 0, 4);
$endstudienjahr = substr($studienjahr, 0, 2) . substr($studienjahr, -2);
$studienjahrObj = new StdClass();
$studienjahrObj->studienjahr_kurzbz = $studienjahr;
$studienjahrObj->startstudienjahr = $startstudienjahr;
$studienjahrObj->endstudienjahr= $endstudienjahr;
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData(success($studienjahrObj))));
}
public function getAllStudiensemesterAndAktOrNext() {
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder("start", "DESC");
$result = $this->StudiensemesterModel->getAktOrNextSemester();
$aktuell = getData($result)[0];
$this->StudiensemesterModel->addSelect('*');
$result = $this->StudiensemesterModel->load();
$studiensemester = getData($result);
$this->terminateWithSuccess(array($studiensemester, $aktuell));
}
}
@@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->form_validation->set_rules(
'datum_wiedereinstieg',
'Datum Wiedereinstieg',
'required|callback_isValidDate|callback_isDateInFuture',
'required|is_valid_date|callback_isDateInFuture',
[
'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
'is_valid_date' => $this->p->t('ui', 'error_invalid_date'),
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
]
);
@@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
public function isValidDate($date)
{
try {
new DateTime($date);
} catch (Exception $e) {
return false;
}
return true;
}
public function isDateInFuture($date)
{
return new DateTime() < new DateTime($date);
}
}
@@ -0,0 +1,459 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Abschlusspruefung extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getAbschlusspruefung' => ['admin:r', 'assistenz:r'],
'loadAbschlusspruefung' => ['admin:r', 'assistenz:r'],
'insertAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'updateAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'deleteAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'getTypenAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'getNoten' => ['admin:rw', 'assistenz:rw'],
'getTypenAntritte' => ['admin:rw', 'assistenz:rw'],
'getBeurteilungen' => ['admin:rw', 'assistenz:rw'],
'getAkadGrade' => ['admin:rw', 'assistenz:rw'],
'getMitarbeiter' => ['admin:rw', 'assistenz:rw'],
'getPruefer' => ['admin:rw', 'assistenz:rw'],
'getTypStudiengang' => ['admin:rw', 'assistenz:rw'],
'checkForExistingExams' => ['admin:rw', 'assistenz:rw'],
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'person',
'abschlusspruefung'
]);
// Load models
$this->load->model('education/Abschlusspruefung_model', 'AbschlusspruefungModel');
//Permission checks for Studiengangsarray
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
if ($this->router->method == 'insertAbschlusspruefung' || $this->router->method == 'updateAbschlusspruefung')
{
$student_uid = $this->input->post('uid') ?: ($this->input->post('formData')['student_uid'] ?? null);
if(!$student_uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedStgsFromUid($student_uid, $allowedStgs);
}
if ($this->router->method == 'deleteAbschlusspruefung')
{
$abschlusspruefung_id = $this->input->post('id');
if(!$abschlusspruefung_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Abschlusspruefung ID']), self::ERROR_TYPE_GENERAL);
}
$result = $this->AbschlusspruefungModel->load(
array('abschlusspruefung_id' => $abschlusspruefung_id)
);
$data = $this->getDataOrTerminateWithError($result);
$student_uid = current($data)->student_uid;
$this->_checkAllowedStgsFromUid($student_uid, $allowedStgs);
}
}
private function _checkAllowedStgsFromUid($student_uid, $allowedStgs)
{
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
$data = $this->getDataOrTerminateWithError($result);
$studiengang_kz = current($data)->studiengang_kz;
if (!in_array($studiengang_kz, $allowedStgs))
{
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
}
public function getAbschlusspruefung($student_uid)
{
$result = $this->AbschlusspruefungModel->getAbschlusspruefungForPrestudent($student_uid);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
public function loadAbschlusspruefung()
{
$abschlusspruefung_id = $this->input->post('id');
$this->AbschlusspruefungModel->addSelect(
'lehre.tbl_abschlusspruefung.*,
p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname,
p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost,
p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname,
p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost,
p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname,
p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost,
pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname,
pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid'
);
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN pruefer1 IS NOT NULL
//~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
//~ ELSE NULL
//~ END AS p1
//~ ");
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN pruefer2 IS NOT NULL
//~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
//~ ELSE NULL
//~ END AS p2
//~ ");
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN pruefer3 IS NOT NULL
//~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
//~ ELSE NULL
//~ END AS p3
//~ ");
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN vorsitz IS NOT NULL
//~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
//~ ELSE NULL
//~ END AS pv
//~ ");
$this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p2', 'ON (p2.person_id = lehre.tbl_abschlusspruefung.pruefer2)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p3', 'ON (p3.person_id = lehre.tbl_abschlusspruefung.pruefer3)', 'LEFT');
$result = $this->AbschlusspruefungModel->loadWhere(
array('abschlusspruefung_id' => $abschlusspruefung_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getTypenAbschlusspruefung()
{
$this->load->model('education/Pruefungstyp_model', 'PruefungstypModel');
$result = $this->PruefungstypModel->loadWhere(
array('abschluss' => true)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getTypenAntritte()
{
$this->load->model('education/Pruefungsantritt_model', 'PruefungsantrittModel');
$result = $this->PruefungsantrittModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getBeurteilungen()
{
$this->load->model('education/Abschlussbeurteilung_model', 'AbschlussbeurteilungModel');
$result = $this->AbschlussbeurteilungModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getAkadGrade()
{
$studiengang_kz= $this->input->post('studiengang_kz');
$this->load->model('education/Akadgrad_model', 'AkadgradModel');
$result = $this->AkadgradModel->loadWhere(
array('studiengang_kz' => $studiengang_kz)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getTypStudiengang()
{
$studiengang_kz= $this->input->post('studiengang_kz');
/* if (!$studiengang_kzs || !is_array($studiengang_kzs)) {
$this->load->library('form_validation');
$this->form_validation->set_rules('studiengang_kzs', '', 'required|is_null', [
'is_null' => $this->p->t('ui', 'error_fieldMustBeArray')
]);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}*/
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->loadWhere(
array('studiengang_kz' => $studiengang_kz)
);
$data = $this->getDataOrTerminateWithError($result);
$typStudiengang = current($data)->typ;
$this->terminateWithSuccess($typStudiengang);
}
public function getMitarbeiter()
{
$searchString = $this->input->get('searchString') ?? '';
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
}
public function getPruefer()
{
$searchString = $this->input->get('searchString') ?? '';
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
}
public function getNoten()
{
$this->load->model('education/Note_model', 'NoteModel');
$this->NoteModel->addOrder('note', 'ASC');
$result = $this->NoteModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function insertAbschlusspruefung()
{
$this->load->library('form_validation');
$student_uid = $this->input->post('uid');
if(!$student_uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ'])
]);
$this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad'])
]);
$this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum'])
]);
$this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AbschlusspruefungModel->insert([
'student_uid' => $student_uid,
'pruefungstyp_kurzbz' => $formData['pruefungstyp_kurzbz'],
'akadgrad_id' => $formData['akadgrad_id'],
'vorsitz' => $formData['vorsitz'],
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
'datum' => $formData['datum'], //TODO(Manu) check if minute format like FAS
'sponsion' => $formData['sponsion'],
'pruefer1' => $formData['pruefer1'],
'pruefer2' => $formData['pruefer2'],
'pruefer3' => $formData['pruefer3'],
'protokoll' => $formData['protokoll'],
'note' => $formData['note'],
'anmerkung' => $formData['anmerkung'],
'insertamum' => date('c'),
'insertvon' => getAuthUID()
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function updateAbschlusspruefung()
{
$this->load->library('form_validation');
$abschlusspruefung_id = $this->input->post('id');
if(!$abschlusspruefung_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Abschlussprüfung ID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$vorsitz = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz'];
$pruefer1 = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1'];
$pruefer2 = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2'];
$pruefer3 = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3'];
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ'])
]);
$this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad'])
]);
$this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum'])
]);
$this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AbschlusspruefungModel->update(
[
'abschlusspruefung_id' => $abschlusspruefung_id
],
[
'student_uid' => $formData['student_uid'],
'pruefungstyp_kurzbz' => $formData['pruefungstyp_kurzbz'],
'akadgrad_id' => $formData['akadgrad_id'],
'vorsitz' => $vorsitz,
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
'datum' => $formData['datum'],
'sponsion' => $formData['sponsion'],
'pruefer1' => $pruefer1,
'pruefer2' => $pruefer2,
'pruefer3' => $pruefer3,
'protokoll' => $formData['protokoll'],
'note' => $formData['note'],
'anmerkung' => $formData['anmerkung'],
'updateamum' => date('c'),
'updatevon' => getAuthUID()
]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function deleteAbschlusspruefung()
{
$abschlusspruefung_id = $this->input->post('id');
$result = $this->AbschlusspruefungModel->delete(
array('abschlusspruefung_id' => $abschlusspruefung_id)
);
if (isError($result))
{
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
$this->outputJson($result);
}
return $this->terminateWithSuccess(current(getData($result)) ? : null);
}
public function checkForExistingExams()
{
$warning = false;
$output = [];
$student_uids = $this->input->post('uids');
if (empty($student_uids)) {
throw new InvalidArgumentException("Keine UID(s) übergeben.");
}
if( !is_array($student_uids) )
{
$student_uids = array($student_uids);
}
foreach ($student_uids as $uid)
{
$result = $this->AbschlusspruefungModel->loadWhere(
array('student_uid' => $uid)
);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
$warning = true;
$output[] = $uid;
}
}
if($warning)
{
$uids = is_array($output) ? implode(", ", $output) : $output;
return $this->terminateWithError($this->p->t('abschlusspruefung', 'error_studentOhneFinalExam', ['id'=> $uids]), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess('step3');
}
}
@@ -31,6 +31,11 @@ class Address extends FHCAPI_Controller
'getNations' => self::PERM_LOGGED,
'getPlaces' => self::PERM_LOGGED
]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function getNations()
@@ -45,7 +50,7 @@ class Address extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
public function getPlaces($plz)
public function getPlaces($plz = null)
{
$this->load->model('codex/Gemeinde_model', 'GemeindeModel');
@@ -53,7 +58,11 @@ class Address extends FHCAPI_Controller
$this->form_validation->set_data(['address.plz' => $plz]);
$this->form_validation->set_rules('address.plz', 'PLZ', 'numeric|less_than[10000]');
$this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric|less_than[10000]', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ']),
'less_than' => $this->p->t('ui', 'error_fieldLessThan10000', ['field' => 'PLZ'])
]);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
@@ -0,0 +1,70 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Controller for downloading Akte
*/
class Akte extends Auth_Controller
{
/**
* Calls the parent's constructor and prepares libraries and phrases
*/
public function __construct()
{
parent::__construct([
'download' => ['admin:w', 'assistenz:w'],
]);
// Load models
$this->load->model('crm/Akte_model', 'AkteModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
*
* Downloads an Akte
*/
public function download()
{
$akte_id = $this->input->get('akte_id');
if (!is_numeric($akte_id)) $this->terminateWithError('akte Id missing');
$result = $this->AkteModel->load($akte_id);
if (!hasData($result)) $this->terminateWithError('Akte not found');
$data = getData($result)[0];
if (isset($data->inhalt) && $data->inhalt != '')
{
header('Content-Description: File Transfer');
header('Content-Type: '. $data->mimetype);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Disposition: attachment; filename="'.$data->titel.'"');
echo base64_decode($data->inhalt);
die();
}
}
}
@@ -0,0 +1,256 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Anrechnungen extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getAnrechnungen' => ['admin:r', 'assistenz:r'],
'deleteAnrechnung' => ['admin:rw', 'assistenz:rw'],
'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'],
'getBegruendungen' => ['admin:r', 'assistenz:r'],
'getLektoren' => ['admin:r', 'assistenz:r'],
'getLvsKompatibel' => ['admin:r', 'assistenz:r'],
'insertAnrechnung' => ['admin:rw', 'assistenz:rw'],
'loadAnrechnung' => ['admin:rw', 'assistenz:rw'],
'updateAnrechnung' => ['admin:rw', 'assistenz:rw'],
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui', 'lehre'
]);
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungsModel');
}
public function getAnrechnungen($prestudent_id)
{
$result = $this->AnrechnungsModel->getAnrechnungsData($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getBegruendungen()
{
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegrueundungsModel');
$result = $this->AnrechnungbegrueundungsModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(getData($result) ?: []);
}
public function getLehrveranstaltungen($prestudent_id)
{
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$result = $this->PrestudentstatusModel->getLastStatus($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$studienplan_id = current($data)->studienplan_id;
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudienplanId($studienplan_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getLvsKompatibel($lehrveranstaltung_id)
{
$this->AnrechnungsModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'ON (lv.lehrveranstaltung_id = lehre.tbl_anrechnung.lehrveranstaltung_id)');
$result = $this->AnrechnungsModel->loadWhere(
['lehrveranstaltung_id_kompatibel' => $lehrveranstaltung_id]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getLektoren($studiengang_kz)
{
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->getLektoren($studiengang_kz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function insertAnrechnung()
{
$this->load->library('form_validation');
$prestudent_id = $this->input->post('prestudent_id');
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$_POST['lehrveranstaltung_id'] =
(isset($formData['lehrveranstaltung_id']) && !empty($formData['lehrveranstaltung_id']))
? $formData['lehrveranstaltung_id']
: null;
$_POST['lehrveranstaltung_id_kompatibel'] =
(isset($formData['lehrveranstaltung_id_kompatibel']) && !empty($formData['lehrveranstaltung_id_kompatibel']))
? $formData['lehrveranstaltung_id_kompatibel']
: null;
$_POST['begruendung'] =
(isset($formData['begruendung_id']) && !empty($formData['begruendung_id']))
? $formData['begruendung_id']
: null;
$_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von']))
? $formData['genehmigt_von']
: null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AnrechnungsModel->insert(
[
'prestudent_id' => $prestudent_id,
'lehrveranstaltung_id' => $_POST['lehrveranstaltung_id'],
'lehrveranstaltung_id_kompatibel' => $_POST['lehrveranstaltung_id_kompatibel'],
'begruendung_id' => $_POST['begruendung'],
'genehmigt_von' => $_POST['genehmigtVon']
]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function loadAnrechnung($anrechnung_id)
{
$this->AnrechnungsModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'ON (lv.lehrveranstaltung_id = lehre.tbl_anrechnung.lehrveranstaltung_id)');
$result = $this->AnrechnungsModel->loadWhere(
array('anrechnung_id' => $anrechnung_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function updateAnrechnung()
{
$this->load->library('form_validation');
$anrechnung_id = $this->input->post('anrechnung_id');
if(!$anrechnung_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Anrechnung UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$_POST['lehrveranstaltung_id'] =
(isset($formData['lehrveranstaltung_id']) && !empty($formData['lehrveranstaltung_id']))
? $formData['lehrveranstaltung_id']
: null;
$_POST['lehrveranstaltung_id_kompatibel'] =
(isset($formData['lehrveranstaltung_id_kompatibel']) && !empty($formData['lehrveranstaltung_id_kompatibel']))
? $formData['lehrveranstaltung_id_kompatibel']
: null;
$_POST['begruendung'] = (isset($formData['begruendung_id']) && !empty($formData['begruendung_id'])) ? $formData['begruendung_id'] : null;
$_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) ? $formData['genehmigt_von'] : null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AnrechnungsModel->update(
[
'anrechnung_id' => $anrechnung_id,
],
[
'lehrveranstaltung_id' => $_POST['lehrveranstaltung_id'],
'lehrveranstaltung_id_kompatibel' => $_POST['lehrveranstaltung_id_kompatibel'],
'begruendung_id' => $_POST['begruendung'],
'genehmigt_von' => $_POST['genehmigtVon']
]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function deleteAnrechnung($anrechnung_id)
{
// Start DB transaction
$this->db->trans_begin();
//delete anrechnung_id of table tbl_anrechnung_anrechnungstatus
$this->load->model('education/Anrechnunganrechnungstatus_model','AnrechnungAnrechnungstatusModel');
$result = $this->AnrechnungAnrechnungstatusModel->delete(
array('anrechnung_id' => $anrechnung_id)
);
$this->getDataOrTerminateWithError($result);
//delete anrechnung_id of table tbl_anrechnung
$result = $this->AnrechnungsModel->delete(
array('anrechnung_id' => $anrechnung_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->db->trans_commit();
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,257 @@
<?php
/**
* Copyright (C) 2024 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 <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about archive documents
* Listens to ajax post calls to change the archive documents
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Archiv extends FHCAPI_Controller
{
/**
* Calls the parent's constructor and prepares libraries and phrases
*/
public function __construct()
{
parent::__construct([
'getArchiv' => ['admin:r', 'assistenz:r'],
'getArchivVorlagen' => ['admin:r', 'assistenz:r'],
'archive' => ['admin:w', 'assistenz:w'],
'download' => ['admin:w', 'assistenz:w'],
'update' => ['admin:w'],
'delete' => ['admin:w', 'assistenz:w'],
]);
// Load models
$this->load->model('crm/Akte_model', 'AkteModel');
$this->load->model('system/Vorlage_model', 'VorlageModel');
// Load language phrases
$this->loadPhrases([
'archiv'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Get archive documents for a person
* @return void
*/
public function getArchiv()
{
$person_id = $this->input->get('person_id');
$this->load->library('form_validation');
if (!$person_id || !is_array($person_id))
{
$this->form_validation->set_rules('person_id', 'Person ID', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AkteModel->getArchiv($person_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* Get Vorlagen for archiving documents
* @return void
*/
public function getArchivVorlagen()
{
$result = $this->VorlageModel->getArchivVorlagen();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
*
* @param
* @return object success or error
*/
public function download()
{
$akte_id = $this->input->get('akte_id');
if (!is_numeric($akte_id)) $this->terminateWithError('akte Id missing');
$result = $this->AkteModel->load($akte_id);
if (!hasData($result)) $this->terminateWithError('Akte not found');
$data = getData($result)[0];
$fileObj = new stdClass();
if (isset($data->inhalt) && $data->inhalt != '')
{
// Define handle to output stream
$tmpFilePointer = fopen("php://output", 'w');
$meta_data = stream_get_meta_data($tmpFilePointer);
$filename = $meta_data["uri"];
fwrite($tmpFilePointer, $data->inhalt);
header('Content-Description: File Transfer');
header('Content-Type: '. $data->mimetype);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
//header('Content-Length: ' . filesize($fileObj->file));
//header("Content-type: $data->mimetype");
header('Content-Disposition: attachment; filename="'.$data->titel.'"');
readfile($filename);
die();
}
else
{
$this->load->library('AkteLib');
$result = $this->aktelib->get($akte_id);
}
}
/**
* Updating an Akte
* @return void
*/
public function update()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('akte_id', 'Akte Id', 'required');
$this->form_validation->set_rules('signiert', 'Signiert', 'is_bool');
$this->form_validation->set_rules('stud_selfservice', 'Self-Service', 'is_bool');
//Events::trigger('konto_update_validation', $this->form_validation);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$id = $this->input->post('akte_id');
// get the akte
$result = $this->AkteModel->load($id);
if (!hasData($result)) $this->terminateWithError("Akte not found!");
$akte = getData($result)[0];
$allowed = [
'signiert',
'stud_selfservice'
];
$data = [
'updateamum' => date('c'),
'updatevon' => getAuthUID()
];
// if Akte has Inhalt directly in Akte table
if (isset($_FILES['datei']['tmp_name']))
{
$this->addMeta('read', "read");
// update inhalt directly
// get tmp file
$filename = $_FILES['datei']['tmp_name'];
// open it
$fp = fopen($filename,'r');
// read it
$content = fread($fp, filesize($filename));
fclose($fp);
// encode it
$data['inhalt'] = base64_encode($content);
$this->addMeta('content', base64_encode($content));
}
foreach ($allowed as $field)
if ($this->input->post($field) !== null)
$data[$field] = $this->input->post($field);
$this->addMeta("data", $data);
$result = $this->AkteModel->update($id, $data);
$this->getDataOrTerminateWithError($result);
$result = null;
$this->terminateWithSuccess($result);
}
/**
* Delete archived Akte
*
* @return void
*/
public function delete()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('akte_id', 'Akte ID', 'required');
$this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'has_permissions_for_stg[admin:rw,assistenz:rw]');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$akte_id = $this->input->post('akte_id');
$result = $this->AkteModel->load($akte_id);
if (!hasData($result))
{
$this->terminateWithError($this->p->t('archiv', 'error_missing', [
'akte_id' => $akte_id
]));
}
$result = getData($result)[0];
if ($result->dokument_kurzbz == 'Ausbvert'
&& isset($result->akzeptiertamum)
&& !isEmptyString($result->akzeptiertamum)
&& !has_permissions_for_stg($this->input->post('studiengang_kz'), 'admin:rw')
)
{
$this->terminateWithError($this->p->t('archiv', 'nur_admins_loschen_ausbildungsvertraege', [
'akte_id' => $akte_id
]));
}
$result = $this->AkteModel->delete($akte_id);
if (isError($result)) $this->terminateWithError(getError($result));
$this->terminateWithSuccess();
}
}

Some files were not shown because too many files have changed in this diff Show More