Compare commits

...
Author SHA1 Message Date
Alexei Karpenko 10492dea0c Plausichecks GUI: changed Studierendenverwaltung link to new Plausichecks 2026-08-20 13:25:07 +02:00
Alexei Karpenko 2e39da7d12 plausichecks gui: correct default studiensemester even if in summer gap 2026-08-19 17:12:00 +02:00
Alexei Karpenko 24b4981079 Merge branch 'master' into feature-68834/Fehlermonitoring_Issues_weitere_features 2026-08-19 17:07:40 +02:00
Alexei Karpenko b0d933a13f FehlerUpdateLib: check that array index exists, IssuesLib: correct person Id check 2026-08-19 15:55:53 +02:00
Harald Bamberger 9f54ecce54 Merge branch 'epic/LVEvaluierung-Neu' 2026-08-19 13:59:00 +02:00
Cristina 7af0f4a478 Merge remote-tracking branch 'origin/epic/LVEvaluierung-Neu' into epic/LVEvaluierung-Neu 2026-08-19 13:35:25 +02:00
Cristina 0f843db33d Merge branch 'master' into epic/LVEvaluierung-Neu 2026-08-19 13:34:53 +02:00
Cristina 3e59648d5b Merge branch 'master' into epic/LVEvaluierung-Neu 2026-08-19 12:55:38 +02:00
Cristina 5923991848 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-08-19 12:55:03 +02:00
Harald Bamberger 55a6ec9d0d fix handling of grundbetrag and betrag_valorisiert 2026-08-19 11:48:22 +02:00
chfhtw 78505589c8 Bugfix: racecondition renderers 2026-08-19 09:45:15 +02:00
Harald Bamberger 0e985113ec Merge branch 'feature-77666/Details_anzeigen_der_Valorisierung_pro_Person' 2026-08-19 08:20:42 +02:00
Harald Bamberger 8d9113d5c8 Merge branch 'master' into feature-77666/Details_anzeigen_der_Valorisierung_pro_Person 2026-08-19 08:06:16 +02:00
Harald Bamberger 7ce81ad4bd Merge branch 'feature-78292/dv_gehaltsbestandteil_ersteinstufung' 2026-08-19 07:57:07 +02:00
Harald Bamberger ea56ec8daa change wording 2026-08-19 07:50:50 +02:00
Harald Bamberger bf5ee2f64b Merge branch 'feature-78139/CIS4_Dashboard_ausgeblendete_Widgets' 2026-08-18 17:51:40 +02:00
Harald Bamberger 55d6d90fa6 Merge branch 'master' into feature-78139/CIS4_Dashboard_ausgeblendete_Widgets 2026-08-18 17:47:13 +02:00
Harald Bamberger 6adc55a843 Merge branch 'feature/78128-quick-copy-full-name-and-title' 2026-08-18 17:39:44 +02:00
Harald Bamberger 52c1fba17b Merge branch 'bugfix/78127-degree-programs-page-localization-ineffective' 2026-08-18 16:53:49 +02:00
Cristina 5e15d4b219 Add Distinct to getLeitung in Studiengang_model.php
Avoid multiple records for same active STGL.
e.g. double entries
2026-08-18 16:51:39 +02:00
Harald Bamberger 00954f680b Merge branch 'bugfix/78392-missing-searchbar-is-mobile-injectable' 2026-08-18 16:48:43 +02:00
Harald Bamberger 92d27fc242 Merge branch 'master' into feature/78128-quick-copy-full-name-and-title 2026-08-18 14:52:41 +02:00
Harald Bamberger f6bb27cdb0 Merge branch 'master' into bugfix/78127-degree-programs-page-localization-ineffective 2026-08-18 14:49:16 +02:00
Harald Bamberger 558963cd74 Merge branch 'master' into feature-78139/CIS4_Dashboard_ausgeblendete_Widgets 2026-08-18 14:42:44 +02:00
Harald Bamberger 0b5c0f27a5 Merge branch 'bugfix/77738-persisting-lv-menu' 2026-08-14 11:58:42 +02:00
adisposkofh f846bb221a refetching lv menu after a different calendar event is selected 2026-08-14 11:47:31 +02:00
Werner Masik d8355ba3f5 added Funktionsänderung to gehaltsanpassungtyp 2026-08-13 14:56:04 +02:00
Harald Bamberger 6d5a4531e1 use tbl_studentlehrverband.semester instead of tbl_student.semester 2026-08-12 16:58:21 +02:00
Werner Masik d85a3cb08f extract DB migration for gehaltsanpassungtyp into separate file 2026-08-12 15:18:35 +02:00
Harald Bamberger c81b5338de Merge branch 'master' into feature-78292/dv_gehaltsbestandteil_ersteinstufung 2026-08-12 11:39:49 +02:00
Harald Bamberger c433ff5c3a remove public/vendor symlink since created by composer install 2026-08-12 11:39:16 +02:00
Harald Bamberger ab2a0e93ed add public/vendor to .gitignore 2026-08-12 11:38:02 +02:00
Harald Bamberger d139c4ed66 Merge branch 'bug-78432/StudVw_Baum_fehlende_Route' 2026-08-12 10:23:23 +02:00
chfhtw dd410a74ba Add missing routes for StudVw 2026-08-12 10:14:02 +02:00
Harald Bamberger 5c69ede19e Merge branch 'feature-78257/StudVW_Finetuning' 2026-08-11 17:53:06 +02:00
Harald Bamberger a5257eb934 rearange tiles, use placeholder if uid is not set 2026-08-11 17:50:33 +02:00
Harald Bamberger 317da29376 Merge branch 'master' into feature-78257/StudVW_Finetuning 2026-08-11 16:26:36 +02:00
adisposkofh 772b8c603c fixed issue with ineffective localization of courses in 'degree programs' page 2026-08-11 15:50:24 +02:00
Cristina 37d5f2da5d Merge branch 'master' into epic/LVEvaluierung-Neu 2026-08-11 15:45:27 +02:00
Cristina 27c39cfdca Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-08-11 15:45:08 +02:00
chfhtw 30c4e565dd bugfix: sprache index in studentlistlib corrected 2026-08-11 15:08:34 +02:00
Werner Masik d66fe72cc9 add field for salary adaption type (Ersteinstufung, indiv. Erhöhung, ..) 2026-08-11 11:18:36 +02:00
Harald Bamberger 684d4f890a Merge branch 'master' into feature-78257/StudVW_Finetuning 2026-08-11 10:49:05 +02:00
Harald Bamberger 10218305db Merge branch 'bug-78116/StudStatus_sendStglSammelmail_empty_list' 2026-08-11 10:40:26 +02:00
ma0068 31bae9b693 use function getStgAndDetails instead of getStgAndSem 2026-08-11 09:48:17 +02:00
adisposkofh 59ac56374e removed redundant response meta used for dev 2026-08-11 09:44:41 +02:00
adisposkofh a397460e0e Merge branch 'master' into feature/78128-quick-copy-full-name-and-title 2026-08-11 09:43:27 +02:00
Harald Bamberger c3c23d28bb Merge branch 'feature-76995/StudStatusModal_Hinweis_Beratungsgespraech_bei_Abmeldung' 2026-08-11 09:22:26 +02:00
Harald Bamberger 9f0b387ab6 use phrase ui/cancel instead of ui/abbrechen 2026-08-11 09:21:48 +02:00
Harald Bamberger 3a97f20122 add v-bind syntax to avoid prop type warning 2026-08-11 09:08:32 +02:00
Harald Bamberger 046a552f34 Merge branch 'master' into feature-76995/StudStatusModal_Hinweis_Beratungsgespraech_bei_Abmeldung 2026-08-11 08:11:55 +02:00
Harald Bamberger e8a534f0fe Cis MyLv Endpoints only require logged in user 2026-08-11 07:52:02 +02:00
Harald Bamberger 1f21ed7364 Merge branch 'feature-69378/Studienverlauf_verlinken_im_neuen_FAS' 2026-08-10 18:22:28 +02:00
Harald Bamberger 774a1b81c4 grades: change layout semester mode dropdown and gradelist link, details: remove css class from noImage img tag 2026-08-10 18:21:24 +02:00
Harald Bamberger f566ea1ac3 Merge branch 'master' into feature-69378/Studienverlauf_verlinken_im_neuen_FAS 2026-08-10 18:06:00 +02:00
adisposkofh 108f91ea1a quick copy option on full name and title in profile and other lv plan 2026-08-10 17:09:31 +02:00
Harald Bamberger 4a92511b9b Merge branch 'tabulator-localization-minor-fixes' 2026-08-10 17:04:31 +02:00
adisposkofh dc5a846c10 defaulting searchbar isMobile injectable to false when not provided 2026-08-10 16:24:58 +02:00
adisposkofh 364477f0e9 merged master into 2026-08-10 15:58:21 +02:00
adisposkofh d2ca33e757 Merge branch 'master' into tabulator-localization-minor-fixes 2026-08-10 15:57:12 +02:00
Harald Bamberger 8bfd90e159 Merge branch 'master' into feature-69378/Studienverlauf_verlinken_im_neuen_FAS 2026-08-10 14:48:41 +02:00
Harald Bamberger 8d8a4e8ca6 Merge branch 'feature/76688-general-tabulator-issues_77080-persistence' 2026-08-10 14:29:40 +02:00
Harald Bamberger d710b4a9e4 Merge branch 'master' into feature/76688-general-tabulator-issues_77080-persistence 2026-08-10 13:11:12 +02:00
Werner Masik bd99f3f927 add db schema for gehaltsanpassungtyp 2026-08-10 12:20:30 +02:00
Cristina eeb1529b64 Merge branch 'master' into epic/LVEvaluierung-Neu 2026-08-10 12:07:45 +02:00
Cristina 98c3707802 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-08-10 12:07:01 +02:00
adisposkofh 43e9dad17d double checking if tabulator header filter inputs are filled in on preset application 2026-08-10 11:06:17 +02:00
Harald Bamberger a27fa50e42 Merge branch 'studvw_lvvw_2026_08_rc_77973_76688' 2026-08-10 09:16:11 +02:00
Harald Bamberger 196e9be728 comment in groups in lvvw treemenu to have them for drag and drop, add language and isMobile injects to prevent warnings from searchbar component, studvw clear selection when degree program changes, update fontawesome from 6.1.1 to 6.7.2 and primeicons from 5.0.0 to 6.0.1 to prevent glyph bbox warnings in ff browser console 2026-08-10 06:48:53 +02:00
Harald Bamberger a00f6363d9 add legacy bis links to app menu and needed phrases, consistently use appMenuLvPlanungItems computed for LvPlanung app menu extra items 2026-08-07 17:11:38 +02:00
adisposkofh a65b0d693f implemented spinner while tabulator preset is being applied 2026-08-07 12:02:52 +02:00
Harald Bamberger 736e897928 fix automated tags not found in stv search 2026-08-06 16:23:54 +02:00
Harald Bamberger 21f8bb39b5 reload list after rebuild tags for degree program or selection 2026-08-06 16:04:35 +02:00
Harald Bamberger cd87ecc2d9 fix assign batchUser 2026-08-06 15:00:35 +02:00
adisposkofh a3ae14b3f5 Merge branch 'master' into feature/76688-general-tabulator-issues_77080-persistence 2026-08-06 14:08:55 +02:00
adisposkofh 6cf4458dcd fixed ordering of columns in column filter while preset ios applied 2026-08-06 14:06:25 +02:00
Harald Bamberger 59b8d195c1 reaply TagHelper from 77417 to fix adding tags without reloading stv studentlist 2026-08-06 13:52:59 +02:00
ma0068 7926a2b201 add Tile PrestudentID to FHC Header 2026-08-06 13:26:33 +02:00
Harald Bamberger b6aa459b98 Merge branch 'feature-777242/StudVW_alternative_Contacting_ma0080' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-06 11:56:18 +02:00
Harald Bamberger 53a9fab70b use neutral phrase for webmail 2026-08-06 09:43:02 +02:00
Harald Bamberger 5182f13bdb add checked indicator to webmail client links when clicked 2026-08-06 09:34:16 +02:00
Harald Bamberger 804dfc9327 refactor and add localStorage for webmail mode 2026-08-06 08:14:05 +02:00
Harald Bamberger 74e2d1dcc5 ensure tabulator is rendered after required phrases are loaded, apply optionalTabulatorOptions column visibility if set and localstorage does not already contain user preferences 2026-08-06 07:46:16 +02:00
Cristina e5c8807f17 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-08-05 15:13:35 +02:00
Harald Bamberger af9e34a8ae Merge branch 'feature/76688-general-tabulator-issues_77080-persistence' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-05 13:48:03 +02:00
Harald Bamberger 10a97a80de add missing nav-language component import 2026-08-05 13:35:51 +02:00
Harald Bamberger abd2f831f2 Merge branch 'studvw_lvvw_2026_08_rc' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-04 16:58:03 +02:00
Harald Bamberger 9d7f48f52c Merge branch 'master' into studvw_lvvw_2026_08_rc 2026-08-04 16:57:43 +02:00
Harald Bamberger dd1a5064e4 tabs: add padding to prevent minimal horizontal scrolling 2026-08-04 16:54:53 +02:00
Harald Bamberger a3ca578b3d Merge branch 'studvw_lvvw_2026_08_rc' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-04 16:13:55 +02:00
Harald Bamberger e37321eeff Merge branch 'master' into studvw_lvvw_2026_08_rc 2026-08-04 16:13:36 +02:00
adisposkofh 505c71b18c reworked applying tabulator presets for efficiency 2026-08-04 16:10:40 +02:00
Harald Bamberger efde2e9601 Merge branch 'feature-76201/StudVWTabsBeibehalten' 2026-08-04 16:05:56 +02:00
Harald Bamberger 8f34142599 Merge branch 'master' into feature-76201/StudVWTabsBeibehalten 2026-08-04 16:04:01 +02:00
Harald Bamberger 6570cc1fd7 Merge branch 'bug-76780/StudVW_Messages_MultiAction_lock_SendButton_and_Modal_during_Sending' 2026-08-04 15:52:44 +02:00
Harald Bamberger fed0afd426 Merge branch 'master' into bug-76780/StudVW_Messages_MultiAction_lock_SendButton_and_Modal_during_Sending 2026-08-04 15:46:03 +02:00
Harald Bamberger 2c2c6efc5e Merge branch 'studvw_lvvw_2026_08_rc' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-04 15:41:37 +02:00
Harald Bamberger 0419286557 Merge branch 'master' into studvw_lvvw_2026_08_rc 2026-08-04 15:41:05 +02:00
Harald Bamberger 08f6bee2e4 Merge branch 'feature-775595/StudVW_Notizen_konfigurierbar' 2026-08-04 15:34:30 +02:00
Harald Bamberger cfa4dd8b8a add padding to filtercomponent tabulator-tableholder to prevent scrollbar covering a row in tables with few rows 2026-08-04 15:33:36 +02:00
Harald Bamberger ab637ded26 stv config: change default for notes showErweitert to false 2026-08-04 15:12:17 +02:00
Harald Bamberger 4c072aa819 Merge branch 'master' into feature-775595/StudVW_Notizen_konfigurierbar 2026-08-04 14:49:08 +02:00
Harald Bamberger f693f9d17c add padding to tabulator container, e.g. to make resizing of last column possible 2026-08-04 14:45:53 +02:00
chfhtw 2f86a1b017 Changing the edit button into a toggle 2026-08-04 10:46:08 +02:00
chfhtw 75ddbdf7c1 Recovery items on top 2026-08-04 10:24:29 +02:00
chfhtw d824334538 Hiding widgets should look like deleting and recovering is moved to the "add widget" popup 2026-08-04 09:42:18 +02:00
chfhtw 13515b2522 Bugfix: after a drag and drop operation, when resizing the page, the moved item stays in the drop position even if it has had a position in the resized layout 2026-08-04 09:40:47 +02:00
Harald Bamberger ecfe648bf5 Merge branch 'master' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-03 19:36:18 +02:00
Harald Bamberger bddd7b5d65 Merge branch 'bugfix/78150-other-lv-plan-displays-locked-profile-pics' 2026-08-03 19:31:12 +02:00
Harald Bamberger 2686aee158 avoid multiple assignments to one variable 2026-08-03 19:30:49 +02:00
Harald Bamberger b7a2198057 Merge branch 'feature/76688-general-tabulator-issues_77080-persistence' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-03 17:04:34 +02:00
Harald Bamberger bf6b588675 only select active rows with ctrl + a 2026-08-03 17:02:43 +02:00
adisposkofh b427788e04 renamed tabulator presets-related phrases 2026-08-03 17:02:40 +02:00
Harald Bamberger e7e561a4ba Merge branch 'feature/76688-general-tabulator-issues_77080-persistence' into studvw_lvvw_2026_08_rc_77973_76688 2026-08-03 16:29:21 +02:00
adisposkofh d9972c0d32 Merge branch 'feature/76688-general-tabulator-issues_77080-persistence' of github.com:FH-Complete/FHC-Core into feature/76688-general-tabulator-issues_77080-persistence 2026-08-03 16:28:16 +02:00
adisposkofh 6c03110442 removed redundant collapse-auto directives from table presets 2026-08-03 16:27:50 +02:00
adisposkofh f717fb462f fixed issue with tabulator applying preset before table is built 2026-08-03 16:27:26 +02:00
Harald Bamberger 640a7285e1 activate presets for stv list table and add default preset 2026-08-03 16:08:22 +02:00
Harald Bamberger e9fc0629f5 Merge branch 'feature/76688-general-tabulator-issues_77080-persistence' into studvw_lvvw_2026_08_rc_77973 2026-08-03 16:06:34 +02:00
Harald Bamberger 6f0279d451 Merge branch 'master' into feature/76688-general-tabulator-issues_77080-persistence 2026-08-03 14:58:07 +02:00
Harald Bamberger 2d73f97a25 Merge branch 'studvw_lvvw_2026_08_rc' into studvw_lvvw_2026_08_rc_77973 2026-08-03 14:49:42 +02:00
Harald Bamberger dcd6163198 fix typo 2026-08-03 14:49:11 +02:00
Harald Bamberger 9f68fe6b3b Merge branch 'feature-77973/StudVw-Feedback_Finetuning_bhmod' into studvw_lvvw_2026_08_rc 2026-08-03 11:18:34 +02:00
Harald Bamberger 7c9f6d89d6 move setting index_bezeichnung_mehrsprachig to StudentListLib 2026-08-03 10:43:53 +02:00
Harald Bamberger ea3d01d23b rebuild tags for degree programm or selection - split in multiple requests and render progressbar in loading modal 2026-08-03 08:37:45 +02:00
Harald Bamberger c4ffc7283d Merge branch 'master' into bug-76780/StudVW_Messages_MultiAction_lock_SendButton_and_Modal_during_Sending 2026-07-31 17:06:30 +02:00
Harald Bamberger 0fa663145d Merge branch 'master' into studvw_lvvw_2026_08_rc 2026-07-31 17:04:26 +02:00
Harald Bamberger b49831cae8 Merge branch 'bug-77253/StudVw_Abschlusspuefung_ImproveDropDownAkadGrad' 2026-07-31 16:59:30 +02:00
Harald Bamberger c616e9d450 Merge branch 'master' into bug-77253/StudVw_Abschlusspuefung_ImproveDropDownAkadGrad 2026-07-31 16:42:28 +02:00
Harald Bamberger 9b0607ca74 use refactored routes 2026-07-31 16:34:32 +02:00
Harald Bamberger 3d728fd884 Merge branch 'master' into studvw_lvvw_2026_08_rc 2026-07-31 15:51:35 +02:00
chfhtw 2b4aef5633 Merge branch 'feature-77417/studvw-tags-formatter-and-header-filter' into studvw_lvvw_2026_08_rc 2026-07-31 12:52:29 +02:00
Harald Bamberger dca30dccf3 Merge branch 'bug-78215/LVPlanEintraege_in_Sommerluecke_werden_nicht_immer_angezeigt' 2026-07-31 11:05:54 +02:00
Harald Bamberger b9d4aefd5e add meta info 2026-07-31 11:02:46 +02:00
Harald Bamberger 69048f8f48 bugfix semester calculation between semesters 2026-07-31 09:51:04 +02:00
adisposkofh 36fe0a0f3c including non-localized column title in column filter collapsible 2026-07-29 15:26:07 +02:00
adisposkofh c5e296d557 replacing language injectable with computed property 2026-07-29 13:48:08 +02:00
adisposkofh d1ca6eb988 reworked other lv plan view data controller using profil library 2026-07-29 11:28:13 +02:00
adisposkofh be4db980ad fixed issue with displayed locked profile images in other lv plan 2026-07-29 11:17:03 +02:00
ma0048 0ef905c6f2 use language index 2026-07-29 11:15:24 +02:00
ma0048 21f0b18af4 merged #75959 and added horizontalsplit to lvverwaltung 2026-07-29 10:52:02 +02:00
adisposkofh 6a786df198 disabling columns, header filters, sort persistence in tabulator where presets are used 2026-07-29 09:56:00 +02:00
ma0048 4e16220da1 Merge remote-tracking branch 'origin/feature-75959/StudVw_Automatische_Tags' into studvw_lvvw_2026_08_rc
# Conflicts:
#	application/controllers/api/frontend/v1/stv/Students.php
2026-07-29 09:53:48 +02:00
Harald Bamberger 5ce02d747c lvvw apps menu fix reports links using studiengang_kz 2026-07-29 08:50:50 +02:00
Harald Bamberger 9c31b27339 set vuejs app names 2026-07-28 16:23:56 +02:00
Harald Bamberger aa52c32d40 Merge branch 'feature-77372/lv_verwaltung_release_fine_tuning' into studvw_lvvw_2026_08_rc 2026-07-28 15:50:06 +02:00
Harald Bamberger 02a97fb0e2 Merge branch 'feature-76160/StudVw_Verbandsbaum_durch_Extensions_erweiterbar_machen' into studvw_2026_08_rc 2026-07-28 15:35:54 +02:00
adisposkofh 2107c0839f removed obsolete testing lines in lvv 2026-07-28 12:49:40 +02:00
adisposkofh b277725cc3 displaying name of applied tabulator preset (w/ 'modified' marker as necessary) 2026-07-28 12:48:28 +02:00
Harald Bamberger aade60179d Merge branch 'master' into studvw_2026_05_rc_tags 2026-07-28 11:46:32 +02:00
adisposkofh e029b09add persisting tabulator preset in local storage 2026-07-27 16:53:07 +02:00
adisposkofh 47b9e6c086 removed redundant declared emit in tabulator presets 2026-07-27 16:11:47 +02:00
adisposkofh 2fa8fd1703 resolved warning; checking tabulator init before calling getLang in custom module 2026-07-27 16:08:17 +02:00
adisposkofh 89ea4187fa merged master into 2026-07-27 15:58:08 +02:00
chfhtw 0e099b2752 Remove deprecated files and lv_favorites variable 2026-07-24 14:05:50 +02:00
chfhtw d7f383b969 stud & lv verwaltung: add component to each route (childroutes should inherit those but a warning is thrown) 2026-07-24 10:57:40 +02:00
ma0048 a22a8acf83 fixed drag and drop 2026-07-24 09:12:12 +02:00
chfhtw 5c7df11ff3 Phrase corrected 2026-07-23 15:05:26 +02:00
chfhtw c83674fc41 StudentListLib: store where clauses and add it in later in execute function to prevent errors like in Task:78115 2026-07-23 15:05:11 +02:00
ma0068 dcd17bb34f add Compatibility Mode for SOGO
add logic for BCC to default Mail Client Version
add phrases
2026-07-23 11:25:22 +02:00
Harald Bamberger ed1925b517 Merge branch 'master' into feature-76160/StudVw_Verbandsbaum_durch_Extensions_erweiterbar_machen 2026-07-23 09:11:43 +02:00
chfhtw e7d2d3502b Allow callables in $redirect_method 2026-07-22 16:45:23 +02:00
ma0068 54168c86b4 add Abstand 2026-07-22 14:41:59 +02:00
ma0068 a8dd995195 rebuild tags for whole studiengang / selection
refactor backend for multiaction rebuildTags
add phrases
refactor haederFilter
2026-07-22 14:11:07 +02:00
chfhtw f46a3c1f68 LvVerwaltung: add routes for orgform and adapt endpoint to accept lower case orgform_kurzbz 2026-07-22 10:36:38 +02:00
chfhtw ae56a4f2ed Move LvVerwaltung treemenu config to config file and disable groups & verband per default 2026-07-21 14:57:41 +02:00
Harald Bamberger 22b1f2822a fix typo 2026-07-21 14:45:07 +02:00
Harald Bamberger 1fd15e14d5 Merge branch 'master' into feature-76160/StudVw_Verbandsbaum_durch_Extensions_erweiterbar_machen 2026-07-21 14:06:04 +02:00
ma0068 1ae02d8ed8 refactor addTaginTable and deleteTagInTable, add missing logic for automated tags in case of manual adding 2026-07-21 13:35:31 +02:00
ma0068 7cda22f807 use language index for tags 2026-07-21 10:41:27 +02:00
ma0068 68292b60af add Tags Incoming and Preabbrecher 2026-07-20 17:36:54 +02:00
chfhtw 542590b470 Remove comment 2026-07-20 09:26:31 +02:00
chfhtw eb460fdc0a Fix buildApiUrl 2026-07-17 14:05:04 +02:00
chfhtw 65e76e951a Translate treemenu entries 2026-07-17 12:01:17 +02:00
chfhtw 43d69a5683 Add comma for better merging 2026-07-17 12:01:08 +02:00
Harald Bamberger 6c25a3b262 Merge branch 'feature-77537/Studvw_Feedback' into studvw_2026_05_rc_tags 2026-07-17 11:38:46 +02:00
Harald Bamberger 1f6c9e865b Merge branch 'bug-77392/StudVW_Dokumente_Nachreichlogik_fehlendeBezeichnung' into studvw_2026_05_rc_tags 2026-07-17 11:30:23 +02:00
Harald Bamberger 1abfbccb3e Merge branch 'bug-77399/AppMenu_Show_Toasts' into studvw_2026_05_rc_tags 2026-07-17 11:25:11 +02:00
Harald Bamberger 362d1c8bb0 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-07-17 11:22:50 +02:00
Harald Bamberger 25a61a56b7 Merge branch 'master' into studvw_2026_05_rc 2026-07-17 11:22:20 +02:00
Harald Bamberger afb210b0c2 Merge branch 'master' into studvw_2026_05_rc 2026-07-17 11:21:24 +02:00
chfhtw 0471f838b9 Remove empty lines for better merge compatibility 2026-07-17 07:46:11 +02:00
chfhtw 1c9d9d1ce5 Add additional computed instead of deleted props 2026-07-17 07:44:45 +02:00
chfhtw 379a99cb14 Add empty function to let git detect where to merge 2026-07-17 07:43:22 +02:00
chfhtw 0d29a9ba32 Revert fix for merge compatibility 2026-07-17 07:40:15 +02:00
chfhtw ed44732eef Remove things that where commented out 2026-07-17 07:39:50 +02:00
chfhtw d391d1f09c Move computed to the correct position to avoid merge conflicts 2026-07-16 11:43:51 +02:00
chfhtw a36ed55390 Add new props to beginning to avoid merge conflicts 2026-07-16 11:43:10 +02:00
chfhtw b0f317951b Add lvv_favorites 2026-07-15 16:18:39 +02:00
chfhtw f65135be1e For each treemenu seperate favorites 2026-07-15 16:18:19 +02:00
chfhtw b8d86ba628 Use luxon date formatters in studvw student list 2026-07-15 14:48:55 +02:00
ma0048 e9312dfbb3 lvverwaltung new release 2026-07-15 11:35:37 +02:00
ma0048 b21900d006 Merge remote-tracking branch 'origin/feature-70656/lvverwaltung_gruppen_im_baum_und_drag_and_drop' into feature-77372/lv_verwaltung_release_fine_tuning 2026-07-15 11:27:48 +02:00
chfhtw 11cfa670d6 Add dynamic tabulatorcolumns to lvverwaltung 2026-07-15 11:05:37 +02:00
chfhtw a94fbeba14 Only call reloadTable if a table was loaded 2026-07-15 11:05:37 +02:00
chfhtw e01b816ee8 Add treemenudata routes to lvverwaltung 2026-07-15 11:05:36 +02:00
chfhtw 52c90111cc Add treemenu to lvverwaltung 2026-07-15 11:01:03 +02:00
ma0048 012571d070 Merge remote-tracking branch 'origin/feature-69453/lv_verwaltung_karteireiter_noten' into feature-77372/lv_verwaltung_release_fine_tuning
# Conflicts:
#	public/js/components/Stv/Studentenverwaltung/Details/Noten/Teacher.js
#	public/js/components/Stv/Studentenverwaltung/Details/Noten/Zeugnis.js
2026-07-15 09:43:53 +02:00
ma0048 a2d10ae09d Merge remote-tracking branch 'origin/feature-69454/lvverwaltung_karteireiter_lv_termine' into feature-77372/lv_verwaltung_release_fine_tuning
# Conflicts:
#	application/controllers/api/frontend/v1/LvPlan.php
#	public/js/components/Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine/ListLehrveranstaltungstermine.js
2026-07-15 09:32:03 +02:00
ma0048 96bf45ceb0 Merge remote-tracking branch 'origin/feature-75410/lvverwaltung_finetuning' into feature-77372/lv_verwaltung_release_fine_tuning
# Conflicts:
#	system/phrasesupdate.php
2026-07-15 09:26:55 +02:00
ma0048 c233902fe2 Merge remote-tracking branch 'origin/feature-70746/lvverwaltung_lektorentausch' into feature-77372/lv_verwaltung_release_fine_tuning
# Conflicts:
#	application/libraries/LektorLib.php
2026-07-15 09:20:57 +02:00
ma0048 fd8de88abb Merge remote-tracking branch 'origin/bug-69283/scroll_verhalten_lv_verwaltung_anders_als_in_studierendenverwaltung' into feature-77372/lv_verwaltung_release_fine_tuning 2026-07-15 09:17:51 +02:00
ma0048 0ec2c8c543 Merge remote-tracking branch 'origin/bug-69492/bug_lvverwaltung_doppelte_eintraege' into feature-77372/lv_verwaltung_release_fine_tuning 2026-07-15 09:17:29 +02:00
ma0048 29738b6690 Merge remote-tracking branch 'origin/feature-69353/lv_verwaltung_stundensatz_auf_leer_setzen_geht_nicht' into feature-77372/lv_verwaltung_release_fine_tuning 2026-07-15 09:17:19 +02:00
Alexei Karpenko c5c29df6cc Gehaltsbestandteil, Gehaltsbestandteil_model: added gehaltstyp_bezeichnung 2026-07-14 20:51:41 +02:00
chfhtw 0b1d0fbe4c Merge branch 'master' into feature-76160/StudVw_Verbandsbaum_durch_Extensions_erweiterbar_machen 2026-07-14 14:31:51 +02:00
chfhtw 85807f5b8c Allow treemenu entries to become draggables 2026-07-14 14:21:39 +02:00
chfhtw a1950d179b draggable directive: better handling of falsy values, better cleanup, remove attributes on falsy value/effect 2026-07-14 14:21:09 +02:00
Harald Bamberger d4929c8e22 Merge branch 'studvw_2026_05_rc_tags' into feature-77537/Studvw_Feedback 2026-07-14 10:52:31 +02:00
Harald Bamberger 194b74e390 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-07-14 10:52:05 +02:00
Harald Bamberger ee70e43bfb Merge branch 'master' into studvw_2026_05_rc 2026-07-14 10:51:40 +02:00
Harald Bamberger f8d8d501ca Merge branch 'studvw_2026_05_rc_tags' into feature-77537/Studvw_Feedback 2026-07-13 14:42:54 +02:00
Harald Bamberger 7e6d670d82 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-07-13 14:32:51 +02:00
Harald Bamberger f3a3bfcab6 Merge branch 'master' into studvw_2026_05_rc 2026-07-13 14:30:36 +02:00
chfhtw d134509c90 Remove unused routes 2026-07-13 13:13:06 +02:00
chfhtw 4424c7d748 Handle "incoming" menu entry (in inout and prestudent filters) 2026-07-13 13:03:23 +02:00
chfhtw d436d8cb20 Check permissions for prestudent menu entry 2026-07-13 13:02:40 +02:00
Ivymaster 86c06e4756 BUG: issue fix for dropdown reposition errror 2026-07-10 11:50:07 +02:00
ma0068 3689c64b7b make also notizlayout configurable 2026-07-09 11:01:00 +02:00
ma0068 26ddd404c0 add geschlecht to dropdown and adapt default according to geschlecht 2026-07-09 08:57:17 +02:00
Harald Bamberger 2e33722674 Merge branch 'master' into studvw_2026_05_rc 2026-07-08 16:43:56 +02:00
Harald Bamberger b5e65cf072 Merge branch 'master' into studvw_2026_05_rc 2026-07-08 16:42:04 +02:00
chfhtw b991bbd9a5 Allow extra columns for studvw student list 2026-07-08 11:00:20 +02:00
chfhtw 5bed848aae Merge branch 'master' into feature-76160/StudVw_Verbandsbaum_durch_Extensions_erweiterbar_machen 2026-07-08 09:43:58 +02:00
Ivymaster f3b617d339 add removal of tag header sorting in LV and Student verwaltung 2026-07-07 17:13:51 +02:00
ma0068 a4c5f9946f change doku 2026-07-07 16:56:35 +02:00
Ivymaster 0be3505163 BUG: Add fix for tag dropdown issue during tag column drag 2026-07-07 16:50:44 +02:00
ma0068 81f0b7a4bf make showErweitert configurable 2026-07-07 16:43:01 +02:00
Ivymaster 6c550372a3 add definable tag column in modified helpers 2026-07-07 15:49:16 +02:00
ma0068 c86d6f4bf3 - enable opening in new tab with prevent.default
- rendering of maillinks
- useBCC without CC
2026-07-07 14:31:23 +02:00
chfhtw c59b24ab4a App urls for studierendenverwaltung (neu: /studvw) 2026-07-03 12:16:30 +02:00
ma0068 c194e94b5c add private email to detailHeader 2026-07-02 16:46:09 +02:00
ma0068 6d23f2b9fa Add Einstiegssemester
- calculate semester_berechnet also for Stati 'Aufgenommener','Bewerber','Wartender'
- show Einstiegssemester in DetailHeader for 'Aufgenommener','Bewerber','Wartender' and 'Interessent'
2026-07-02 15:58:23 +02:00
chfhtw 0b70153da0 throw 404 on endpoints with invalid studiengang 2026-07-02 15:32:20 +02:00
chfhtw 190d797d31 adapt routes and endpoints for getPrestudent, getStudent & getPerson 2026-07-02 14:36:30 +02:00
ma0068 fb1c7f8e90 Rename Lehraufträge to Lehrauftragsverwaltung 2026-07-02 08:12:06 +02:00
chfhtw 6428fccc48 Replace CoreRESTClient calls with $api calls in stv Studiensemester component and add logic to accept lowercase input (because it could come from the url) 2026-07-01 15:45:09 +02:00
ma0068 093e3d5c97 enable deletion of zgv and zgv master date with null and empty string 2026-06-30 15:43:19 +02:00
ma0068 9bc9e57deb add selectable to tabledownload in studentList 2026-06-30 14:28:12 +02:00
chfhtw 483d8f733f adapt routes and endpoints 2026-06-30 14:21:32 +02:00
Ivymaster eb885bfea7 BUG: fix issue with unexpected closing of tag filter dropdown 2026-06-30 14:20:04 +02:00
ma0068 be5aad7c33 only bind hover event if existing dropdown to avoid error 2026-06-30 11:15:32 +02:00
ma0068 b7940a5cce add mouse-over functionality to dropdowns LvPlanung and Notenspiegel 2026-06-30 10:53:15 +02:00
Ivymaster f9b3939d09 BUG: add issue fix for tag dropdown close on column drag 2026-06-30 10:33:24 +02:00
Ivymaster 69b19562f4 BUG: add issue fix for tag ordering 2026-06-30 10:27:16 +02:00
ma0068 9948060ed8 add shortcut str+alt for studentlist, add css for studentNames scrollable 2026-06-30 08:26:41 +02:00
ma0068 06ec020c1c make div for studentNames scrollable, do not show details in alert if ok 2026-06-30 08:25:46 +02:00
ma0068 01f2099c28 remove injection currentSemester, already as prop 2026-06-30 08:24:08 +02:00
chfhtw 9cb5d0895d Rework Treemenu endpoint and libraries 2026-06-29 16:12:32 +02:00
Ivymaster 086b271480 add implementation for custom tag filter in "LVVerwaltung" 2026-06-29 14:47:43 +02:00
Ivymaster 03b2d3d1a4 extracted some code related to tags from component to helper 2026-06-29 14:02:42 +02:00
ma0068 ff38731077 refactor rowSelectionChanged 2026-06-29 13:55:11 +02:00
Ivymaster 5399375bc1 add tags extraction from nested rows 2026-06-29 13:12:29 +02:00
ma0068 3e8445304c detailheader: append tagContainer only for one selected student 2026-06-29 11:40:32 +02:00
Ivymaster b047b95505 extracted repeated code to function in extendedHeaderFilter.js 2026-06-29 11:36:03 +02:00
ma0068 3e48401a04 add uids to success and error alerts 2026-06-29 11:16:10 +02:00
Ivymaster 48f07eb3ca added width buffer for tags display 2026-06-29 09:41:52 +02:00
Ivymaster db5339e4a5 BUG: Fix random issues found during testing 2026-06-27 17:54:24 +02:00
Ivymaster 4ed87b5c2b add custom tag filter 2026-06-27 12:29:28 +02:00
Harald Bamberger d680c3aa2b Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-06-26 15:17:02 +02:00
Harald Bamberger d98bdb9745 Merge branch 'master' into studvw_2026_05_rc 2026-06-26 15:16:37 +02:00
ma0068 90907d4276 add persistance pruefungsantritt_kurzbz to abschlusspruefung 2026-06-26 13:45:14 +02:00
chfhtw 4a283ebf5d rename menu => treemenu 2026-06-25 16:46:18 +02:00
chfhtw e27e64414a Merge branch 'master' into feature-76160/StudVw_Verbandsbaum_durch_Extensions_erweiterbar_machen 2026-06-25 16:34:09 +02:00
Ivymaster c47ac926d2 WIP 2026-06-25 15:23:41 +02:00
ma0068 f751df55b6 update query isPrestudentOutgoing to show only outgoing 2026-06-25 13:27:17 +02:00
ma0068 ecd6588ead edit default permissions: in core controller admin, in stv controller admin and assistance 2026-06-25 12:56:35 +02:00
ma0068 e7c133586b adding of 4 new colours and use shorter labels for automated tags 2026-06-25 08:47:00 +02:00
ma0068 d5ee6f9cc2 adapt query for outgoing students 2026-06-24 15:48:04 +02:00
ma0068 a721c1d14d add default permission assistenz:rw for tag functionality 2026-06-24 15:22:57 +02:00
ma0068 b662fa5fd3 show date of hochgeladenum in case of nachgereicht 2026-06-23 12:55:33 +02:00
ma0068 21886e30a3 refactor query getUnacceptedDocuments 2026-06-22 08:50:10 +02:00
ma0068 2ab2176795 use language index in all getting Functions for Tags 2026-06-19 13:50:19 +02:00
ma0068 df2f142f37 add toasts if no taken selections for Notenspiegel, LVplanung and Studienverlauf 2026-06-18 11:45:01 +02:00
Harald Bamberger c7bac03429 concat escaped string correct 2026-06-17 17:45:18 +02:00
Harald Bamberger 07d3b32279 fix typo 2026-06-17 17:23:05 +02:00
Harald Bamberger 245d0d3369 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-06-17 17:15:37 +02:00
Harald Bamberger d3d04c5a77 Merge branch 'master' into studvw_2026_05_rc 2026-06-17 14:44:25 +02:00
adisposkofh ff58f7a102 minor fix 2026-06-16 17:23:01 +02:00
adisposkofh c0ed296ba7 Revert "phrase typo fix"
This reverts commit a59f6085fe.
2026-06-16 17:21:15 +02:00
adisposkofh 2692806d4f not syncing dev-provided general table presets 2026-06-16 17:19:27 +02:00
adisposkofh a59f6085fe phrase typo fix 2026-06-16 16:59:36 +02:00
Harald Bamberger cce1c50495 override permission for all methods not only the overwritten ones 2026-06-15 16:46:31 +02:00
adisposkofh 4474a24ee2 streamlined collapsing table presets sub-collapsibles when tablePresets is collapsed 2026-06-11 14:09:45 +02:00
adisposkofh f59e5a20ea formatting preset info/new preset overviews 2026-06-11 13:36:26 +02:00
adisposkofh c9fe633706 localized tabulator preset backend error messages 2026-06-11 13:21:56 +02:00
adisposkofh 3ced1966f4 minor fix 2026-06-11 12:53:34 +02:00
adisposkofh 538223752b hiding preset info/new preset form when table presets section is collapsed 2026-06-11 12:38:57 +02:00
adisposkofh c9011fd6ed minor naming change in table presets 2026-06-11 11:30:42 +02:00
adisposkofh f0f9becc1f fixed new table preset info string formatting 2026-06-11 11:29:29 +02:00
adisposkofh 34c210a2a7 fixed table preset info string formatting 2026-06-11 11:27:43 +02:00
adisposkofh 7abd35d11b added tabulator preset phrases 2026-06-11 11:20:34 +02:00
adisposkofh d2c97d0238 check to sync table preset with modified config 2026-06-10 14:43:20 +02:00
adisposkofh 1d0ca15bcb passing generalPresets prop from filter to table presets 2026-06-09 17:02:02 +02:00
adisposkofh 0bb81b23e5 implemented table presets functionality 2026-06-09 16:07:55 +02:00
adisposkofh b3ae1b74ab implemented basic tabulator table presets ui 2026-06-03 16:53:55 +02:00
adisposkofh bf4b8348d2 defined cis profile tabulator columns collapse order 2026-06-03 09:18:40 +02:00
ma0068 22228478ad refactor addTaginTable and deleteTagInTable, add missing logic for automated tags in case of manual adding 2026-05-27 11:51:41 +02:00
Alexei Karpenko 2076752f40 Merge branch 'master' into feature-68834/Fehlermonitoring_Issues_weitere_features 2026-05-26 13:30:13 +02:00
Harald Bamberger ac6aa28680 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-05-26 11:01:39 +02:00
ma0068 f6f58642f5 update second occurence of id STORAGE_KEY 2026-05-26 10:57:26 +02:00
Harald Bamberger 57eec98604 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-05-26 09:38:06 +02:00
Harald Bamberger 1561aa55b7 correct model path 2026-05-26 09:37:49 +02:00
Harald Bamberger 35f4d23308 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-05-26 09:28:40 +02:00
Harald Bamberger bb366e4117 font color black on tag limette 2026-05-26 09:06:44 +02:00
ma0068 0ed56ca067 add config for userAutomatedTags 2026-05-22 14:04:32 +02:00
ma0068 b9c045382d add Hinweistext for Modal Hinweis Beratungsgespraech 2026-05-20 09:15:15 +02:00
Harald Bamberger c099eec7a7 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-05-19 17:29:52 +02:00
Harald Bamberger 0962e62e69 Merge branch 'feature-76202/HorizontalSplit_from_master' into studvw_2026_05_rc 2026-05-19 17:28:08 +02:00
Harald Bamberger dcd6cfd74b increase width of horizontal split 2026-05-19 17:26:46 +02:00
Harald Bamberger 5caab182b2 Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-05-19 17:12:37 +02:00
Harald Bamberger baaf941f25 Merge branch 'feature-75958/StudVW_DatenExport_wie_im_Fas' into studvw_2026_05_rc 2026-05-19 17:12:11 +02:00
Harald Bamberger 2e5e7afb4d slot end tag 2026-05-19 17:11:51 +02:00
Harald Bamberger 2c4626fd1a Merge branch 'studvw_2026_05_rc' into studvw_2026_05_rc_tags 2026-05-19 16:52:14 +02:00
Harald Bamberger 178638c006 Merge branch 'feature-75958/StudVW_DatenExport_wie_im_Fas' into studvw_2026_05_rc 2026-05-19 16:51:57 +02:00
Harald Bamberger 981c97173e add padding to export icon link 2026-05-19 16:51:24 +02:00
Harald Bamberger 49d5c46133 Merge branch 'feature-75959/StudVw_Automatische_Tags' into studvw_2026_05_rc_tags 2026-05-19 16:42:25 +02:00
Harald Bamberger 9fb00f6cbd remove orphaned end tag, add right padding 2026-05-19 16:40:18 +02:00
Harald Bamberger 7d3096c2e8 readd required assignments for tags removed during merge 2026-05-19 10:28:08 +02:00
Harald Bamberger ef2f9630a9 Merge branch 'feature-75959/StudVw_Automatische_Tags' into studvw_2026_05_rc_tags 2026-05-19 10:22:28 +02:00
Harald Bamberger 4d3c73c78f add join condition for notizzuordung via prestudent_id only 2026-05-19 10:21:56 +02:00
Harald Bamberger 1e226f4515 Merge branch 'master' into studvw_2026_05_rc_tags 2026-05-18 17:27:36 +02:00
Harald Bamberger ca8fe5bd19 Merge branch 'feature-75959/StudVw_Automatische_Tags' into studvw_2026_05_rc_tags 2026-05-18 17:27:06 +02:00
ma0068 e2497e1958 add Infomodal Beratungsgespraech in case of Abmeldung and configEntry 2026-05-18 17:25:48 +02:00
ma0068 d4e170037b add order Nachname, Vorname 2026-05-18 10:11:17 +02:00
ma0068 0326a01585 disable sendButton, show Spinner and prevent closeModal while sending Message 2026-05-15 14:14:22 +02:00
ma0068 7aba7aefb9 add order mitarbeiter_uid 2026-05-15 11:05:12 +02:00
ma0068 e5ae400686 Tab Abschlusspruefung: use searchPersons instead of Mitarbeiter and refactor Label for dropdown 2026-05-13 17:38:39 +02:00
chfhtw c468d350f3 outsource config to better read it and make reuse easier 2026-05-13 14:16:14 +02:00
ma0068 1b822fc8f8 reset config stv to readonly for automated tags 2026-05-11 15:15:06 +02:00
ma0068 368eded1fd remove frontend filtering list for studiensemester, update logs TagJob 2026-05-11 15:12:53 +02:00
ma0068 dbcacdddd6 add tagFilter for semester to students endpoint, add decoding jsonResult in Tags 2026-05-11 13:18:56 +02:00
Harald Bamberger 8b2ef4e832 Merge branch 'master' into feature-75959/StudVw_Automatische_Tags 2026-05-11 10:54:26 +02:00
ma0068 6fedb4b108 delete unused code 2026-05-11 10:07:28 +02:00
chfhtw a7cc07fe15 Add basic library and config for studvw 2026-05-11 09:31:08 +02:00
chfhtw e91f8e5ca4 Replace component and endpoint for Verband 2026-05-11 09:27:54 +02:00
ma0068 905c69c384 create log entries for Summary, Details and Errors 2026-05-11 09:20:59 +02:00
chfhtw c765c3c40a allow object as argument for drop directive to enable dynamic specification of allowed dragtypes 2026-05-11 09:20:42 +02:00
ma0068 6fa0a7c102 use injected studiensemester instead of api call for studiensemester 2026-05-08 11:53:47 +02:00
ma0068 7320dc448e correct bezeichnung interval.ende 2026-05-08 10:57:19 +02:00
ma0068 ede9323224 refactor manual triggering for double degree lib 2026-05-08 08:33:53 +02:00
ma0068 3dcf72d679 add semester filter for tags
- in detailheader: use currentSem for manual triggering and refactor formatter
- in list: preload list of ids with start and end for tabulator formatter to enable filtering
2026-05-07 17:36:34 +02:00
Harald Bamberger 8ce67a4726 Merge branch 'master' into studvw_2026_05_rc 2026-05-06 17:35:05 +02:00
Harald Bamberger bcfdf1e05c Merge branch 'feature-75838/UXImproveProjektarbeitSTVSprint247' into studvw_2026_05_rc 2026-05-06 17:33:33 +02:00
Harald Bamberger cb744799bd Merge branch 'feature-71776/StudVW_Abschlusspruefung_DropdownsPrueferAndMultiActionNewPruefung' into studvw_2026_05_rc 2026-05-06 17:27:26 +02:00
Harald Bamberger 90ebee25fe Merge branch 'feature-71775/StudVW_ChangeSem_Behaviour' into studvw_2026_05_rc 2026-05-06 16:28:44 +02:00
Harald Bamberger 3e8ed231a6 Merge branch 'feature-71392/StudVW_Einstiegssemester_bei_Interessenten_anzeigen' into studvw_2026_05_rc 2026-05-06 16:03:37 +02:00
Harald Bamberger 4c67b9d267 Merge branch 'feature-76202/HorizontalSplit_from_master' into studvw_2026_05_rc 2026-05-06 15:56:14 +02:00
Johann HoffmannandHarald Bamberger c16cf342cb horizontalsplit component analog to verticalsplit; also built it into Studentenverwaltung.js menu; added defaultRatio prop to both components which defaults to 50/50 seperation 2026-05-06 15:54:49 +02:00
Harald Bamberger d843f05922 Merge branch 'feature-76201/StudVWTabsBeibehalten' into studvw_2026_05_rc 2026-05-06 15:42:29 +02:00
Harald Bamberger 44e9b4dff1 Merge branch 'feature-76145/StudVW_Studienverlauf_in_AppMenu' into studvw_2026_05_rc 2026-05-06 15:41:41 +02:00
Harald Bamberger bda42ab347 Merge branch 'feature-75958/StudVW_DatenExport_wie_im_Fas' into studvw_2026_05_rc 2026-05-06 15:06:51 +02:00
Harald Bamberger b5b69878b8 Merge branch 'feature-75901/StudVW_AppMenue_neueVerlinkungen' into studvw_2026_05_rc 2026-05-06 14:40:17 +02:00
Harald Bamberger 6f17ddbbdf Merge branch 'feature-63428/Infomail_Foto' into studvw_2026_05_rc 2026-05-06 14:35:45 +02:00
ma0068 ef1347c7d5 - use function getAktOrNextSemester
- restructure single libs to isolate typeId of data
- refactor Job: use params, details output
- use functions insert, update, delete
- use timeperiode for getAllTags and checkIfExistingTag
- controller: rebuild function: change to POST
- updated insertVon Batchuser
2026-05-05 15:20:02 +02:00
ma0068 d1fa5f64c4 refactor TagJob, TagLib and single TagLibs for dynamic use of typeId, add temporary testfile application/libraries/tags/CoreFiftyFiveTagLib.php for testing person_id 2026-04-30 11:17:39 +02:00
Alexei Karpenko 0c002b3969 issue checker: added space between heading and refresh symbol, removed px class for more flexibility 2026-04-29 16:13:46 +02:00
ma0068 21eb95bb23 manually triggering of updateTag 2026-04-28 16:24:30 +02:00
ma0048 b57836c2af fixed bug 2026-04-28 14:17:23 +02:00
ma0048 e80ee03365 fixed bug 2026-04-28 14:13:22 +02:00
ma0068 e856c8ad6b change settings bezeichnung_mehrsprachig::varchar[] in TagController functions getTag and getTags 2026-04-27 10:01:54 +02:00
ma0068 2723d6a741 get Semester of Model instead of Using CONST, delete unused models 2026-04-24 14:07:14 +02:00
ma0068 e5e22931a9 add db queries for update system, update tags in config 2026-04-24 12:49:00 +02:00
ma0068 21ea277aaf use checks for param studiengang_kurzbz instead of deleting it 2026-04-24 09:20:37 +02:00
ma0068 2c0badf67c bugfix error undefined offset: deletion of unused variable studiengang_kz 2026-04-23 17:28:43 +02:00
ma0068 5e72161ab0 add variables from and to to show time of validity in backend
refactor function getZuordnungIds of all single tagLibs
add description line for editing/showing modal tag
2026-04-23 16:39:21 +02:00
Alexei Karpenko 2307565696 Plausicheckresolverlib: changed comment 2026-04-20 15:37:08 +02:00
ma0068 903f3b99b3 add Studienverlauf to AppMenue 2026-04-20 11:36:54 +02:00
ma0068 df9edc36e0 save temporary 2026-04-20 08:40:55 +02:00
Alexei Karpenko ace2057166 Plausichecks InaktiverStudentAktiverStatus, ZuVieleZweckeIncomingPlausi: ptimized for issue production without Datenverbund, semester for resolving InaktiverStudentAktiverStatus optional 2026-04-17 16:01:33 +02:00
ma0068 39f1716ae2 set all automatic tags to readonly, add icon lock to automatic tags 2026-04-17 10:47:45 +02:00
Harald Bamberger c7b25e6632 add name to TagComponent, combine action slot definition for tagcomponent with definition for filter active 2026-04-16 16:21:33 +02:00
Harald Bamberger 695f3455e6 add function generateCSSsIncludeIfExtensionCssExists and use to load additional tag.css from extensions if exists 2026-04-16 15:20:11 +02:00
Alexei Karpenko 2428589bca Issues: Geburtsnation fehlt, Falscher Incoming Zweck: added person Id, added issue checker component to Studierendenverwaltung header, added comments to issues, set some issues to self-resolving, Plausicheck GUI: issues from core, dvuh and bis are displayed 2026-04-16 02:12:01 +02:00
ma0068 1339077b57 use single tagLibs for dynamisation
new tagLibs (doubleDegree, jgv, missingZgv, Outgoing, StudienbeitragErhoeht, Unterbrecher)
refactor tagJob rebuildAutomatedTags
2026-04-15 09:45:57 +02:00
Alexei Karpenko 953a04f24a added person id param to core plausichecks 2026-04-13 11:37:36 +02:00
Johann Hoffmann 3aebccbb9d track activeTab in StudVW Details.js and pass it to :default property of fhcTabs instances to attempt to set the last active tab to current, else use the old default tab of route.params.tab 2026-04-10 13:01:13 +02:00
ma0068 ee6f28c06d Refactor TagJob and TabLib: use dynamic approach with column taglib for creating Tags 2026-04-09 13:58:42 +02:00
Harald Bamberger fdb037da96 poc move logic for single tags to libs, and add lib loading path and name to extra column in tbl_notiztyp 2026-04-09 08:36:13 +02:00
ma0068 49cbbfc50c update user 2026-04-08 15:24:06 +02:00
ma0068 4f8e98f5d5 restyle button reloadTags 2026-04-08 15:11:58 +02:00
ma0068 e9e614aa52 Add Functionality Frontend: triggering of reloading tags for prestudent from studentHeader
Refactoring: Recycling of tags instead of deleting it and creating new ones
2026-04-08 14:26:14 +02:00
Alexei Karpenko 82d640b1f4 plausichecks: uhstatpersonenkennungfehlt issue: removed oe_kurzbz, added datenverbund issues to core plausicheck gui 2026-04-03 11:52:22 +02:00
ma0068 50af6694d0 show Tags in CoreHeader 2026-03-31 12:48:27 +02:00
ma0068 5dbddb4beb remove char 2026-03-27 09:46:48 +01:00
ma0068 b20613f5d7 Basic Structure Automatic Tagging
- new library libTag
- new Job TagJob
- new entries for automatic tags in config stv.php
- automatic tagging of wiederholer and prewiederholer
2026-03-27 09:40:14 +01:00
Alexei Karpenko 5b4e632526 issues, plausichecks: added producer for some core issues, producer lib: fehler with no config mappings are just ignored, plausicheck page optimizations (sorting etc) 2026-03-25 11:44:36 +01:00
Alexei Karpenko 5c2038fb79 Merge branch 'master' into feature-68834/Fehlermonitoring_Issues_weitere_features 2026-03-19 16:54:05 +01:00
Harald Bamberger 0621564be7 Merge branch 'master' into feature-71775/StudVW_ChangeSem_Behaviour 2026-03-19 15:57:13 +01:00
ma0068 f1714db09e add ExcelExport of FAS to StudentList, add slot additional to Filtercomponent 2026-03-19 15:00:51 +01:00
ma0068 70b025da30 add Link Reihungstestverwaltung to AppMenu 2026-03-17 14:59:05 +01:00
ma0068 87dd858358 add entry StudVw to navigation CI Menue 2026-03-17 14:58:39 +01:00
ma0068 51f3edcd72 delete not needed parameter orgform for html version lv planung 2026-03-17 12:57:55 +01:00
ma0068 e7f626bd72 add Lv-Planung to app menue 2026-03-17 12:49:40 +01:00
ma0068 17f94aabdf add loading skeletons for mitarbeiterHeader 2026-03-16 17:16:40 +01:00
ma0068 c49e32c4ac use skeletons for all data in studentHeader 2026-03-16 11:26:23 +01:00
ma0068 df124db84a use primeVue Skeleton while loading Data for Semester, Verband and Gruppe 2026-03-13 12:40:29 +01:00
ma0068 29a4b4aadc use permission PERM_LOGGED for header, add condition one empty space for showing verband 2026-03-13 09:11:00 +01:00
ma0068 2682ea75ab use only one endpoint for detailheader 2026-03-12 16:58:48 +01:00
ma0068 b3a63a60e9 update phrase noTextInSem 2026-03-12 16:02:44 +01:00
Harald Bamberger a54dfaf0c7 Merge branch 'master' into feature-71775/StudVW_ChangeSem_Behaviour 2026-03-12 15:20:53 +01:00
Harald Bamberger 595538d6bb Merge branch 'master' into feature-71775/StudVW_ChangeSem_Behaviour 2026-03-12 15:10:06 +01:00
Harald Bamberger a5329e5bba Merge branch 'master' into feature-71775/StudVW_ChangeSem_Behaviour 2026-03-12 15:03:56 +01:00
Harald Bamberger 37a79c4589 Merge branch 'master' into feature-71775/StudVW_ChangeSem_Behaviour 2026-03-12 15:03:28 +01:00
Harald Bamberger dd760f8210 finetune behavior 2026-03-12 11:10:13 +01:00
ma0068 dd87e893ba working version for relaod header and data without updateUrl 2026-03-11 17:13:59 +01:00
ma0068 127ce312ea reload Details and Detailheader without updateUrl 2026-03-10 08:28:11 +01:00
ma0068 2237e9f1b7 refactor detail Header, relaod array if semester changed, show no status if no status, phrase 2026-03-09 11:42:24 +01:00
ma0068 9b4fa132dc add status 2026-03-06 10:58:54 +01:00
Harald Bamberger daf332a102 add query_studiensemester_kurzbz to result of fetchStudents, fetchPrestudents and search 2026-03-06 10:39:37 +01:00
ma0048 7f91e20d03 lvverwaltung: vilesci lehrveranstaltung verwaltung verlinkt 2026-03-04 15:15:12 +01:00
ma0048 233a6e8b89 lvverwaltung:
- event hinzugefuegt damit tabs erweitert werden können
- berichte hinzugefuegt
2026-02-25 15:25:36 +01:00
ma0068 c127c0900e refactor dropdown for pruefer, add localStorage for formVariables, add multiactions for adding new finalexam 2026-02-25 14:28:41 +01:00
ma0068 fc01fa045e add and use variable semester_berechnet for using ausbildungssemester in status interessent 2026-02-23 13:44:33 +01:00
Alexei Karpenko 1b400f7d42 issuechecker: made details list optional, producer_controller: default value for apps 2026-02-12 22:36:42 +01:00
Alexei Karpenko 43811d5724 fehler/issue monitoring: enabled resolving/producing by app only, improved error messages, code layout, removed error: fehler to produce is not defined in config 2026-02-12 14:46:49 +01:00
ma0048 bb23679683 auskommentierten code entfernt 2026-02-12 10:45:32 +01:00
Alexei Karpenko 4c03668082 PlausiIssueProducer Controller: added default run method 2026-02-10 17:34:17 +01:00
Alexei Karpenko 10d52caa98 Issue system: adapted to work with multiple apps per fehler 2026-02-03 15:39:11 +01:00
Alexei Karpenko 2de6278603 IssueChecker: changed expected prop type of isseListStyle and issueListStyleBreakpoints 2026-01-29 11:46:52 +01:00
Alexei Karpenko 85db467cff issuechecker: layout, commented out _app property 2026-01-28 17:50:37 +01:00
Alexei Karpenko 1c65d6e076 plausicheckproducerlib, plausicheckresolverlib: added comments, resolver lib: loading producer lib only when calling resolvePlausicheckIssues, because producerlib is only needed for self-resolving logic in the resolvePlausicheckIssues method 2026-01-28 17:49:06 +01:00
Alexei Karpenko f72ea1a655 Pausicheckproducerlib: loading fehler config files with php without code igniter, due to naming index conflicts 2026-01-28 17:28:10 +01:00
Alexei Karpenko 413ccba64b fehler.php config: changed some fehler to warnings 2026-01-23 14:18:33 +01:00
Alexei Karpenko 9ccbb7b9e2 issuechecker: detailed issue list on click 2026-01-21 16:16:33 +01:00
Alexei Karpenko d6803a3947 Fehler update: enabled updating of fehler columns, added insertaum, insertvon, updateamum, insertvon 2026-01-20 18:56:43 +01:00
Alexei Karpenko 545e2b0445 Fehlerupdate: additional extension check, fehler_kurzbz optional 2026-01-20 17:02:47 +01:00
Alexei Karpenko 131ec86dee fehlerupdate: added check for app (existing in database?), code layout 2026-01-19 15:27:54 +01:00
ma0048 e26387a75a lektoren tausch auch bei verplanten lektoren hinzugefuegt 2026-01-19 15:08:59 +01:00
Alexei Karpenko cd03264ab4 Fehler: added fehlerupdate for adding missing fehler from config files to database 2026-01-16 13:09:11 +01:00
Alexei Karpenko c6232f7959 plausicheckresolver bugfixes, removed CONFIG_FEHLER_FILENAME constants 2026-01-15 17:08:05 +01:00
Alexei Karpenko cf2cc796b3 plausicheckproducerlib: extension fehler config files are loaded using code igniter 2026-01-15 16:26:16 +01:00
Alexei Karpenko 475888d4ac Merge branch 'master' into feature-68834/Fehlermonitoring_Issues_weitere_features 2026-01-14 16:52:55 +01:00
Alexei Karpenko 4b8b3c90fb plausicheck resolver: by default, all issues for fehlercodes provided in constructor are resolved 2026-01-14 16:15:33 +01:00
Alexei Karpenko b168ebb5f6 issues: changed logic to read producable issues from config file 2026-01-14 14:13:23 +01:00
ma0048 ab63bf9d74 gruppen in baum anzeigen und drag and drop von gruppen 2026-01-12 09:27:27 +01:00
Alexei Karpenko a259db2e7b issues: renamed method PersonenMitOffenenIssues, added expose to components 2025-12-19 16:09:38 +01:00
Alexei Karpenko 3e77d80d26 Issues: added possibility to display issues only when user is hauptzustaendig 2025-12-18 15:19:02 +01:00
Alexei Karpenko 2d71a436f6 IssueList: possible to pass endpoint dynamically 2025-12-16 17:30:25 +01:00
Alexei Karpenko 026bd6e247 moved issues controller to another folder 2025-12-15 18:00:05 +01:00
Alexei Karpenko 9c37215e62 issues: added issue controller for displaying issues, added issuechecker controller and component 2025-12-15 17:20:56 +01:00
ma0048 60f128b314 tabs gleichgezogen 2025-12-09 13:00:40 +01:00
ma0048 cc0a89c924 lvverwaltung noten hinzugefuegt
noten highlight wenn keine note im zeugnis eingetragen ist
2025-12-04 14:18:13 +01:00
ma0048 8f974e8902 sql angepasst 2025-12-03 08:37:38 +01:00
ma0048 a91fe05395 funktionen umbenannt 2025-12-02 13:23:09 +01:00
ma0048 d9cdeb9773 scroll verhalten angepasst 2025-12-02 08:42:04 +01:00
ma0048 0de033e428 termine tab hinzugefuegt 2025-12-01 10:55:04 +01:00
Alexei Karpenko 733a6a8c15 issues: added vue component for displaying issues in a table 2025-11-26 16:28:16 +01:00
Alexei Karpenko a24483188b issueproducer: use next studiensemester as well to avoid problems with semester august gap 2025-11-26 16:24:30 +01:00
ma0048 1ab9635039 disitnct lv id 2025-11-26 13:56:37 +01:00
ma0048 e7fdbe13d0 nullable felder speichern 2025-11-20 15:32:27 +01:00
chfhtw 00477528cc Bugfix: LVs without Stg should not throw an PHP error 2025-11-19 10:19:34 +01:00
chfhtw 4c6d645cc6 Studienverlauf verlinken im neuen FAS 2025-11-18 15:02:55 +01:00
Harald Bamberger f57dc6785b Merge branch 'master' into feature-63428/Infomail_Foto 2025-09-30 13:47:04 +02:00
ma0068 cf59bcff12 add Functionality sendInfomail
- expand InputComponent for dynamic adding of actionButton to Form Upload Image
- add Phrases for Infomail
2025-08-19 09:16:26 +02:00
268 changed files with 18528 additions and 4394 deletions
+1
View File
@@ -1,5 +1,6 @@
documents/
vendor/
public/vendor
/nbproject/
.vscode
+448
View File
@@ -0,0 +1,448 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$config['fehler'] = array(
array(
'fehlercode' => 'CORE_ZGV_0001',
'fehler_kurzbz' => 'zgvDatumInZukunft',
'fehlercode_extern' => null,
'fehlertext' => 'ZGV Datum in Zukunft',
'fehlertyp_kurzbz' => 'error',
'app' => array('core'),
'producerLibName' => 'ZgvDatumInZukunft',
'resolverLibName' => 'CORE_ZGV_0001',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_ZGV_0002',
'fehler_kurzbz' => 'zgvDatumVorGeburtsdatum',
'fehlercode_extern' => null,
'fehlertext' => 'ZGV Datum vor Geburtsdatum',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'ZgvDatumVorGeburtsdatum',
'resolverLibName' => 'CORE_ZGV_0002',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_ZGV_0003',
'fehler_kurzbz' => 'zgvMasterDatumInZukunft',
'fehlercode_extern' => null,
'fehlertext' => 'ZGV Masterdatum in Zukunft',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'ZgvMasterDatumInZukunft',
'resolverLibName' => 'CORE_ZGV_0003',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_ZGV_0004',
'fehler_kurzbz' => 'zgvMasterDatumVorZgvdatum',
'fehlercode_extern' => null,
'fehlertext' => 'ZGV Masterdatum vor Zgvdatum',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'ZgvMasterDatumVorZgvdatum',
'resolverLibName' => 'CORE_ZGV_0004',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_ZGV_0005',
'fehler_kurzbz' => 'zgvMasterDatumVorGeburtsdatum',
'fehlercode_extern' => null,
'fehlertext' => 'ZGV Masterdatum vor Geburtsdatum',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'ZgvMasterDatumVorGeburtsdatum',
'resolverLibName' => 'CORE_ZGV_0005',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0001',
'fehler_kurzbz' => 'keinAufenthaltszweckPlausi',
'fehlercode_extern' => null,
'fehlertext' => 'Kein Aufenthaltszweck gefunden',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'KeinAufenthaltszweckPlausi',
'resolverLibName' => 'CORE_INOUT_0001',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0002',
'fehler_kurzbz' => 'zuVieleZweckeIncomingPlausi',
'fehlercode_extern' => null,
'fehlertext' => 'Es sind %s Aufenthaltszwecke eingetragen (max. 1 Zweck für Incomings)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'ZuVieleZweckeIncomingPlausi',
'resolverLibName' => 'CORE_INOUT_0002',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0003',
'fehler_kurzbz' => 'falscherIncomingZweckPlausi',
'fehlercode_extern' => null,
'fehlertext' => 'Aufenthaltszweckcode ist %s (für Incomings ist nur Zweck 1, 2, 3 erlaubt)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'FalscherIncomingZweckPlausi',
'resolverLibName' => 'CORE_INOUT_0003',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0004',
'fehler_kurzbz' => 'outgoingAufenthaltfoerderungfehltPlausi',
'fehlercode_extern' => null,
'fehlertext' => 'Keine Aufenthaltsfoerderung angegeben (bei Outgoings >= 29 Tage Monat im Ausland muss mind. 1 gemeldet werden)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'OutgoingAufenthaltfoerderungfehltPlausi',
'resolverLibName' => 'CORE_INOUT_0004',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0005',
'fehler_kurzbz' => 'outgoingAngerechneteEctsFehlenPlausi',
'fehlercode_extern' => null,
'fehlertext' => 'Angerechnete ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'OutgoingAngerechneteEctsFehlenPlausi',
'resolverLibName' => 'CORE_INOUT_0005',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0006',
'fehler_kurzbz' => 'outgoingErworbeneEctsFehlenPlausi',
'fehlercode_extern' => null,
'fehlertext' => 'Erworbene ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'OutgoingErworbeneEctsFehlenPlausi',
'resolverLibName' => 'CORE_INOUT_0006',
'producerIsResolver' => false
),
/** Plausichecks **/
array(
'fehlercode' => 'CORE_INOUT_0007',
'fehler_kurzbz' => 'IncomingHeimatNationOesterreich',
'fehlercode_extern' => null,
'fehlertext' => 'Heimatnation bei Incoming Österreich',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'IncomingHeimatNationOesterreich',
'resolverLibName' => 'CORE_INOUT_0007',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0008',
'fehler_kurzbz' => 'IncomingOhneIoDatensatz',
'fehlercode_extern' => null,
'fehlertext' => 'Incoming hat keinen IO Datensatz (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'IncomingOhneIoDatensatz',
'resolverLibName' => 'CORE_INOUT_0008',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_INOUT_0009',
'fehler_kurzbz' => 'IncomingOrGsFoerderrelevant',
'fehlercode_extern' => null,
'fehlertext' => 'Incoming oder gemeinsames Studium ist nicht als nicht förderrelevant markiert. (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'IncomingOrGsFoerderrelevant',
'resolverLibName' => 'CORE_INOUT_0009',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STG_0001',
'fehler_kurzbz' => 'StgPrestudentUngleichStgStudent',
'fehlercode_extern' => null,
'fehlertext' => 'Studiengang des Prestudenten ist ungleich dem Studiengang des Studenten. (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'StgPrestudentUngleichStgStudent',
'resolverLibName' => 'CORE_STG_0001',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STG_0002',
'fehler_kurzbz' => 'OrgformStgUngleichOrgformPrestudent',
'fehlercode_extern' => null,
'fehlertext' => 'Es ist kein Studienplan mit Studiengang (%s) und Organisationsform (%s) des Studenten zugewiesen. (prestudent_id %s, Studiensemester %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'OrgformStgUngleichOrgformPrestudent',
'resolverLibName' => 'CORE_STG_0002',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STG_0003',
'fehler_kurzbz' => 'PrestudentMischformOhneOrgform',
'fehlercode_extern' => null,
'fehlertext' => 'Organisationsform ist für Studierenden/BewerberIn in Mischformstudiengang nicht eingetragen. (prestudent_id %s, Studiensemester %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'PrestudentMischformOhneOrgform',
'resolverLibName' => 'CORE_STG_0003',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STG_0004',
'fehler_kurzbz' => 'StgPrestudentUngleichStgStudienplan',
'fehlercode_extern' => null,
'fehlertext' => 'Studiengang des Prestudenten passt nicht zu Studiengang des Studienplans. (prestudent_id %s, Studienplan %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'StgPrestudentUngleichStgStudienplan',
'resolverLibName' => 'CORE_STG_0004',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0001',
'fehler_kurzbz' => 'AbbrecherAktiv',
'fehlercode_extern' => null,
'fehlertext' => 'AbbrecherIn hat aktiven Benutzer. (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'AbbrecherAktiv',
'resolverLibName' => null,
'producerIsResolver' => true
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0002',
'fehler_kurzbz' => 'StudentstatusNachAbbrecher',
'fehlercode_extern' => null,
'fehlertext' => 'Aktiver Status nach Abbrecher Status. (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'StudentstatusNachAbbrecher',
'resolverLibName' => 'CORE_STUDENTSTATUS_0002',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0003',
'fehler_kurzbz' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus',
'fehlercode_extern' => null,
'fehlertext' => 'Ausbildungssemester %s des aktuellen Status stimmt nicht mit Ausbildungssemester %s bei StudentIn (Lehrverband) überein. (student_uid %s, prestudent_id %s, Studiensemester %s)',
'fehlertyp_kurzbz' => 'warning',
'app' => 'core',
'producerLibName' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus',
'resolverLibName' => 'CORE_STUDENTSTATUS_0003',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0004',
'fehler_kurzbz' => 'InaktiverStudentAktiverStatus',
'fehlercode_extern' => null,
'fehlertext' => 'Inaktiver Benutzer hat aktiven Status. (prestudent_id %s)',
'fehlertyp_kurzbz' => 'warning',
'app' => 'core',
'producerLibName' => 'InaktiverStudentAktiverStatus',
'resolverLibName' => 'CORE_STUDENTSTATUS_0004',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0005',
'fehler_kurzbz' => 'InskriptionVorLetzerBismeldung',
'fehlercode_extern' => null,
'fehlertext' => 'Datum der Inskription liegt vor dem Datum der letzten BIS-Meldung %s. (prestudent_id %s, Studiensemester %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'InskriptionVorLetzerBismeldung',
'resolverLibName' => 'CORE_STUDENTSTATUS_0005',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0006',
'fehler_kurzbz' => 'DatumStudiensemesterFalscheReihenfolge',
'fehlercode_extern' => null,
'fehlertext' => 'Datum und Studiensemester sind bei den Status in falscher Reihenfolge. (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'DatumStudiensemesterFalscheReihenfolge',
'resolverLibName' => 'CORE_STUDENTSTATUS_0006',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0007',
'fehler_kurzbz' => 'AktiverStudentOhneStatus',
'fehlercode_extern' => null,
'fehlertext' => 'Aktive/r StudentIn ohne aktuellen Status (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'AktiverStudentOhneStatus',
'resolverLibName' => 'CORE_STUDENTSTATUS_0007',
'producerIsResolver' => false
),
//~ array(
//~ 'fehlercode' => 'CORE_STUDENTSTATUS_0008',
//~ 'fehler_kurzbz' => 'StudienplanUngueltig',
//~ 'fehlercode_extern' => null,
//~ 'fehlertext' => 'Studienplan %s ist im Ausbildungssemester %s nicht gültig (prestudent_id %s)',
//~ 'fehlertyp_kurzbz' => 'error',
//~ 'app' => 'core',
//~ 'producerLibName' => 'StudienplanUngueltig',
//~ 'resolverLibName' => 'CORE_STUDENTSTATUS_0008',
//~ 'producerIsResolver' => false
//~ ),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0009',
'fehler_kurzbz' => 'FalscheAnzahlAbschlusspruefungen',
'fehlercode_extern' => null,
'fehlertext' => 'Mehrere oder keine bestandenen Abschlussprüfungen (prestudent_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'FalscheAnzahlAbschlusspruefungen',
'resolverLibName' => 'CORE_STUDENTSTATUS_0009',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0010',
'fehler_kurzbz' => 'DatumAbschlusspruefungFehlt',
'fehlercode_extern' => null,
'fehlertext' => 'Kein Abschlussprüfung Datum (prestudent_id %s, abschlusspruefung_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'DatumAbschlusspruefungFehlt',
'resolverLibName' => 'CORE_STUDENTSTATUS_0010',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0011',
'fehler_kurzbz' => 'DatumSponsionFehlt',
'fehlercode_extern' => null,
'fehlertext' => 'Kein Sponsionsdatum (prestudent_id %s, abschlusspruefung_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'DatumSponsionFehlt',
'resolverLibName' => 'CORE_STUDENTSTATUS_0011',
'producerIsResolver' => false
),
//~ array(
//~ 'fehlercode' => 'CORE_STUDENTSTATUS_0012',
//~ 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten',
//~ 'fehlercode_extern' => null,
//~ 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)',
//~ 'fehlertyp_kurzbz' => 'warning',
//~ 'app' => 'core',
//~ 'producerLibName' => 'BewerberNichtZumRtAngetreten',
//~ 'resolverLibName' => 'CORE_STUDENTSTATUS_0012',
//~ 'producerIsResolver' => false
//~ ),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0013',
'fehler_kurzbz' => 'AktSemesterNull',
'fehlercode_extern' => null,
'fehlertext' => 'Aktuelles Ausbildungssemester ist 0 (prestudent_id %s, Studiensemester %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'AktSemesterNull',
'resolverLibName' => 'CORE_STUDENTSTATUS_0013',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0014',
'fehler_kurzbz' => 'AbschlussstatusFehlt',
'fehlercode_extern' => null,
'fehlertext' => 'Kein Abschlussstatus (prestudent_id %s)',
'fehlertyp_kurzbz' => 'warning',
'app' => 'core',
'producerLibName' => 'AbschlussstatusFehlt',
'resolverLibName' => 'CORE_STUDENTSTATUS_0014',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0015',
'fehler_kurzbz' => 'AktiverStudentstatusOhneKontobuchung',
'fehlercode_extern' => null,
'fehlertext' => 'Keine Kontobuchung bei aktivem Studentstatus (prestudent_id %s, Studiensemester %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'AktiverStudentstatusOhneKontobuchung',
'resolverLibName' => 'CORE_STUDENTSTATUS_0015',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_STUDENTSTATUS_0016',
'fehler_kurzbz' => 'DualesStudiumOhneMarkierung',
'fehlercode_extern' => null,
'fehlertext' => 'StudentIn in dualem Studiengang nicht als dual markiert (prestudent_id %s, Studienplan %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'DualesStudiumOhneMarkierung',
'resolverLibName' => 'CORE_STUDENTSTATUS_0016',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_PERSON_0001',
'fehler_kurzbz' => 'GbDatumWeitZurueck',
'fehlercode_extern' => null,
'fehlertext' => 'Geburtsdatum vor dem 01.01.1920',
'fehlertyp_kurzbz' => 'warning',
'app' => 'core',
'producerLibName' => 'GbDatumWeitZurueck',
'resolverLibName' => 'CORE_PERSON_0001',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_PERSON_0002',
'fehler_kurzbz' => 'NationNichtOesterreichAberGemeinde',
'fehlercode_extern' => null,
'fehlertext' => 'Nation der Adresse ist ungleich Österreich, es ist aber eine österreichische Gemeinde (%s) angegeben (adresse_id %s)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'NationNichtOesterreichAberGemeinde',
'resolverLibName' => 'CORE_PERSON_0002',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_PERSON_0003',
'fehler_kurzbz' => 'FalscheAnzahlHeimatadressen',
'fehlercode_extern' => null,
'fehlertext' => 'Es sind mehrere oder keine Heimatadressen eingetragen',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'FalscheAnzahlHeimatadressen',
'resolverLibName' => 'CORE_PERSON_0003',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_PERSON_0004',
'fehler_kurzbz' => 'FalscheAnzahlZustelladressen',
'fehlercode_extern' => null,
'fehlertext' => 'Es sind mehrere oder keine Zustelladressen eingetragen',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'FalscheAnzahlZustelladressen',
'resolverLibName' => 'CORE_PERSON_0004',
'producerIsResolver' => false
),
array(
'fehlercode' => 'CORE_PERSON_0005',
'fehler_kurzbz' => 'geburtsnationFehlt',
'fehlercode_extern' => null,
'fehlertext' => 'Geburtsnation nicht vorhanden',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'GeburtsnationFehlt',
'resolverLibName' => null,
'producerIsResolver' => true
),
array(
'fehlercode' => 'CORE_PERSON_0006',
'fehler_kurzbz' => 'uhstatPersonkennungFehltCore',
'fehlercode_extern' => null,
'fehlertext' => 'Personkennung fehlt (vBpk AS, vBpk BF oder Ersatzkennzeichen fehlt)',
'fehlertyp_kurzbz' => 'error',
'app' => 'core',
'producerLibName' => 'UhstatPersonkennungFehltCore',
'resolverLibName' => 'CORE_PERSON_0006',
'producerIsResolver' => false
)
);
+12 -1
View File
@@ -8,4 +8,15 @@ $config['lvverwaltung_tags'] = [
];
*/
$config['lvverwaltung_tags'] = [];
$config['lvverwaltung_tags'] = [];
# Additional columns:
/*
$config["list_columns"] = [
'fieldname' => [
'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; )
// NOTE: 'default' & 'joins' like in stv.php config are currently not available here
]
];
*/
+8 -1
View File
@@ -170,6 +170,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 51,
'requiredPermissions' => 'vertrag/mitarbeiter:r'
),
'studierendenverwaltung' => array(
'link' => site_url('studentenverwaltung'),
'description' => 'Studierendenverwaltung',
'expand' => true,
'sort' => 52,
'requiredPermissions' => ['admin:r', 'assistenz:r']
)
)
),
@@ -378,7 +385,7 @@ $config['navigation_menu']['apps'] = [
],
'lav' => [
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Lehraufträge',
'description' => 'Lehrauftragsverwaltung',
#'icon' => 'person-chalkboard',
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
]
+52 -37
View File
@@ -75,52 +75,67 @@ $route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
// Studierendenverwaltung App Routes
$route['studvw'] = 'studentenverwaltung/index';
$route['studvw/.*'] = 'studentenverwaltung/index';
// Old routes
$route['studentenverwaltung'] = 'redirect/301/studvw';
$route['studentenverwaltung/(:any)'] = 'redirect/301/studvw/stdsem/$1';
$route['studentenverwaltung/(:any)/(prestudent|student|person|search)/(:any)'] = 'redirect/301/studvw/stdsem/$1/$2/$3';
$route['studentenverwaltung/(:any)/prestudent/(:any)/tab/:any'] = 'redirect/301/studvw/stdsem/$1/prestudent/$2';
$route['studentenverwaltung/(:any)/search/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/search/$2/$3';
$route['studentenverwaltung/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/stg/$2';
// 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';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/incoming/1'] = 'api/frontend/v1/stv/students/getIncoming/$1';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/outgoing/1'] = 'api/frontend/v1/stv/students/getOutgoing/$1';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/shared_studies/1'] = 'api/frontend/v1/stv/students/getGemeinsamestudien/$1';
// (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';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudents/$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';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3';
$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2';
// (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';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4/$5';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2';
// (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';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3';
// (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';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsSpezialgruppe/$1/$2/$3/$4';
// (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';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgformSpezialgruppe/$1/$3/$2/$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';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/prestudent/(:any)'] = 'api/frontend/v1/stv/students/getPrestudent/$1/$2';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/student/(:any)'] = 'api/frontend/v1/stv/students/getStudent/$1/$2';
$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/person/(:any)'] = 'api/frontend/v1/stv/students/getPerson/$1/$2';
$route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/index';
// Lvverwaltung List Routes
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
// // (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'];
@@ -197,3 +197,11 @@ $config['unterbrechung_enabled'] = true;
*/
$config['wiederholung_enabled'] = true;
/**
* Modal with Infotext of TLC
* if true, there will be shown an info modal in the studentsView after the first button ABMELDUNG
*
* @var boolean
*/
$config['showInfoModalAbmeldung'] = true;
+47 -8
View File
@@ -1,6 +1,27 @@
<?php
$config['number_displayed_past_studiensemester_default'] = 5;
# Additional columns:
/*
$config["list_columns"] = [
'fieldname' => [
'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; )
'default' => "SQL SELECT statement for value",
'joins' => [
// additional joins needed for the SELECT statement above
[
'tablename',
'join condition', // single fieldname for USING or full condition for ON
'LEFT|RIGHT', // optional - join type
'after_xxx|before_xxx|end' // optional - position in query
]
// ...
]
]
];
*/
$config['tabs'] =
[
'details' => [
@@ -60,7 +81,13 @@ $config['tabs'] =
],
'notes' => [
//if true, the count of Messages will be shown in the header of the Tab Messages
'showCountNotes' => true
'showCountNotes' => true,
//if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt'
'showErweitert' => false,
//notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal"
'notizLayout' => 'popupModal'
],
'combinePeople' => [
//multitab should only be shown with this length of selection
@@ -133,13 +160,25 @@ $config['students_tab_order'] = [
$config['stv_prestudent_tags'] = [
'prioone' => ['readonly' => false],
'priotwo' => ['readonly' => true],
'priotwo' => ['readonly' => false],
'hinweis' => ['readonly' => false],
'hinweis_assistenz' => ['readonly' => true],
'hinweis_kf' => ['readonly' => true],
'hinweis_assistenz' => ['readonly' => false],
'hinweis_kf' => ['readonly' => false],
'hinweis_lehrende' => ['readonly' => false],
'hinweis_stg_kf' => ['readonly' => true],
'finished_stg' => ['readonly' => true],
'finished_kf' => ['readonly' => true],
'inwork_kf' => ['readonly' => true],
'hinweis_stg_kf' => ['readonly' => false],
'finished_stg' => ['readonly' => false],
'finished_kf' => ['readonly' => false],
'inwork_kf' => ['readonly' => false],
'dd_auto' => ['readonly' => true],
'wh_auto' => ['readonly' => true],
'prewh_auto' => ['readonly' => true],
'out_auto' => ['readonly' => true],
'zgv_auto' => ['readonly' => true],
'unterbrecher_auto' => ['readonly' => true],
'stbtr_erh_auto' => ['readonly' => true],
'jgv_auto' => ['readonly' => true],
'in_auto' => ['readonly' => true],
'preabbr_auto' => ['readonly' => true],
];
$config['userAutomatedTags'] = 'sftest';
@@ -1,5 +1,7 @@
<?php
/**
* Copyright (C) 2025 fhcomplete.org
* 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
@@ -15,29 +17,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export default {
get(path) {
let url = 'api/frontend/v1/lv/StgTree';
if (path)
url += '/' + path;
return {
method: 'get',
url
};
},
favorites: {
get() {
return {
method: 'get',
url: 'api/frontend/v1/lv/favorites'
};
},
set(favorites) {
return {
method: 'post',
url: 'api/frontend/v1/lv/favorites/set',
params: { favorites }
};
}
}
};
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['stv'] = [
"library" => "treemenu/StudVwLib",
"permissions" => ["admin:r", "assistenz:r"]
];
$config['lvv'] = [
"library" => "treemenu/LvVwLib",
"permissions" => ["admin:r", "assistenz:r"]
];
@@ -0,0 +1,32 @@
<?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');
$config['root'] = [
'stg' => [
'semester' => [
'group',
'verband' => [
'group'
]
],
'orgform'
]
];
+65
View File
@@ -0,0 +1,65 @@
<?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');
$config['root'] = [
'stg' => [
'prestudent' => [
'stdsem' => [
'interessenten' => [
'bewerbungnichtabgeschickt',
'bewerbungabgeschickt',
'zgv',
'statusbestaetigt' => [
'statusbestaetigtrtnichtangemeldet',
'statusbestaetigtrtangemeldet'
],
'reihungstestnichtangemeldet',
'reihungstestangemeldet'
],
'bewerber' => [
'bewerberrtnichtangemeldet',
'bewerberrtangemeldet' => [
'bewerberrtangemeldetteilgenommen',
'bewerberrtangemeldetnichtteilgenommen'
]
],
'aufgenommen',
'warteliste',
'absage',
'incoming'
]
],
'semester' => [
'group',
'verband' => [
'group'
]
]
],
'inout' => [
'incoming',
'outgoing',
'shared_studies'
]
];
// copy stg tree into stg/orgforms
$config['root']['stg']['orgform'] = $config['root']['stg'];
+44
View File
@@ -0,0 +1,44 @@
<?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 redirects urls to another location. This is mainly used
* with the $routes config
*/
class Redirect extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
/**
* Main function to handle all redirects.
*
* @param string $method - the redirect code (30x)
* @param array $params - the url to redirect to
*
* @return void
*/
public function _remap($method, $params)
{
redirect($params, 'location', $method);
}
}
@@ -20,8 +20,8 @@ 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 favorite verbände
* Listens to ajax post calls to change the favorite verbände data
* Provides data to the ajax get calls about favorite treemenu entries
* Listens to ajax post calls to change the favorite treemenu entries
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Favorites extends FHCAPI_Controller
@@ -29,7 +29,7 @@ class Favorites extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'index' => self::PERM_LOGGED,
'get' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
]);
@@ -37,19 +37,19 @@ class Favorites extends FHCAPI_Controller
$this->load->model('system/Variable_model', 'VariableModel');
}
public function index()
public function get($app)
{
$result = $this->VariableModel->getVariables(getAuthUID(), ['stv_favorites']);
$result = $this->VariableModel->getVariables(getAuthUID(), [$app . '_favorites']);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
$this->terminateWithSuccess(null);
else
$this->terminateWithSuccess($data['stv_favorites'] ?? null);
$this->terminateWithSuccess($data[$app . '_favorites'] ?? null);
}
public function set()
public function set($app)
{
$this->load->library('form_validation');
@@ -60,7 +60,7 @@ class Favorites extends FHCAPI_Controller
$favorites = $this->input->post('favorites');
$result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites);
$result = $this->VariableModel->setVariable(getAuthUID(), $app . '_favorites', $favorites);
$this->getDataOrTerminateWithError($result);
@@ -56,7 +56,9 @@ class Lehrveranstaltung extends FHCAPI_Controller
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
$studiengang_kz = $this->getStudiengangKz($stg_kz);
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
$tree = [];
@@ -75,15 +77,17 @@ class Lehrveranstaltung extends FHCAPI_Controller
$this->terminateWithSuccess($tree);
}
public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
{
$studiengang_kz = $this->getStudiengangKz($stg_kz);
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;
$verband = $this->getOrgformKurzbz($semester);
$semester = null;
}
@@ -260,18 +264,53 @@ class Lehrveranstaltung extends FHCAPI_Controller
}
}
protected function getStudiengangKz($studiengang_typ_kurzbz)
{
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->loadWhere([
'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz)
]);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
return null;
return current($data)->studiengang_kz;
}
private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
{
if (!is_null($studiensemester_kurzbz))
{
$studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere([
'LOWER(studiensemester_kurzbz)' => strtolower($studiensemester_kurzbz)
]);
if (isError($studiensemester_result) || !hasData($studiensemester_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$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);
}
protected function getOrgformKurzbz($orgform_kurzbz)
{
if ($orgform_kurzbz === null)
return null;
$this->load->model('codex/Orgform_model', 'OrgformModel');
$result = $this->OrgformModel->loadWhere([
'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz)
]);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
return $orgform_kurzbz;
return current($data)->orgform_kurzbz;
}
}
@@ -49,6 +49,8 @@ class LvPlan extends FHCAPI_Controller
'getLehrverband' => self::PERM_LOGGED,
'permissionOtherLvPlan' => self::PERM_LOGGED,
'compactibleEventTypes' => self::PERM_LOGGED,
'getLeEvents' => self::PERM_LOGGED,
'getLvEvents' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
@@ -60,7 +62,13 @@ class LvPlan extends FHCAPI_Controller
'dbExecuteUser' => 'RESTful API'
));
$this->load->library('form_validation');
$this->load->library('form_validation');
$this->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui'
)
);
}
//------------------------------------------------------------------------------------------------------------------
@@ -196,6 +204,38 @@ class LvPlan extends FHCAPI_Controller
));
}
public function getLeEvents($le_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
{
if (is_null($le_id) || is_null($start_date) || is_null($end_date))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->library('StundenplanLib');
$result = $this->stundenplanlib->getEventsByLE($le_id, $start_date, $end_date, $stundenplan);
$lvplanEvents = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($lvplanEvents);
}
public function getLvEvents($lv_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
{
if (is_null($lv_id) || is_null($start_date) || is_null($end_date))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->library('StundenplanLib');
$result = $this->stundenplanlib->getEventsByLV($lv_id, $start_date, $end_date, $stundenplan);
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
//TODO: delete this function if we don't use the old calendar export endpoints anymore
public function studiensemesterDateInterval($date)
{
@@ -17,60 +17,61 @@
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
exit('No direct script access allowed');
class OtherLvPlan extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
]);
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
]);
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->library('ProfilLib');
}
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* retrieves viewData for other lv plan view
* @access public
* @param $uid the userID for which the other lv plan is being viewed
*/
public function otherLvPlanViewData($uid)
{
$isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
$isMitarbeiter = getData($isMitarbeiterResult);
$isStudent = !$isMitarbeiter;
/**
* retrieves viewData for other lv plan view
* @access public
* @param $uid the userID for which the other lv plan is being viewed
*/
public function otherLvPlanViewData($uid)
{
$isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
$isMitarbeiter = getData($isMitarbeiterResult);
$isStudent = !$isMitarbeiter;
$this->BenutzerModel->addSelect(["foto", "vorname", "nachname"]);
$this->BenutzerModel->addJoin("tbl_person", "person_id");
$personResult = $this->BenutzerModel->load([$uid]);
$person = hasData($personResult) ? getData($personResult) : null;
$resProfileData = $this->profillib->getView($uid);
$profileData = hasData($resProfileData) ? getData($resProfileData) : null;
$viewData = [
"user_data" => [
"username" => $uid,
"is_student" => $isStudent,
"is_mitarbeiter" => $isMitarbeiter,
"foto" => $person[0]->foto,
"vorname" => $person[0]->vorname,
"nachname" => $person[0]->nachname,
],
];
$viewData = [
"user_data" => [
"username" => $uid,
"is_student" => $isStudent,
"is_mitarbeiter" => $isMitarbeiter,
"foto" => $profileData->data->foto,
"vorname" => $profileData->data->vorname,
"nachname" => $profileData->data->nachname,
"titel" => $profileData->data->titel,
"postnomen" => $profileData->data->postnomen,
],
];
$this->terminateWithSuccess($viewData);
}
$this->terminateWithSuccess($viewData);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
// -----------------------------------------------------------------------------------------------------------------
// Private methods
}
@@ -0,0 +1,162 @@
<?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 PhrasesLib (back-end)
* Provides data to the ajax get calls about the Phrasen plugin
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class TabulatorPresets extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getTabulatorPresets' => self::PERM_LOGGED,
'createTabulatorPreset' => self::PERM_LOGGED,
'updateTabulatorPreset' => self::PERM_LOGGED,
'deleteTabulatorPreset' => self::PERM_LOGGED,
]);
$this->load->model('tabulator/Tabulator_preset_model', 'TabulatorPresetModel');
$this->loadPhrases([
'global',
'tabulator_presets'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getTabulatorPresets()
{
$tableName = $this->input->get("tableName");
if (!$tableName) {
$this->terminateWithError(error($this->p->t("tabulator_presets", "invalid_params_err_msg")));
}
$uid = getAuthUID();
$presets = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
$presetsData = $this->getDataOrTerminateWithError($presets) ?? [];
$this->terminateWithSuccess($presetsData);
}
public function createTabulatorPreset()
{
$tableName = $this->input->post("tableName");
$presetName = $this->input->post("presetName");
$preset = $this->input->post("preset");
if (!$tableName || !$presetName || !$preset) {
$this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
}
$uid = getAuthUID();
$existingPresetsResult = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
$existingPresets = $this->getDataOrTerminateWithError($existingPresetsResult) ?? [];
if (count($existingPresets) > 19) {
$this->terminateWithError($this->p->t("tabulator_presets", "max_presets_count_err_msg"), "general", 409);
}
$existingPresetNames = array_map(function($presetInfo) {
return $presetInfo->preset_name;
}, $existingPresets);
if (in_array($presetName, $existingPresetNames)) {
$this->terminateWithError($this->p->t("tabulator_presets", "preset_name_duplicate_err_msg"), "general", 409);
}
$presetCreationResult = $this->TabulatorPresetModel->createTabulatorPreset($uid, $tableName, $presetName, $preset);
if (isError($presetCreationResult)) {
$this->terminateWithError($presetCreationResult->retval);
}
$newPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetCreationResult->retval);
$newPresetArray = $this->getDataOrTerminateWithError($newPresetData) ?? [null];
$newPreset = $newPresetArray[0];
$this->terminateWithSuccess($newPreset);
}
public function updateTabulatorPreset()
{
$presetId = $this->input->post("presetId");
$preset = $this->input->post("preset");
if (!$presetId || !$preset) {
$this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
}
$existingPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
$existingPresetArray = $this->getDataOrTerminateWithError($existingPresetData) ?? [null];
$existingPreset = $existingPresetArray[0];
if (!$existingPreset) {
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
}
$uid = getAuthUID();
if ($existingPreset->benutzer_uid !== $uid) {
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_update_err_msg"), "general", 403);
}
$presetUpdateResult = $this->TabulatorPresetModel->updateTabulatorPreset($presetId, $preset);
if (isError($presetUpdateResult)) {
$this->terminateWithError($presetUpdateResult->retval);
}
$updatedPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
$updatedPresetArray = $this->getDataOrTerminateWithError($updatedPresetData) ?? [null];
$updatedPreset = $updatedPresetArray[0];
$this->terminateWithSuccess($updatedPreset);
}
public function deleteTabulatorPreset()
{
$presetId = $this->input->post("presetId");
if (!$presetId) {
$this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
}
$presetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
$presetArray = $this->getDataOrTerminateWithError($presetData) ?? [null];
$preset = $presetArray[0];
if (!$preset) {
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
}
$uid = getAuthUID();
if ($preset->benutzer_uid !== $uid) {
$this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_delete_err_msg"), "general", 403);
}
$presetDeletionResult = $this->TabulatorPresetModel->deleteTabulatorPreset($presetId);
if (isError($presetDeletionResult)) {
$this->terminateWithError($presetDeletionResult->retval);
}
$this->terminateWithSuccess();
}
}
@@ -0,0 +1,148 @@
<?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');
use \ReflectionMethod as ReflectionMethod;
use \ReflectionFunction as ReflectionFunction;
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about menues
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Treemenu extends FHCAPI_Controller
{
public function __construct()
{
// Load Router
$router = load_class('Router');
// Load Config
$config = load_class('Config');
$config->load('treemenu');
// Get Treemenu name & config
$name = $router->method;
$conf = $config->item($name);
// Get Permissions from config
$permissions = $conf['permissions'] ?? self::PERM_ANONYMOUS;
// Call constructor
parent::__construct([
$name => $permissions
]);
// Load Library
$libraryName = $conf['library'] ?? null;
$this->load->library($libraryName, null, 'treemenulib');
}
/**
* @param string $method
* @param array $params (optional)
*
* @return void
*/
public function _remap($method, $params = [])
{
if (!$this->treemenulib)
show_404();
$this->addMeta('ci_method', $method);
$this->addMeta('ci_params', $params);
$params = $this->uri->uri_to_assoc(6); // 6 = start of $params
$config = $this->treemenulib->config;
foreach (array_keys($params) as $key) {
if (!isset($config[$key]) || !$config[$key])
show_404();
$config = $config[$key];
}
// Prepare aliases
$argumentaliases = [];
if (property_exists($this->treemenulib, 'path_to_argument'))
$argumentaliases = array_flip($this->treemenulib->path_to_argument);
$methodaliases = [];
if (property_exists($this->treemenulib, 'redirect_method'))
$methodaliases = $this->treemenulib->redirect_method;
$items = [];
foreach ($config as $uripart => $children) {
if (!is_array($children)) {
$uripart = $children;
$children = [];
}
$methodName = $uripart;
if (isset($methodaliases[$methodName])) {
$methodName = $methodaliases[$methodName];
} elseif (strpbrk($methodName, ' _-') !== false) {
$methodName = lcfirst(str_replace([' ', '_', '-'], '', ucwords($methodName, " \t\r\n\f\v_-")));
}
// Prepare arguments
if (is_callable($methodName, false, $name)) {
if (is_string($methodName) && is_callable([$this->treemenulib, $methodName]))
$callable = [$this->treemenulib, $methodName];
else
$callable = $methodName;
} else {
$callable = [$this->treemenulib, $methodName];
}
if (is_array($callable))
$reflection = new ReflectionMethod($callable[0], $callable[1]);
elseif (is_string($callable) && strstr($callable, '::'))
$reflection = new ReflectionMethod($callable);
elseif ($name != 'Closure::__invoke' && strstr($name, '::__invoke'))
$reflection = new ReflectionMethod($callable, '__invoke');
else
$reflection = new ReflectionFunction($callable);
$arguments = [];
foreach ($reflection->getParameters() as $arg) {
if ($arg->name == 'path_template') {
$path = $params;
$path[$uripart] = '%s';
$arguments[] = $this->uri->assoc_to_uri($path);
} elseif ($arg->name == 'has_children') {
$arguments[] = $children;
} elseif ($arg->name == 'original_method') {
$arguments[] = $uripart;
} elseif (isset($argumentaliases[$arg->name]) && isset($params[$argumentaliases[$arg->name]])) {
$arguments[] = $params[$argumentaliases[$arg->name]];
} elseif (isset($params[$arg->name])) {
$arguments[] = $params[$arg->name];
} else {
$arguments[] = null;
}
}
// Call function from lib
$items = array_merge($items, call_user_func_array($callable, $arguments));
}
$this->terminateWithSuccess($items);
}
}
@@ -9,9 +9,10 @@ class Detailheader extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
'getSemesterStati' => ['admin:r', 'assistenz:r'],
]);
}
@@ -48,6 +49,17 @@ class Detailheader extends FHCAPI_Controller
$this->terminateWithSuccess(current($data));
}
public function getSemesterStati($prestudent_id)
{
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$result = $this->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,200 @@
<?php
defined('BASEPATH') || exit('No direct script access allowed');
class IssueChecker extends FHCAPI_Controller
{
const DEFAULT_PERMISSION = 'system/issues_verwalten:r';
protected $person_id;
protected $_extensionName = null;
protected $_fehlercodes = [];
protected $_apps = [];
protected $errors = [];
protected $infos = [];
public function __construct($permissions = [])
{
$default_permissions = [
'checkPerson' => self::DEFAULT_PERMISSION,
'countPersonOpenIssues' => self::DEFAULT_PERMISSION
];
if(!is_array($permissions))
{
$this->terminateWithError("Issue Checker: permissions must be an array");
}
$merged_permissions = array_merge($default_permissions, $permissions);
parent::__construct($merged_permissions);
$this->load->model('system/Issue_model', 'IssueModel');
$this->load->model('system/Fehler_model', 'FehlerModel');
$this->load->model('person/Person_model', 'PersonModel');
$producerArgs = [];
$resolverArgs = [];
// get fehler kurzbz from fehlercodes, if fehlercodes provided
if (!isEmptyArray($this->_fehlercodes))
{
$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz');
$this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes);
$fehlerKurzbzRes = $this->FehlerModel->load();
if (isError($fehlerKurzbzRes)) $this->terminateWithError(getError($fehlerKurzbzRes), self::ERROR_TYPE_GENERAL);
if (hasData($fehlerKurzbzRes))
{
$producerArgs['fehlerKurzbz'] = array_column(getData($fehlerKurzbzRes), 'fehler_kurzbz');
$resolverArgs['fehlercode'] = array_column(getData($fehlerKurzbzRes), 'fehlercode');
}
}
elseif (!isEmptyArray($this->_apps)) // if apps are provided
{
// get fehlercodes for the apps
$fehlerRes = $this->FehlerModel->getByApps($this->_apps);
if (hasData($fehlerRes)) $this->_fehlercodes = array_column(getData($fehlerRes), 'fehlercode');
$producerArgs['apps'] = $this->_apps;
$resolverArgs['apps'] = $this->_apps;
}
// load producer and checker libraries with fehler kurbz and fehlercode list
$this->load->library(
'issues/PlausicheckProducerLib',
$producerArgs,
'PlausicheckProducerLib'
);
$this->load->library(
'issues/PlausicheckResolverLib',
$resolverArgs,
'PlausicheckResolverLib'
);
$this->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui'
)
);
}
public function checkPerson()
{
$person_id = $this->input->post('person_id', true);
$hauptzustaendig = filter_var($this->input->post('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN);
if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
$this->person_id = intval($person_id);
$this->hauptzustaendig = $hauptzustaendig;
$persRes = $this->PersonModel->load($this->person_id);
if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL);
$this->_produceIssues();
$this->_resolveIssues();
$this->_produceIssues();
$openIssueCountRes = $this->_countOpenIssues();
if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL);
$data = array(
'person_id' => $this->person_id,
'openissues' => hasData($openIssueCountRes) ? getData($openIssueCountRes) : 0
);
$this->addMeta('errors', $this->errors);
$this->addMeta('infos', $this->infos);
$this->terminateWithSuccess($data);
}
public function countPersonOpenIssues()
{
$person_id = $this->input->get('person_id', true);
$hauptzustaendig = filter_var($this->input->get('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN);
if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
$this->person_id = intval($person_id);
$this->hauptzustaendig = $hauptzustaendig;
$persRes = $this->PersonModel->load($this->person_id);
if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL);
$openIssueCountRes = $this->_countOpenIssues();
if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL);
$data = array(
'person_id' => $this->person_id,
'openissues' => hasData($openIssueCountRes) ? getData($openIssueCountRes) : 0
);
$this->addMeta('errors', $this->errors);
$this->addMeta('infos', $this->infos);
$this->terminateWithSuccess($data);
}
protected function _countOpenIssues()
{
if (isEmptyArray($this->_fehlercodes)) return success([]);
// load open issues with given errorcodes
$openIssuesRes = $this->IssueModel->getOpenIssues(
$this->_fehlercodes,
$this->person_id,
$oe_kurzbz = null,
$fehlercode_extern = null,
$this->hauptzustaendig
);
// log error if occured
if (isError($openIssuesRes)) return $openIssuesRes;
$issues = hasData($openIssuesRes) ? getData($openIssuesRes) : [];
$issuescount = is_array($issues) || $issues instanceof Countable ? count($issues) : 0;
return success($issuescount);
}
protected function _produceIssues()
{
$result = $this->PlausicheckProducerLib->producePlausicheckIssues(
array('person_id' => $this->person_id)
);
// log if error, or log info if inserted new issue
if (isset($result->errors))
$this->errors = array_merge($this->errors, $result->errors);
if (isset($result->infos))
$this->infos = array_merge($this->infos, $result->infos);
}
protected function _resolveIssues()
{
// load open issues with given errorcodes
$openIssuesRes = $this->IssueModel->getOpenIssues(
$this->_fehlercodes,
$this->person_id
);
if (hasData($openIssuesRes))
{
$openIssues = getData($openIssuesRes);
$result = $this->PlausicheckResolverLib->resolvePlausicheckIssues($openIssues);
// log if error, or log info if inserted new issue
if (isset($result->errors))
$this->errors = array_merge($this->errors, $result->errors);
if (isset($result->infos))
$this->infos = array_merge($this->infos, $result->infos);
}
}
}
@@ -0,0 +1,104 @@
<?php
defined('BASEPATH') || exit('No direct script access allowed');
class Issues extends FHCAPI_Controller
{
const DEFAULT_PERMISSION = 'system/issues_verwalten:r';
public function __construct() {
parent::__construct(
array(
'getOpenIssuesByProperties' => Self::DEFAULT_PERMISSION,
'getPersonenMitOffenenIssues' => Self::DEFAULT_PERMISSION
)
);
// Loads authentication library and starts authenticationfetc
$this->load->library('AuthLib');
$this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model','ApiModel');
$this->load->model('person/Person_model','PersonModel');
$this->load->model('system/Fehler_model','FehlerModel');
$this->load->model('system/Issue_model', 'IssueModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
}
public function getOpenIssuesByProperties()
{
$person_id = $this->input->get('person_id', true);
$oe_kurzbz = $this->input->get('oe_kurzbz', true);
$fehlertyp_kurzbz = $this->input->get('fehlertyp_kurzbz', true);
$apps = $this->input->get('apps', true);
$behebung_parameter = $this->input->get('behebung_parameter', true);
$hauptzustaendig = filter_var($this->input->get('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN);
if (isset($person_id) && !is_numeric($person_id))
$this->terminateWithError('person id is not numeric!');
if (isset($behebung_parameter) && !is_array($behebung_parameter))
$this->terminateWithError('Behebung parameter invalid');
$issueRes = $this->IssueModel->getOpenIssuesByProperties(
$person_id,
$oe_kurzbz,
$fehlertyp_kurzbz,
$apps,
$behebung_parameter,
$hauptzustaendig
);
if (isError($issueRes))
{
$this->terminateWithError(getError($issueRes));
}
$this->terminateWithSuccess(hasData($issueRes) ? getData($issueRes) : []);
}
public function getPersonenMitOffenenIssues()
{
$sql = <<<EOSQL
SELECT
person_id, uid, vorname, nachname, count(*) AS openissues ,
(select count(*) anz_aktiv
from hr.tbl_dienstverhaeltnis dv
where dv.mitarbeiter_uid=uid and dv.von<=now() and
(dv.bis is null OR dv.bis>=now())
) aktiv
FROM
system.tbl_issue
JOIN
system.tbl_fehler USING (fehlercode)
JOIN
public.tbl_person USING (person_id)
JOIN
public.tbl_benutzer USING (person_id)
JOIN
public.tbl_mitarbeiter ON uid = mitarbeiter_uid
WHERE
app = 'personalverwaltung' AND verarbeitetamum IS NULL
GROUP BY
person_id, uid, vorname, nachname
HAVING
count(*) > 0
ORDER BY
count(*) DESC;
EOSQL;
$personenmitissues = $this->IssueModel->execReadOnlyQuery($sql);
if( hasData($personenmitissues) )
{
$this->terminateWithSuccess(getData($personenmitissues));
}
else
{
$this->terminateWithSuccess(array());
}
}
}
@@ -0,0 +1,17 @@
<?php
defined('BASEPATH') || exit('No direct script access allowed');
require_once APPPATH.'/controllers/api/frontend/v1/issues/IssueChecker.php';
class StudentIssueChecker extends IssueChecker
{
protected $_apps = array(
'core',
'dvuh',
'bis'
);
//protected $_fehlercodes = array(
//~ 'CORE_AA_0001'
//);
}
@@ -0,0 +1,86 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Config extends FHCAPI_Controller
{
private $_ci;
private $_uid;
public function __construct()
{
parent::__construct([
'get' => ['admin:r', 'assistenz:r'],
'set' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->loadPhrases([
'lehre'
]);
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->_ci->load->library('PermissionLib');
}
public function get()
{
if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
$this->terminateWithSuccess([]);
$ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
$ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
$ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
$config['ignore_kollision'] = [
"type" => "checkbox",
"label" => 'ignore_kollision',
"value" => $ignore_kollision,
];
$config['ignore_zeitsperre'] = [
"type" => "checkbox",
"label" => 'ignore_zeitsperre',
"value" => $ignore_zeitsperre,
];
$config['ignore_reservierung'] = [
"type" => "checkbox",
"label" => 'ignore_reservierung',
"value" => $ignore_reservierung,
];
$this->terminateWithSuccess($config);
}
public function set()
{
if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
$this->terminateWithSuccess([]);
$this->load->model('system/Variable_model', 'VariableModel');
foreach (['ignore_kollision','ignore_zeitsperre','ignore_reservierung'] as $variable)
{
if ($this->_ci->input->post($variable) !== null)
{
$this->VariableModel->update(array('uid' => $this->_uid, 'name' => $variable), array('wert' => $this->input->post($variable)));
}
}
$this->terminateWithSuccess();
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -1,47 +0,0 @@
<?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);
}
}
@@ -15,6 +15,7 @@ class Gruppe extends FHCAPI_Controller
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
'getAllSearch' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
'getGruppe' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
@@ -67,7 +68,7 @@ class Gruppe extends FHCAPI_Controller
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false'));
$result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, $lehrverband === true || $lehrverband === 'true');
if (isError($result))
$this->terminateWithError(getError($result));
@@ -75,6 +76,71 @@ class Gruppe extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
public function getGruppe()
{
$lehrverband = $this->input->post('lehrverband');
$gruppen_result = array();
if ($lehrverband === false)
{
$gruppen_result = $this->_ci->GruppeModel->loadWhere(array(
'studiengang_kz' => $this->input->post('stg_kz'),
'gruppe_kurzbz' => $this->input->post('gruppe_kurzbz'),
'aktiv' => true
));
}
else if ($lehrverband === true)
{
if (!isEmptyString($this->input->post('verband')))
{
$this->LehrverbandModel->db->where('verband', $this->input->post('verband'));
}
else
{
$this->LehrverbandModel->db->group_start();
$this->LehrverbandModel->db->where("trim(verband) = ''");
$this->LehrverbandModel->db->or_where("verband IS NULL");
$this->LehrverbandModel->db->group_end();
}
if (!isEmptyString($this->input->post('gruppe')))
{
$this->LehrverbandModel->db->where('gruppe', $this->input->post('gruppe'));
}
else
{
$this->LehrverbandModel->db->group_start();
$this->LehrverbandModel->db->where("trim(gruppe) = ''");
$this->LehrverbandModel->db->or_where("gruppe IS NULL");
$this->LehrverbandModel->db->group_end();
}
if (!isEmptyString((string)$this->input->post('semester')))
{
$this->LehrverbandModel->db->where('semester', $this->input->post('semester'));
}
else
{
$this->LehrverbandModel->db->group_start();
$this->LehrverbandModel->db->where("semester = ''");
$this->LehrverbandModel->db->or_where("semester IS NULL");
$this->LehrverbandModel->db->group_end();
}
$gruppen_result = $this->LehrverbandModel->loadWhere(array('studiengang_kz' => $this->input->post('stg_kz'), 'aktiv' => true));
}
if (!hasData($gruppen_result))
return $this->terminateWithError('No group found');
$gruppen_array = getData($gruppen_result)[0];
$this->terminateWithSuccess($gruppen_array->gid);
}
public function getByLehreinheit($lehreinheit_id = null)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
@@ -134,9 +134,14 @@ class Lektor extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === ''))
$nullable_fields = array('semesterstunden', 'stundensatz', 'planstunden');
foreach ($nullable_fields as $nullable_field)
{
$formData['semesterstunden'] = null;
if (isset($formData[$nullable_field]) && (!is_numeric($formData[$nullable_field]) || $formData[$nullable_field] === ''))
{
$formData[$nullable_field] = null;
}
}
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
@@ -144,6 +149,9 @@ class Lektor extends FHCAPI_Controller
if (!$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
if (!is_null($this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid)) && (array_key_exists('mitarbeiter_uid', $formData) && $mitarbeiter_uid !== $formData['mitarbeiter_uid']))
$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));
@@ -154,7 +162,7 @@ class Lektor extends FHCAPI_Controller
{
$value = str_replace(',', '.', $value);
if (!is_numeric($value))
if (!is_numeric($value) && $value !== "")
{
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.');
return false;
@@ -0,0 +1,84 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Noten extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getCertificate' => 'student/noten:r',
'getTeacherProposal' => 'student/noten:r',
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load Phrases
$this->loadPhrases([
'stv',
'person',
'lehre'
]);
}
public function getCertificate($lv_id, $studiensemester_kurzbz = null)
{
if (is_null($lv_id) || !ctype_digit((string)$lv_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->LehrveranstaltungModel->loadWhere([
'lehrveranstaltung_id' => $lv_id
]);
$lehrveranstaltung = $this->getDataOrTerminateWithError($result);
if (!$lehrveranstaltung)
$this->terminateWithSuccess([]);
if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$result = $this->ZeugnisnoteModel->getZeugnisnoten(null, $studiensemester_kurzbz, $lehrveranstaltung[0]->lehrveranstaltung_id);
$grades = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($grades);
}
public function getTeacherProposal($lv_id, $studiensemester_kurzbz = null)
{
if (is_null($lv_id) || !ctype_digit((string)$lv_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->LehrveranstaltungModel->loadWhere([
'lehrveranstaltung_id' => $lv_id
]);
$lehrveranstaltung = $this->getDataOrTerminateWithError($result);
if (!$lehrveranstaltung)
$this->terminateWithSuccess([]);
if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$result = $this->LvgesamtnoteModel->getLvGesamtNoten($lv_id, null, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($grades);
}
}
@@ -19,6 +19,8 @@
if (!defined('BASEPATH'))
exit('No direct script access allowed');
use CI3_Events as Events;
class Setup extends FHCAPI_Controller
{
private $_ci;
@@ -27,7 +29,8 @@ class Setup extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getTabs' => ['admin:r', 'assistenz:r'],
'getLETabs' => ['admin:r', 'assistenz:r'],
'getLVTabs' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
@@ -41,9 +44,10 @@ class Setup extends FHCAPI_Controller
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->_ci->load->helper('hlp_document');
}
public function getTabs()
public function getLETabs()
{
$tabs['details'] = array (
'title' => 'Details',
@@ -60,11 +64,43 @@ class Setup extends FHCAPI_Controller
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
'config' => []
);
$tabs['termine'] = array (
'title' => 'Termine',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Termine.js'),
'config' => []
);
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'config' => []
);
Events::trigger('lvv_conf_tabs', function & () use (&$tabs) {
return $tabs;
});
$this->terminateWithSuccess($tabs);
}
public function getLVTabs()
{
$tabs['termine'] = array (
'title' => 'Termine',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/LVTermine.js'),
'config' => []
);
$tabs['noten'] = array (
'title' => 'Noten',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Noten.js'),
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
'edit' => 'both', // Possible values: both|header|inline
'delete' => 'inline', // Possible values: both|header|inline
'documents' => 'inline', // Possible values: both|header|inline
'documentslist' => gradesDocumentsList(),
'semesterSelect' => false
]
);
$this->terminateWithSuccess($tabs);
}
@@ -1,117 +0,0 @@
<?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);
}
}
@@ -26,7 +26,9 @@ class Studiensemester extends FHCAPI_Controller
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
'current' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -166,4 +168,39 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess(array($studiensemester, $aktuell));
}
public function current()
{
$result = $this->StudiensemesterModel->getNearest();
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
$this->terminateWithError('Kein Studiensemester aktiv');
if (count($data) > 1)
$this->terminateWithError('Mehrere Studiensemester aktiv');
$this->terminateWithSuccess(current($data)->studiensemester_kurzbz);
}
public function set()
{
$this->load->library('AuthLib');
$this->load->library('form_validation');
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$stdsem = $this->input->post('studiensemester_kurzbz');
$this->load->model('system/Variable_model', 'VariableModel');
$result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
}
@@ -246,12 +246,12 @@ class Abschlusspruefung extends FHCAPI_Controller
{
$searchString = $this->input->get('searchString') ?? '';
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('person/Person_model', 'PersonModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
$result = $this->PersonModel->searchPerson($searchString, 'mitMaUid');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
@@ -301,6 +301,7 @@ class Config extends FHCAPI_Controller
public function student()
{
$this->load->helper('hlp_document');
$result = [];
$config = $this->config->item('tabs');
@@ -376,9 +377,9 @@ class Config extends FHCAPI_Controller
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
'edit' => 'both', // Possible values: both|header|inline
'delete' => 'both', // Possible values: both|header|inline
'documents' => 'both', // Possible values: both|header|inline
'documentslist' => $this->gradesDocumentsList()
'delete' => 'inline', // Possible values: both|header|inline
'documents' => 'inline', // Possible values: both|header|inline
'documentslist' => gradesDocumentsList()
]
];
@@ -622,188 +623,6 @@ class Config extends FHCAPI_Controller
] + $this->kontoColumns();
}
/**
* Helper function to generate the default documentslist config for the
* grades tab.
*
* The resulting array consists of elements which are associative arrays
* that can have the following entries:
* title (required) on the first level this can be HTML code.
* permissioncheck (optional) an URL to an FHCAPI endpoint which returns
* true or false.
* link (optional) an URL that will be called if "action" and
* "children" are not defined.
* action (optional) an associative array that describes an
* POST action that will be called if "children" is
* not defined.
* It can have the following entries:
* - url (required) an URL to an FHCAPI endpoint.
* - post (optional) an associative array with the POST data to
* be sent.
* - response (optional) a string that will be displayed on success.
* children (optional) an array of child elements
*
* All strings that start with { and end with } in the URLs and the
* actions post parameter will be replaced with the corresponding
* attribute of the current dataset (e.G: {uid} will be replaced with the
* uid of the current dataset)
*
* @return array
*/
protected function gradesDocumentsList()
{
$permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
$title_ger = $this->p->t("global", "deutsch");
$title_eng = $this->p->t("global", "englisch");
$title_ff = $this->p->t("stv", "document_certificate");
$title_lv = $this->p->t("stv", "document_coursecertificate");
$link_ff = "documents/export/" .
"zertifikat.rdf.php/" .
"Zertifikat" .
"?stg_kz={studiengang_kz_lv}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$link_lv_ger = "documents/export/" .
"lehrveranstaltungszeugnis.rdf.php/" .
"LVZeugnis" .
"?stg_kz={studiengang_kz}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$link_lv_eng = "documents/export/" .
"lehrveranstaltungszeugnis.rdf.php/" .
"LVZeugnisEng" .
"?stg_kz={studiengang_kz}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$archive_url = "api/frontend/v1/documents/archiveSigned";
$archive_response = $this->p->t("stv", "document_signed_and_archived");
$archive_post_ff = [
"xml" => "zertifikat.rdf.php",
"xsl" => "Zertifikat",
"stg_kz" => "{studiengang_kz_lv}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$archive_post_lv_ger = [
"xml" => "lehrveranstaltungszeugnis.rdf.php",
"xsl" => "LVZeugnis",
"stg_kz" => "{studiengang_kz}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$archive_post_lv_eng = [
"xml" => "lehrveranstaltungszeugnis.rdf.php",
"xsl" => "LVZeugnisEng",
"stg_kz" => "{studiengang_kz}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$list = [
[
'title' => '<i class="fa fa-download" title="' . $this->p->t("stv", "document_download") . '"></i>',
'children' => [
[
'title' => $title_ff,
'link' => site_url($link_ff)
],
[
'title' => $title_lv,
'children' => [
[
'title' => $title_ger,
'link' => site_url($link_lv_ger),
'children' => [
[
'title' => 'PDF',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger)
],
[
'title' => 'DOC',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger . "&output=doc")
],
[
'title' => 'ODT',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger . "&output=odt")
]
]
],
[
'title' => $title_eng,
'link' => site_url($link_lv_eng),
'children' => [
[
'title' => 'PDF',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng)
],
[
'title' => 'DOC',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng . "&output=doc")
],
[
'title' => 'ODT',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng . "&output=odt")
]
]
]
]
]
]
],
[
'title' => '<i class="fas fa-archive" title="' . $this->p->t("stv", "document_archive") . '"></i>',
'children' => [
[
'title' => $title_ff,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_ff,
'response' => $archive_response
]
],
[
'title' => $title_lv,
'children' => [
[
'title' => $title_ger,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_lv_ger,
'response' => $archive_response
]
],
[
'title' => $title_eng,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_lv_eng,
'response' => $archive_response
]
]
]
]
]
]
];
return $list;
}
/**
* Sort tab list
*
@@ -34,7 +34,7 @@ class LvTermine extends FHCAPI_Controller
//TODO Build own lib or combine with Controller Stundenplan.php
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
public function getStundenplan($uid, $start_date = null, $end_date = null, $groupConsecutiveHours = false, $dbStundenplanTable = "stundenplan")
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
{
$student_uid = $uid;
$semester_range = $this->studienSemesterErmitteln($start_date, $end_date);
@@ -80,13 +80,6 @@ class LvTermine extends FHCAPI_Controller
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->terminateWithSuccess($stundenplan_data);
$this->expand_object_information($stundenplan_data);
$this->returnObj['$stundenplan_query'] = $stundenplan_query;
$this->returnObj['$student_lehrverband'] = $student_lehrverband;
$this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen;
$this->terminateWithSuccess($stundenplan_data);
}
public function getStudiensemester()
@@ -144,6 +144,7 @@ class Student extends FHCAPI_Controller
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
);
$this->PrestudentModel->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT');
@@ -138,7 +138,7 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -190,14 +190,14 @@ class Students extends FHCAPI_Controller
) AS semester", false);
$this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
$this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -235,59 +235,66 @@ class Students extends FHCAPI_Controller
) AS semester", false);
$this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
$this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
public function getPrestudents(
$studiengang_kz,
$studiengang_typ_kurzbz,
$studiensemester_kurzbz = null,
$filter = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'filter' => $filter
));
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter);
$this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter);
}
public function getPrestudentsOrgform(
$studiengang_kz,
$studiengang_typ_kurzbz,
$orgform_kurzbz,
$studiensemester_kurzbz = null,
$filter = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'filter' => $filter,
'orgform_kurzbz' => $orgform_kurzbz
));
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter, $orgform_kurzbz);
$this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter, $orgform_kurzbz);
}
/**
* @param integer $studiengang_kz
* @param string $studiengang_typ_kurzbz
* @param string $studiensemester_kurzbz (optional)
* @param string $filter (optional)
* @param string $orgform_kurzbz (optional)
*
* @return void
*/
protected function fetchPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
protected function fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
{
$studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz);
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz);
if ($studiengang_kz === null)
show_404();
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
$selectRT = "
@@ -439,19 +446,21 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addSelect("'' AS verband");
$this->studentlistlib->addSelect("'' AS gruppe");
$query_studiensemester_kurzbz = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : '\'NULL\'';
$this->studentlistlib->addSelect($query_studiensemester_kurzbz . ' as query_studiensemester_kurzbz');
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
public function getStudents(
$studiensemester_kurzbz,
$studiengang_kz,
$studiengang_typ_kurzbz,
$semester = null,
$verband = null,
$gruppe = null
@@ -459,18 +468,18 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $studiengang_kz,
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'semester' => $semester,
'verband' => $verband,
'gruppe' => $gruppe
));
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null);
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, null);
}
public function getStudentsOrgform(
$studiensemester_kurzbz,
$studiengang_kz,
$studiengang_typ_kurzbz,
$orgform_kurzbz,
$semester = null,
$verband = null,
@@ -479,37 +488,37 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $studiengang_kz,
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'orgform_kurzbz' => $orgform_kurzbz,
'semester' => $semester,
'verband' => $verband,
'gruppe' => $gruppe
));
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
}
public function getStudentsSpezialgruppe(
$studiensemester_kurzbz,
$studiengang_kz,
$studiengang_typ_kurzbz,
$semester,
$gruppe_kurzbz
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $studiengang_kz,
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'semester' => $semester,
'gruppe_kurzbz' => $gruppe_kurzbz
));
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null);
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, null);
}
public function getStudentsOrgformSpezialgruppe(
$studiensemester_kurzbz,
$orgform_kurzbz,
$studiengang_kz,
$studiengang_typ_kurzbz,
$semester,
$gruppe_kurzbz
) {
@@ -517,17 +526,17 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'orgform_kurzbz' => $orgform_kurzbz,
'studiengang_kz' => $studiengang_kz,
'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'semester' => $semester,
'gruppe_kurzbz' => $gruppe_kurzbz
));
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz);
$this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz);
}
/**
* @param integer $studiengang_kz
* @param string $studiensemester_kurzbz
* @param string $studiengang_typ_kurzbz
* @param integer $semester (optional)
* @param string $verband (optional)
* @param integer $gruppe (optional)
@@ -538,13 +547,20 @@ class Students extends FHCAPI_Controller
*/
protected function fetchStudents(
$studiensemester_kurzbz,
$studiengang_kz,
$studiengang_typ_kurzbz,
$semester = null,
$verband = null,
$gruppe = null,
$gruppe_kurzbz = null,
$orgform_kurzbz = null
) {
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz);
$orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz);
if ($studiengang_kz === null)
show_404();
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -556,6 +572,7 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id");
$this->studentlistlib->addSelect("'' AS priorisierung_relativ");
$this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
if ($gruppe_kurzbz !== null) {
$this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b');
@@ -594,10 +611,22 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
protected function decodeTagsJsonInResult(&$data)
{
if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
array_walk($data, function($item, $key) {
if(isset($item->tags))
{
$item->tags = json_decode($item->tags);
}
});
}
}
/**
* @param string $prestudent_id
*
@@ -611,6 +640,8 @@ class Students extends FHCAPI_Controller
'prestudent_id' => $prestudent_id,
));
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -618,7 +649,7 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
@@ -638,7 +669,7 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -655,6 +686,8 @@ class Students extends FHCAPI_Controller
'student_uid' => $student_uid,
));
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -664,14 +697,14 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addWhere('s.student_uid', $student_uid);
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -689,6 +722,8 @@ class Students extends FHCAPI_Controller
'person_id' => $person_id,
));
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -699,13 +734,13 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addWhere('p.person_id', $person_id);
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -721,6 +756,8 @@ class Students extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
$this->load->library('form_validation');
@@ -755,6 +792,7 @@ class Students extends FHCAPI_Controller
END
) AS semester", false);
$this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
if ($prestudent_ids && $student_uids) {
$this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
@@ -773,7 +811,7 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -802,4 +840,55 @@ class Students extends FHCAPI_Controller
}
}
}
protected function getStudiengangKz($studiengang_typ_kurzbz)
{
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->loadWhere([
'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz)
]);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
return null;
return current($data)->studiengang_kz;
}
protected function getStudiensemesterKurzbz($studiensemester_kurzbz)
{
if ($studiensemester_kurzbz === null)
return null;
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->loadWhere([
'LOWER(studiensemester_kurzbz) =' => strtolower($studiensemester_kurzbz)
]);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
return $studiensemester_kurzbz;
return current($data)->studiensemester_kurzbz;
}
protected function getOrgformKurzbz($orgform_kurzbz)
{
if ($orgform_kurzbz === null)
return null;
$this->load->model('codex/Orgform_model', 'OrgformModel');
$result = $this->OrgformModel->loadWhere([
'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz)
]);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
return $orgform_kurzbz;
return current($data)->orgform_kurzbz;
}
}
@@ -15,7 +15,9 @@ class Tags extends Tag_Controller
'addTag' => self::BERECHTIGUNG_KURZBZ,
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
'getAllTags' => self::BERECHTIGUNG_KURZBZ,
'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
]);
$this->config->load('stv');
@@ -45,4 +47,5 @@ class Tags extends Tag_Controller
{
parent::doneTag($this->config->item('stv_prestudent_tags'));
}
}
@@ -1,513 +0,0 @@
<?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 verbände
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Verband extends FHCAPI_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
// Load Models
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
/**
* Remap calls:
* /
* /(studiengang_kz) => getStudiengang
* /(studiengang_kz)/(semester) => getSemester
* /(studiengang_kz)/(semester)/(verband) => getVerband
* /(studiengang_kz)/(org_form) => getStudiengang
* /(studiengang_kz)/(org_form)/(semester) => getSemester
* /(studiengang_kz)/(org_form)/(semester)/(verband) => getVerband
*
* @param string $method
* @param array $params (optional)
*
* @return void
*/
public function _remap($method, $params = [])
{
if ($method == '' || $method == 'index')
return $this->getBase();
// NOTE(chris): Test if access is allowed ($method is the Studiengang)
if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
&& !$this->permissionlib->isBerechtigt('admin', 's', $method)
) {
return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
}
$count = count($params);
if (!$count)
return $this->getStudiengang($method);
if ($count == 1) {
if (is_numeric($params[0]))
return $this->getSemester($method, $params[0]);
elseif ($params[0] == 'prestudent')
return $this->terminateWithSuccess($this->getStdSem($method . '/prestudent/', $method));
else
return $this->getStudiengang($method, $params[0]);
}
if ($count == 2) {
if (is_numeric($params[0]))
return $this->getVerband($method, $params[0], $params[1]);
elseif ($params[1] == 'prestudent')
return $this->terminateWithSuccess($this->getStdSem($method . '/' . $params[0] . '/prestudent/', $method));
else
return $this->getSemester($method, $params[1], $params[0]);
}
if ($count == 3 && !is_numeric($params[0]) && is_numeric($params[1]) && !is_numeric($params[2]))
return $this->getVerband($method, $params[1], $params[2], $params[0]);
show_404();
}
/**
* @return void
*/
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);
if ($this->permissionlib->isBerechtigt('inout/uebersicht'))
$list[] = [
'name' => 'International',
'link' => 'inout',
'children' => [
[
'name' => 'Incoming',
'link' => 'inout/incoming',
'leaf' => true
],
[
'name' => 'Outgoing',
'link' => 'inout/outgoing',
'leaf' => true
],
[
'name' => 'Gemeinsame Studien',
'link' => 'inout/gemeinsamestudien',
'leaf' => true
]
]
];
$this->terminateWithSuccess($list);
}
/**
* @param integer $studiengang_kz
* @param string $orgform (optional)
*
* @return void
*/
protected function getStudiengang($studiengang_kz, $org_form = null)
{
$link = $studiengang_kz . '/';
if ($org_form !== null)
$link .= $org_form . '/';
$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('semester');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
$this->StudiengangModel->addOrder('semester');
if ($org_form !== null) {
$this->StudiengangModel->addSelect("v.orgform_kurzbz");
$this->StudiengangModel->db->group_start();
$this->StudiengangModel->db->where('v.semester', 0);
$this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form);
$this->StudiengangModel->db->group_end();
}
$result = $this->StudiengangModel->loadWhere([
'v.studiengang_kz' => $studiengang_kz,
'v.aktiv' => true
]);
$list = $this->getDataOrTerminateWithError($result);
array_unshift($list, [
'name' => 'PreStudent',
'link' => $link . 'prestudent',
'no_sem_reload' => true,
'stg_kz' => (int)$studiengang_kz,
'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz)
]);
if ($org_form === null) {
// NOTE(chris): if mischform show orgforms
$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("studiengang_kz AS stg_kz");
$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);
}
/**
* @param integer $studiengang_kz
* @param integer $semester
* @param string $orgform
*
* @return void
*/
protected function getSemester($studiengang_kz, $semester, $org_form = null)
{
$link = $studiengang_kz . '/';
if ($org_form !== null)
$link .= $org_form . '/';
$link .= $semester . '/';
$this->load->model('organisation/Gruppe_model', 'GruppeModel');
$this->GruppeModel->addDistinct();
$this->GruppeModel->addSelect("CONCAT(" . $this->GruppeModel->escape($link . 'grp/') . ", gruppe_kurzbz) AS link", false);
$this->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false);
$this->GruppeModel->addSelect("TRUE AS leaf", false);
$this->GruppeModel->addSelect('sort');
$this->GruppeModel->addSelect('gruppe_kurzbz');
$this->GruppeModel->addSelect($this->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
$this->GruppeModel->addOrder('sort');
$this->GruppeModel->addOrder('gruppe_kurzbz');
$where = [
'studiengang_kz' => $studiengang_kz,
'semester' => $semester,
'lehre' => true,
'sichtbar' => true,
'aktiv' => true,
'direktinskription' => false
];
if ($org_form !== null)
$where['orgform_kurzbz'] = $org_form;
$result = $this->GruppeModel->loadWhere($where);
$list = $this->getDataOrTerminateWithError($result);
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", verband) AS link", false);
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (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 AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester');
$this->StudiengangModel->addSelect('verband');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
$this->StudiengangModel->addOrder('verband');
$this->StudiengangModel->addGroupBy('link, name, verband');
$where = [
'v.studiengang_kz' => $studiengang_kz,
'v.semester' => $semester,
'v.verband !=' => '',
'v.aktiv' => true
];
if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
$where['v.orgform_kurzbz'] = $org_form;
$result = $this->StudiengangModel->loadWhere($where);
$result = $this->getDataOrTerminateWithError($result);
$list = array_merge($list, $result);
$this->terminateWithSuccess($list);
}
/**
* @param integer $studiengang_kz
* @param integer $semester
* @param integer $verband
* @param string $orgform
*
* @return void
*/
protected function getVerband($studiengang_kz, $semester, $verband, $org_form = null)
{
$link = $studiengang_kz . '/';
if ($org_form !== null)
$link .= $org_form . '/';
$link .= $semester . '/'. $verband . '/';
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
$this->StudiengangModel->addDistinct();
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", gruppe) AS link", false);
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (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 AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect("TRUE AS leaf", false);
$this->StudiengangModel->addSelect('v.semester');
$this->StudiengangModel->addSelect('v.verband');
$this->StudiengangModel->addSelect('gruppe');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
$this->StudiengangModel->addOrder('gruppe');
$where = [
'v.studiengang_kz' => $studiengang_kz,
'v.semester' => $semester,
'v.verband' => $verband,
'v.gruppe !=' => '',
'v.aktiv' => true
];
if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
$where['v.orgform_kurzbz'] = $org_form;
$result = $this->StudiengangModel->loadWhere($where);
$list = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($list);
}
/**
* @param string $link
* @param integer $studiengang_kz
*
* @return array
*/
protected function getStdSem($link, $studiengang_kz)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('system/Variable_model', 'VariableModel');
$result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
$data = $this->getDataOrTerminateWithError($result);
$this->load->config('stv');
$number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default');
$number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'] ?? $number_displayed_past_studiensemester_default;
$this->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester);
$this->StudiensemesterModel->addOrder('ende');
$result = $this->StudiensemesterModel->load();
$studiensemester = $this->getDataOrTerminateWithError($result);
$result = [];
$studiengang_kz = (int)$studiengang_kz;
foreach ($studiensemester as $sem) {
$semlink = $link . $sem->studiensemester_kurzbz;
$intlink = $semlink . '/interessenten';
$result[] = [
'name' => $sem->studiensemester_kurzbz,
'link' => $semlink,
'stg_kz' => $studiengang_kz,
'children' => [
[
'name' => 'Interessenten',
'link' => $intlink,
'stg_kz' => $studiengang_kz,
'children' => [
[
'name' => 'Bewerbung nicht abgeschickt',
'link' => $intlink . '/bewerbungnichtabgeschickt',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Bewerbung abgeschickt, Status unbestätigt',
'link' => $intlink . '/bewerbungabgeschickt',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'ZGV erfüllt',
'link' => $intlink . '/zgv',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Status bestätigt',
'link' => $intlink . '/statusbestaetigt',
'stg_kz' => $studiengang_kz,
'children' => [
[
'name' => 'Nicht zum Reihungstest angemeldet',
'link' => $intlink . '/statusbestaetigtrtnichtangemeldet',
'leaf' => true
],
[
'name' => 'Reihungstest angemeldet',
'link' => $intlink . '/statusbestaetigtrtangemeldet',
'leaf' => true
]
]
],
[
'name' => 'Nicht zum Reihungstest angemeldet',
'link' => $intlink . '/reihungstestnichtangemeldet',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Reihungstest angemeldet',
'link' => $intlink . '/reihungstestangemeldet',
'stg_kz' => $studiengang_kz,
'leaf' => true
]
]
],
[
'name' => 'Bewerber',
'link' => $semlink . '/bewerber',
'stg_kz' => $studiengang_kz,
'children' => [
[
'name' => 'Nicht zum Reihungstest angemeldet',
'link' => $intlink . '/bewerberrtnichtangemeldet',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Reihungstest angemeldet',
'link' => $intlink . '/bewerberrtangemeldet',
'stg_kz' => $studiengang_kz,
'children' => [
[
'name' => 'Teilgenommen',
'link' => $intlink . '/bewerberrtangemeldetteilgenommen',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Nicht teilgenommen',
'link' => $intlink . '/bewerberrtangemeldetnichtteilgenommen',
'stg_kz' => $studiengang_kz,
'leaf' => true
]
]
]
]
],
[
'name' => 'Aufgenommen',
'link' => $semlink . '/aufgenommen',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Warteliste',
'link' => $semlink . '/warteliste',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Absage',
'link' => $semlink . '/absage',
'stg_kz' => $studiengang_kz,
'leaf' => true
],
[
'name' => 'Incoming',
'link' => $semlink . '/incoming',
'stg_kz' => $studiengang_kz,
'leaf' => true
]
]
];
}
return $result;
}
}
@@ -37,6 +37,7 @@ class Tag extends API_Controller
if (isset($tag))
{
$this->TagModel->addJoin('public.tbl_notiz_typ', 'typ_kurzbz', 'typ_kurzbz');
$result = $this->TagModel->load($tag);
$this->response($result, REST_Controller::HTTP_OK);
@@ -14,11 +14,11 @@ class Mylv extends Auth_Controller
public function __construct()
{
parent::__construct([
'Student' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
'Studiensemester' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
'Lvs' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
'Info' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
'Pruefungen' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions?
'Student' => self::PERM_LOGGED,
'Studiensemester' => self::PERM_LOGGED,
'Lvs' => self::PERM_LOGGED,
'Info' => self::PERM_LOGGED,
'Pruefungen' => self::PERM_LOGGED
]);
}
@@ -1,78 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Studiensemester extends Auth_Controller
{
public function __construct()
{
// TODO(chris): access!
parent::__construct([
'index' => self::PERM_LOGGED,
'now' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
]);
}
public function index()
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder('start');
$result = $this->StudiensemesterModel->load();
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
}
$this->outputJson($result);
}
public function now()
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->getNearest();
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
$this->outputJson(getError($result));
}
$result = getData($result) ?: [];
if (count($result) != 1) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
$this->outputJsonError(count($result) ? 'Mehrere Studiensemester aktiv' : 'Kein Studiensemester aktiv');
} else {
$this->outputJsonSuccess(current($result)->studiensemester_kurzbz);
}
}
public function set()
{
$this->load->library('AuthLib');
$this->load->library('form_validation');
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
if ($this->form_validation->run() == false) {
$this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
return $this->outputJsonError($this->form_validation->error_array());
}
$stdsem = $this->input->post('studiensemester');
$this->load->model('system/Variable_model', 'VariableModel');
$result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
return $this->outputJson($result);
}
$this->outputJsonSuccess(true);
}
}
+1 -1
View File
@@ -125,7 +125,7 @@ class AntragJob extends JOB_Controller
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
}
$result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
$result = $this->StudierendenantragModel->getStgAndDetails($antrag->studierendenantrag_id);
if (isError($result))
{
$this->logError(getError($result));
+42 -54
View File
@@ -5,58 +5,46 @@
*/
class IssueResolver extends IssueResolver_Controller
{
public function __construct()
{
parent::__construct();
// set fehler codes which can be resolved by the job, with own resolver defined
// structure: fehlercode => class (library) name for resolving in "resolvers" folder
$this->_codeLibMappings = array(
'CORE_ZGV_0001' => 'CORE_ZGV_0001',
'CORE_ZGV_0002' => 'CORE_ZGV_0002',
'CORE_ZGV_0003' => 'CORE_ZGV_0003',
'CORE_ZGV_0004' => 'CORE_ZGV_0004',
'CORE_ZGV_0005' => 'CORE_ZGV_0005',
'CORE_INOUT_0001' => 'CORE_INOUT_0001',
'CORE_INOUT_0002' => 'CORE_INOUT_0002',
'CORE_INOUT_0003' => 'CORE_INOUT_0003',
'CORE_INOUT_0004' => 'CORE_INOUT_0004',
'CORE_INOUT_0005' => 'CORE_INOUT_0005',
'CORE_INOUT_0006' => 'CORE_INOUT_0006',
'CORE_INOUT_0007' => 'CORE_INOUT_0007',
'CORE_INOUT_0008' => 'CORE_INOUT_0008',
'CORE_INOUT_0009' => 'CORE_INOUT_0009',
'CORE_STG_0001' => 'CORE_STG_0001',
'CORE_STG_0002' => 'CORE_STG_0002',
'CORE_STG_0003' => 'CORE_STG_0003',
'CORE_STG_0004' => 'CORE_STG_0004',
'CORE_STUDENTSTATUS_0002' => 'CORE_STUDENTSTATUS_0002',
'CORE_STUDENTSTATUS_0003' => 'CORE_STUDENTSTATUS_0003',
'CORE_STUDENTSTATUS_0004' => 'CORE_STUDENTSTATUS_0004',
'CORE_STUDENTSTATUS_0005' => 'CORE_STUDENTSTATUS_0005',
'CORE_STUDENTSTATUS_0006' => 'CORE_STUDENTSTATUS_0006',
'CORE_STUDENTSTATUS_0007' => 'CORE_STUDENTSTATUS_0007',
'CORE_STUDENTSTATUS_0008' => 'CORE_STUDENTSTATUS_0008',
'CORE_STUDENTSTATUS_0009' => 'CORE_STUDENTSTATUS_0009',
'CORE_STUDENTSTATUS_0010' => 'CORE_STUDENTSTATUS_0010',
'CORE_STUDENTSTATUS_0011' => 'CORE_STUDENTSTATUS_0011',
'CORE_STUDENTSTATUS_0012' => 'CORE_STUDENTSTATUS_0012',
'CORE_STUDENTSTATUS_0013' => 'CORE_STUDENTSTATUS_0013',
'CORE_STUDENTSTATUS_0014' => 'CORE_STUDENTSTATUS_0014',
'CORE_STUDENTSTATUS_0015' => 'CORE_STUDENTSTATUS_0015',
'CORE_STUDENTSTATUS_0016' => 'CORE_STUDENTSTATUS_0016',
'CORE_PERSON_0001' => 'CORE_PERSON_0001',
'CORE_PERSON_0002' => 'CORE_PERSON_0002',
'CORE_PERSON_0003' => 'CORE_PERSON_0003',
'CORE_PERSON_0004' => 'CORE_PERSON_0004',
'CORE_PERSON_0005' => 'CORE_PERSON_0005',
'CORE_PERSON_0006' => 'CORE_PERSON_0006'
);
// fehler which are resolved by the job the same way as they are produced
// structure: fehlercode => class (library) name for resolving in "plausichecks" folder
$this->_codeProducerLibMappings = array(
'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv',
);
}
protected $_fehlercodes = array(
'CORE_ZGV_0001',
'CORE_ZGV_0002',
'CORE_ZGV_0003',
'CORE_ZGV_0004',
'CORE_ZGV_0005',
'CORE_INOUT_0001',
'CORE_INOUT_0002',
'CORE_INOUT_0003',
'CORE_INOUT_0004',
'CORE_INOUT_0005',
'CORE_INOUT_0006',
'CORE_INOUT_0007',
'CORE_INOUT_0008',
'CORE_INOUT_0009',
'CORE_STG_0001',
'CORE_STG_0002',
'CORE_STG_0003',
'CORE_STG_0004',
'CORE_STUDENTSTATUS_0001',
'CORE_STUDENTSTATUS_0002',
'CORE_STUDENTSTATUS_0003',
'CORE_STUDENTSTATUS_0004',
'CORE_STUDENTSTATUS_0005',
'CORE_STUDENTSTATUS_0006',
'CORE_STUDENTSTATUS_0007',
'CORE_STUDENTSTATUS_0008',
'CORE_STUDENTSTATUS_0009',
'CORE_STUDENTSTATUS_0010',
'CORE_STUDENTSTATUS_0011',
'CORE_STUDENTSTATUS_0012',
'CORE_STUDENTSTATUS_0013',
'CORE_STUDENTSTATUS_0014',
'CORE_STUDENTSTATUS_0015',
'CORE_STUDENTSTATUS_0016',
'CORE_PERSON_0001',
'CORE_PERSON_0002',
'CORE_PERSON_0003',
'CORE_PERSON_0004',
'CORE_PERSON_0005',
'CORE_PERSON_0006'
);
}
@@ -6,7 +6,7 @@
class PlausiIssueProducer extends PlausiIssueProducer_Controller
{
private $_currentStudiensemester;
protected $_app = 'core';
protected $_apps = 'core';
public function __construct()
{
@@ -18,12 +18,12 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller
$this->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
// get current Studiensemester
$studiensemesterRes = $this->StudiensemesterModel->getAkt();
$studiensemesterRes = $this->StudiensemesterModel->getAktOrNextSemester(62);
if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz;
// set fehler which can be produced by the job
// structure: fehler_kurzbz => class (library) name for resolving
$this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings();
$this->_fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz();
}
/**
+110
View File
@@ -0,0 +1,110 @@
<?php
if (!defined("BASEPATH")) exit("No direct script access allowed");
use \DateTime as DateTime;
class TagJob extends JOB_Controller
{
/**
* API constructor
*/
public function __construct()
{
parent::__construct();
// Configs
$this->load->config('stv');
// Library
$this->load->library('TagLib');
// Load Models
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->loadPhrases([
'lehre'
]);
}
public function rebuildAutomatedTags()
{
$automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
$result = $this->StudiensemesterModel->getAktOrNextSemester();
if (isError($result))
{
$this->logInfo('Start Job rebuild Automated Tags');
$this->logError('Error occurred during retrieving studiensemester');
return $this->logInfo('End Job rebuild Automated Tags');
}
if (empty($result->retval) || !isset($result->retval[0])) {
$this->logInfo('Start Job rebuild Automated Tags');
$this->logError('No Studiensemester found');
return $this->logInfo('End Job rebuild Automated Tags');
}
$studiensemester_kurzbz = $result->retval[0]->studiensemester_kurzbz ?? null;
$params = array(
'studiensemester_kurzbz' => $studiensemester_kurzbz
);
$this->logInfo('Start Job rebuild Automated Tags ' . $studiensemester_kurzbz);
foreach($automatedTags as $autoTag)
{
// getPath: must not be lost
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
if(file_exists($filePath)) {
require_once($filePath);
} else {
$this->logInfo("File not found: " . $filePath);
continue;
}
$kurz_bz = $autoTag->typ_kurzbz;
// className without PATH (basename)
$className = basename($autoTag->taglib);
$obj = new $className();
$outputArray = $obj->getZuordnungIds($params);
$typeId = $outputArray->typeId;
$paramsTag = array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'kurzbz' => $kurz_bz,
'data' => $outputArray->data,
'typeId' => $typeId
);
$result = $this->taglib->updateAutomatedTags($paramsTag);
if (isError($result)) {
$this->logError('Error occurred during updateAutomatedTags ' . $kurz_bz);
continue;
}
$data = is_array($result) ? $result['retval'] : $result->retval;
//SUMMARY
$this->logInfo("Tag " . $result->retval['input']['tag'] . " | type_id " . $typeId . " --"
. " Count Recycled: " . $result->retval['summary']['recycled']
. " Count Added: ". $result->retval['summary']['added']
. " Count Deleted: ". $result->retval['summary']['deleted']);
//DETAILS
if($result->retval['results']['newTags'])
$this->logInfo("Tag " . $result->retval['input']['tag'] . "New tag(s): " . implode(', ', $result->retval['results']['newTags']));
if($result->retval['results']['deletedTagsIds'])
$this->logInfo("Tag " . $result->retval['input']['tag'] . "Deleted tags(s: " . implode(', ', $result->retval['results']['deletedTagsIds']));
if ($result->retval['results']['retaggedIds'])
$this->logInfo("Tag " . $result->retval['input']['tag'] . "Recycled tag(s): " . implode(', ', $result->retval['results']['retaggedIds']));
}
$this->logInfo( "End Job rebuild Automated Tags");
}
}
@@ -0,0 +1,60 @@
<?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 generates javascript from snippets for tabulator columns
*/
class Tabulatorcolumns extends Auth_Controller
{
public function __construct()
{
parent::__construct([
'stv' => ['admin:r', 'assistenz:r'],
'lvverwaltung' => ['admin:r', 'assistenz:r']
]);
}
/**
* Render tabulator columns for config
*
* @param string $config
*
* @return void
*/
public function _remap($config)
{
$this->load->config($config);
$list_columns = $this->config->item('list_columns') ?: [];
$snippets = [
'jssnippets/tabulatorcolumns/' . $config . '.js'
];
foreach ($list_columns as $col) {
$snippets[] = $col['js'];
}
$this->output->set_content_type('application/javascript');
$this->load->view('jssnippets/tabulatorcolumns.js', [
'snippets' => $snippets
]);
}
}
@@ -25,7 +25,8 @@ class Studierendenantrag extends FHC_Controller
// Load language phrases
$this->loadPhrases([
'studierendenantrag'
'studierendenantrag',
'ui'
]);
$this->load->config('studierendenantrag');
+15 -3
View File
@@ -198,7 +198,19 @@ class Gradelist extends Auth_Controller
if (!isset($row_noten->found))
{
$result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id);
$result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
$studiengang_kz = null;
if (!empty($result_lv->retval) && isset($result_lv->retval[0]) && isset($result_lv->retval[0]->studiengang_kz))
{
$result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
if (!empty($result_stg->retval) && isset($result_stg->retval[0]) && is_object($result_stg->retval[0]) && isset($result_stg->retval[0]->kurzbzlang))
{
$studiengang_kz = $result_stg->retval[0]->kurzbzlang;
}
}
$courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array(
'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id,
'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz,
@@ -212,8 +224,8 @@ class Gradelist extends Auth_Controller
'semester' => $result_lv->retval[0]->semester,
'note' => $row_noten->note,
'datum' => $row_noten->benotungsdatum,
'zugeordnet' => true,
'studiengang_kurzbz' => $result_stg->retval[0]->kurzbzlang
'studiengang_kurzbz' => $studiengang_kz,
'zugeordnet' => true
);
if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl']))
$courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0;
@@ -0,0 +1,57 @@
<?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 CLI_Manager extends CLI_Controller
{
/**
*
*/
public function __construct()
{
parent::__construct();
// Load libraries
$this->load->library('FehlerUpdateLib');
}
/**
*
*/
public function installAll()
{
$this->fehlerupdatelib->installAll();
}
/**
*
*/
public function installFromCore()
{
$this->fehlerupdatelib->installFromCore();
}
/**
*
*/
public function installFrom($extensionName)
{
$this->fehlerupdatelib->installFrom(urldecode($extensionName));
}
}
@@ -0,0 +1,46 @@
<?php
if (!defined("BASEPATH")) exit("No direct script access allowed");
class Manager extends Auth_Controller
{
/**
*
*/
public function __construct()
{
parent::__construct(
array(
'installAll' => 'admin:rw',
'installFromCore' => 'admin:rw'
)
);
// Load libraries
$this->load->library('FehlerUpdateLib');
}
/**
*
*/
public function installAll()
{
$this->fehlerupdatelib->installAll();
}
/**
*
*/
public function installFromCore()
{
$this->fehlerupdatelib->installFromCore();
}
/**
*
*/
public function installFrom($fehlerConfigDirectory)
{
$this->fehlerupdatelib->installFrom($fehlerConfigDirectory);
}
}
@@ -88,9 +88,11 @@ class IssuesKonfiguration extends Auth_Controller
// get all Fehler, optionally filtered by app
$params = array('fehlercode_extern' => null);
$this->FehlerModel->addDistinct();
$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertyp_kurzbz, fehlertext');
$this->FehlerModel->addJoin('system.tbl_fehler_app', 'fehlercode');
$this->FehlerModel->addOrder('fehlercode');
if (!isEmptyString($app)) $params['app'] = $app;
if (!isEmptyString($app)) $params['tbl_fehler_app.app'] = $app;
$fehlerRes = $this->FehlerModel->loadWhere($params);
if (isError($fehlerRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerLaden'));
@@ -69,10 +69,7 @@ class IssuesZustaendigkeiten extends Auth_Controller
{
$app = $this->input->get('app');
$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, app');
$this->FehlerModel->addOrder('fehlercode');
$fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load();
$fehlerRes = $this->FehlerModel->getByApps($app);
$this->outputJson($fehlerRes);
}
@@ -5,6 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
class Plausichecks extends Auth_Controller
{
const GENERIC_ISSUE_OCCURED_TEXT = 'Issue aufgetreten';
const APPS = ['core', 'dvuh', 'bis'];
public function __construct()
{
@@ -16,8 +17,7 @@ class Plausichecks extends Auth_Controller
);
// Load libraries
$this->load->library('issues/PlausicheckProducerLib', array('app' => 'core'));
$this->load->library('issues/PlausicheckDefinitionLib');
$this->load->library('issues/PlausicheckProducerLib', array('apps' => self::APPS));
$this->load->library('WidgetLib');
// Load models
@@ -46,37 +46,31 @@ class Plausichecks extends Auth_Controller
// issues array for passing issue texts
$allIssues = array();
// all fehler kurzbz which are going to be checked
$fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz();
$fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings();
$fehler_kurzbz_arr = isEmptyString($fehler_kurzbz) ? array_keys($this->plausicheckproducerlib->getFehlerMappings()) : [$fehler_kurzbz];
$this->FehlerModel->addOrder('fehler_kurzbz, fehlercode');
$this->FehlerModel->db->where_in('fehler_kurzbz', $fehler_kurzbz_arr);
$fehlerRes = $this->FehlerModel->load();
if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes));
if (!hasData($fehlerRes)) return $this->outputJsonSuccess([]);
// all fehler which are going to be checked
$fehlerArr = getData($fehlerRes);
// set Studiengang to null if not passed
if (isEmptyString($studiengang_kz)) $studiengang_kz = null;
// get the data returned by Plausicheck
foreach ($fehlerKurzbz as $fehler_kurzbz)
foreach ($fehlerArr as $fehler)
{
// get Text and fehlercode of the Fehler
$this->FehlerModel->addSelect('fehlercode, fehlertext, fehlertyp_kurzbz');
$fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz));
if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes));
// do not check error if no data
if (!hasData($fehlerRes)) continue;
// get the error data
$fehler = getData($fehlerRes)[0];
// initialize issue array
$allIssues[$fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array());
// get library name for producing issue
$libName = $fehlerLibMappings[$fehler_kurzbz];
$allIssues[$fehler->fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array());
// execute the check
$plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue(
$libName,
$fehler_kurzbz,
$fehler->fehler_kurzbz,
array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $studiengang_kz
@@ -107,7 +101,7 @@ class Plausichecks extends Auth_Controller
{
// replace placeholder with params, if present
if (count($fehlertext_params) != substr_count($fehlerText, '%s'))
$this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler_kurzbz);
$this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler->fehler_kurzbz);
$fehlerText = vsprintf($fehlerText, $fehlertext_params);
}
@@ -118,7 +112,7 @@ class Plausichecks extends Auth_Controller
$issueObj = new StdClass();
$issueObj->fehlertext = $fehlerText;
$issueObj->type = $fehlerTyp;
$allIssues[$fehler_kurzbz]['data'][] = $issueObj;
$allIssues[$fehler->fehler_kurzbz]['data'][] = $issueObj;
}
else // if no issue text found, use generic text
{
@@ -149,6 +143,12 @@ class Plausichecks extends Auth_Controller
if (isError($currSemRes)) show_error(getError($currSemRes));
if (!hasData($currSemRes))
{
$currSemRes = $this->StudiensemesterModel->getNext();
if (isError($currSemRes)) show_error(getError($currSemRes));
}
$this->StudiengangModel->addSelect('studiengang_kz, tbl_studiengang.bezeichnung, tbl_studiengang.typ,
tbl_studiengangstyp.bezeichnung AS typbezeichnung, UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel');
$this->StudiengangModel->addJoin('public.tbl_studiengangstyp', 'typ');
@@ -157,7 +157,7 @@ class Plausichecks extends Auth_Controller
if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes));
$fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz();
$fehlerKurzbz = array_keys($this->plausicheckproducerlib->getFehlerMappings());
$db = new DB_Model();
@@ -168,7 +168,9 @@ class Plausichecks extends Auth_Controller
FROM
system.tbl_fehler
WHERE
fehler_kurzbz IN ?',
fehler_kurzbz IN ?
ORDER BY
fehler_kurzbz, fehlercode',
array($fehlerKurzbz)
);
@@ -188,7 +190,8 @@ class Plausichecks extends Auth_Controller
'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(),
'currsemester' => hasData($currSemRes) ? getData($currSemRes) : array(),
'studiengaenge' => hasData($studiengaengeRes) ? getData($studiengaengeRes) : array(),
'fehlerKurzbzCodeMappings' => $fehlerKurzbzCodeMappings
'fehlerKurzbzCodeMappings' => $fehlerKurzbzCodeMappings,
'studiengang_kz' => $this->input->get('studiengang_kz') ?? ''
);
}
}
+6 -16
View File
@@ -5,11 +5,8 @@
*/
abstract class IssueResolver_Controller extends JOB_Controller
{
// mappings in form fehlercode -> resolverlibrary name, fehler which have explicit resolver class defined
protected $_codeLibMappings = [];
// mappings in form fehlercode -> producer library name, fehler which are resolved the same way they are produced
protected $_codeProducerLibMappings = [];
// codes of fehler to be resolved
protected $_fehlercodes = [];
public function __construct()
{
@@ -24,25 +21,18 @@ abstract class IssueResolver_Controller extends JOB_Controller
*/
public function run()
{
// initialize librariy with provided fehlercodes
$this->load->library(
'issues/PlausicheckResolverLib',
[
'extensionName' => $this->_extensionName ?? null,
'codeLibMappings' => $this->_codeLibMappings,
'codeProducerLibMappings' => $this->_codeProducerLibMappings
'fehlercodes' => $this->_fehlercodes
]
);
$this->logInfo("Issue resolve job started");
// load open issues with given errorcodes
$openIssuesRes = $this->IssueModel->getOpenIssues(
array_merge(array_keys($this->_codeLibMappings), array_keys($this->_codeProducerLibMappings))
);
$openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : [];
$result = $this->plausicheckresolverlib->resolvePlausicheckIssues($openIssues);
// resolve the issues
$result = $this->plausicheckresolverlib->resolvePlausicheckIssues();
// log if error, or log info if inserted new issue
foreach ($result->errors as $error) $this->logError($error);
@@ -5,14 +5,23 @@
*/
abstract class PlausiIssueProducer_Controller extends JOB_Controller
{
protected $_fehlerLibMappings = [];
protected $_app;
protected $_fehlerKurzbz = [];
protected $_apps = [];
/**
* Runs issue production job.
*/
public function run()
{
// producing issues
$this->producePlausicheckIssues(array());
}
protected function producePlausicheckIssues($params)
{
$this->load->library(
'issues/PlausicheckProducerLib',
['extensionName' => $this->_extensionName ?? null, 'app' => $this->_app, 'fehlerLibMappings' => $this->_fehlerLibMappings]
['apps' => $this->_apps, 'fehlerKurzbz' => $this->_fehlerKurzbz]
);
$this->logInfo("Plausicheck issue producer job started");
+110 -9
View File
@@ -7,7 +7,7 @@ class Tag_Controller extends FHCAPI_Controller
{
private $_uid;
const BERECHTIGUNG_KURZBZ = 'admin:rw';
const BERECHTIGUNG_KURZBZ = ['admin:rw'];
public function __construct($permissions)
{
@@ -15,10 +15,11 @@ class Tag_Controller extends FHCAPI_Controller
'getTag' => self::BERECHTIGUNG_KURZBZ,
'getTags' => self::BERECHTIGUNG_KURZBZ,
'addTag' => self::BERECHTIGUNG_KURZBZ,
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
'getAllTags' => self::BERECHTIGUNG_KURZBZ,
'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
];
$merged_permissions = array_merge($default_permissions, $permissions);
@@ -26,6 +27,10 @@ class Tag_Controller extends FHCAPI_Controller
parent::__construct($merged_permissions);
$this->_setAuthUID();
// Library
$this->load->library('TagLib');
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
@@ -38,6 +43,8 @@ class Tag_Controller extends FHCAPI_Controller
public function getTag($readonly_tags = null)
{
$language = $this->_getLanguageIndex();
$index_bezeichnung_mehrsprachig = $language - 1;
$id = $this->input->get('id');
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
@@ -62,14 +69,18 @@ class Tag_Controller extends FHCAPI_Controller
$this->NotizModel->addSelect(
"tbl_notiz.titel,
tbl_notiz.text,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
tbl_notiz_typ.automatisiert,
tbl_notiz_typ.prioritaet,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
tbl_notiz.start,
tbl_notiz.ende
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
@@ -82,18 +93,24 @@ class Tag_Controller extends FHCAPI_Controller
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
}
public function getTags($tags = null)
{
$language = $this->_getLanguageIndex();
$index_bezeichnung_mehrsprachig = $language - 1;
$this->NotiztypModel->addSelect(
'typ_kurzbz as tag_typ_kurzbz,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
"typ_kurzbz as tag_typ_kurzbz,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
style,
beschreibung,
tag
'
tag,
automatisiert,
prioritaet
"
);
$this->NotiztypModel->addOrder('prioritaet');
@@ -271,6 +288,90 @@ class Tag_Controller extends FHCAPI_Controller
$this->terminateWithSuccess($deleteNotiz);
}
public function getAllTags($readonly_tags = false)
{
$language = $this->_getLanguageIndex();
$index_bezeichnung_mehrsprachig = $language - 1;
$prestudent_id = $this->input->get('prestudent_id');
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
{
$readonly_tags = $this->_filterTag($readonly_tags, true);
foreach ($readonly_tags as $key => $tag)
{
$readonly_tags[$key] = $this->NotizModel->db->escape($tag);
}
$tags = '(' . implode(',', $readonly_tags) . ')';
$this->NotizModel->addSelect("
CASE
WHEN tbl_notiz_typ.typ_kurzbz IN $tags
THEN TRUE
ELSE FALSE
END as readonly
");
}
$this->NotizModel->addSelect(
"tbl_notiz.titel,
tbl_notiz.text,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
tbl_notiz_typ.automatisiert,
tbl_notiz_typ.prioritaet,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
tbl_notiz.start,
tbl_notiz.ende
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
$this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
$this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
$this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id');
$this->NotizModel->addOrder('done');
$this->NotizModel->addOrder('tbl_notiz_typ.prioritaet');
$notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id));
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz) : array());
}
public function rebuildTagsForTypeId()
{
$ids = $this->input->post('ids');
$typeId = $this->input->post('typeId');
$semester = $this->input->post('sem');
$idsSuccess = [];
$idsError = [];
$outputResult = [];
foreach ($ids as $id)
{
$result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
if (isError($result))
$idsError[] = $id;
else
$idsSuccess[] = $id;
$outputResult[] = $result;
}
$this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]);
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
@@ -311,4 +412,4 @@ class Tag_Controller extends FHCAPI_Controller
));
}
}
}
+188
View File
@@ -0,0 +1,188 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Helper function to generate the default documentslist config for the
* grades tab.
*
* The resulting array consists of elements which are associative arrays
* that can have the following entries:
* title (required) on the first level this can be HTML code.
* permissioncheck (optional) an URL to an FHCAPI endpoint which returns
* true or false.
* link (optional) an URL that will be called if "action" and
* "children" are not defined.
* action (optional) an associative array that describes an
* POST action that will be called if "children" is
* not defined.
* It can have the following entries:
* - url (required) an URL to an FHCAPI endpoint.
* - post (optional) an associative array with the POST data to
* be sent.
* - response (optional) a string that will be displayed on success.
* children (optional) an array of child elements
*
* All strings that start with { and end with } in the URLs and the
* actions post parameter will be replaced with the corresponding
* attribute of the current dataset (e.G: {uid} will be replaced with the
* uid of the current dataset)
*
* @return array
*/
function gradesDocumentsList()
{
$ci =& get_instance();
$ci->load->library('PhrasesLib', array('stv'), 'p');
$permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
$title_ger = $ci->p->t("global", "deutsch");
$title_eng = $ci->p->t("global", "englisch");
$title_ff = $ci->p->t("stv", "document_certificate");
$title_lv = $ci->p->t("stv", "document_coursecertificate");
$link_ff = "documents/export/" .
"zertifikat.rdf.php/" .
"Zertifikat" .
"?stg_kz={studiengang_kz_lv}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$link_lv_ger = "documents/export/" .
"lehrveranstaltungszeugnis.rdf.php/" .
"LVZeugnis" .
"?stg_kz={studiengang_kz}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$link_lv_eng = "documents/export/" .
"lehrveranstaltungszeugnis.rdf.php/" .
"LVZeugnisEng" .
"?stg_kz={studiengang_kz}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$archive_url = "api/frontend/v1/documents/archiveSigned";
$archive_response = $ci->p->t("stv", "document_signed_and_archived");
$archive_post_ff = [
"xml" => "zertifikat.rdf.php",
"xsl" => "Zertifikat",
"stg_kz" => "{studiengang_kz_lv}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$archive_post_lv_ger = [
"xml" => "lehrveranstaltungszeugnis.rdf.php",
"xsl" => "LVZeugnis",
"stg_kz" => "{studiengang_kz}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$archive_post_lv_eng = [
"xml" => "lehrveranstaltungszeugnis.rdf.php",
"xsl" => "LVZeugnisEng",
"stg_kz" => "{studiengang_kz}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$list = [
[
'title' => '<i class="fa fa-download" title="' . $ci->p->t("stv", "document_download") . '"></i>',
'children' => [
[
'title' => $title_ff,
'link' => site_url($link_ff)
],
[
'title' => $title_lv,
'children' => [
[
'title' => $title_ger,
'link' => site_url($link_lv_ger),
'children' => [
[
'title' => 'PDF',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger)
],
[
'title' => 'DOC',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger . "&output=doc")
],
[
'title' => 'ODT',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger . "&output=odt")
]
]
],
[
'title' => $title_eng,
'link' => site_url($link_lv_eng),
'children' => [
[
'title' => 'PDF',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng)
],
[
'title' => 'DOC',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng . "&output=doc")
],
[
'title' => 'ODT',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng . "&output=odt")
]
]
]
]
]
]
],
[
'title' => '<i class="fas fa-archive" title="' . $ci->p->t("stv", "document_archive") . '"></i>',
'children' => [
[
'title' => $title_ff,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_ff,
'response' => $archive_response
]
],
[
'title' => $title_lv,
'children' => [
[
'title' => $title_ger,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_lv_ger,
'response' => $archive_response
]
],
[
'title' => $title_eng,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_lv_eng,
'response' => $archive_response
]
]
]
]
]
]
];
return $list;
}
+24 -1
View File
@@ -111,7 +111,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
'theme' => [
'name'=>$ci->config->item('theme_name'),
'modes'=>$ci->config->item('theme_modes'),
]
],
'domain' => DOMAIN
);
$toPrint = "\n";
@@ -270,6 +271,28 @@ function absoluteJsImportUrl($relurl)
return $url;
}
/*
* Generate Css File Include if Extension contains file
*
* @param $relativeFilePath path relative to Extension public/css dir
*/
function generateCSSsIncludeIfExtensionCssExists($relativeFilePath)
{
$fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
foreach ($fsiterator as $fsitem)
{
if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
{
$extensionfile = 'public/extensions/' . $fsitem->getBasename()
. '/css/' . $relativeFilePath;
if(is_readable(FHCPATH . $extensionfile))
{
generateCSSsInclude($extensionfile);
}
}
}
}
/*
* Manipulate CI views includes Array to load
* - public/js/FhcApps.js via customJSs and
+384
View File
@@ -0,0 +1,384 @@
<?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 FehlerUpdateLib
{
// Who adds phrases into the database
const UPSERT_BY = 'FehlerUpdate';
const CONFIG_DIRECTORY = 'config';
const CONFIG_FEHLER_NAME = 'fehler';
const CONFIG_FEHLER_INDEX = 'fehler';
const TYPE_STRING = 'string';
const TYPE_ARRAY = 'array';
//~ // Array elements names
const FEHLERCODE = 'fehlercode';
const FEHLER_KURZBZ = 'fehler_kurzbz';
const FEHLERTEXT = 'fehlertext';
const FEHLERTYP_KURZBZ = 'fehlertyp_kurzbz';
const APP = 'app';
const FEHLERCODE_EXTERN = 'fehlercode_extern';
// structure of a fehler
// type default: string
const FEHLER_ATTRIBUTES = [
self::FEHLERCODE => ['required' => true],
self::FEHLER_KURZBZ => ['required' => false],
self::FEHLERTEXT => ['required' => true, 'updateable' => false],
self::FEHLERTYP_KURZBZ => ['required' => false, 'updateable' => true],
self::APP => ['required' => true, 'types' => [self::TYPE_STRING, self::TYPE_ARRAY]],
self::FEHLERCODE_EXTERN => ['required' => false]
];
private $_ci; // Code igniter instance
private $_updateHistory = [];
/**
* Loads parser library
*/
public function __construct()
{
$this->_ci =& get_instance();
// Loads EPrintfLib
$this->_ci->load->library('EPrintfLib');
// Loads the Models
$this->_ci->load->model('system/Fehler_model', 'FehlerModel');
$this->_ci->load->model('system/App_model', 'AppModel');
// Loads extensions lib
$this->_ci->load->library('ExtensionsLib');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Install all possible fehler, from core and extensions
*/
public function installAll()
{
$this->installFromCore();
// load fehler entries of extensions
$extensions = $this->_ci->extensionslib->getInstalledExtensions();
if (hasData($extensions))
{
$extensionArray = array();
$extensionsData = getData($extensions);
foreach ($extensionsData as $ext)
{
$this->installFrom($ext->name);
}
}
}
/**
* Install fehler from the core
*/
public function installFromCore()
{
$this->_installFehler();
}
/**
* Install fehler from the given path
*/
public function installFrom($extensionName)
{
if (!isset($extensionName))
{
$this->_ci->eprintflib->printError('Extension name missing!');
return;
}
$this->_installFehler(ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName.'/'.FehlerUpdateLib::CONFIG_FEHLER_NAME);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Install fehler from the given directory
*/
private function _installFehler($fehlerConfigDirectory = null)
{
// check that fehler config file exists
$configDir = isset($fehlerConfigDirectory) ? $fehlerConfigDirectory : self::CONFIG_FEHLER_NAME;
$configFilename = APPPATH.self::CONFIG_DIRECTORY.'/'.$configDir.'.php';
if (!file_exists($configFilename))
{
return;
}
// Load Fehler Entries
$this->_ci->load->config($configDir);
$configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX);
if (!isset($configArray) || !is_array($configArray)) // check if fehler config entries could be loaded
{
$this->_ci->eprintflib->printError(
'Fehler config array could not be loaded, directory '.$configDir.' index '.self::CONFIG_FEHLER_INDEX
);
return;
}
$this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------');
$this->_ci->eprintflib->printInfo('Fehler installation started, directory '.$configDir);
foreach ($configArray as $idx => $configEntry)
{
// create fehler from config entry
$createFehlerResult = $this->_createFehlerFromEntry($configEntry);
// write error if creation failed
if (isError($createFehlerResult))
{
$this->_ci->eprintflib->printError(
getError($createFehlerResult).', directory '.$configDir.', index '.$idx
);
}
elseif (hasData($createFehlerResult))
{
// add fehler to db
$addFehlerResult = $this->_updateFehler(getData($createFehlerResult));
if (isError($addFehlerResult))
{
$this->_ci->eprintflib->printError(
getError($addFehlerResult).', directory'.$configDir.', index '.$idx
);
}
}
}
$this->_ci->eprintflib->printInfo('Fehler installation ended');
$this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------');
}
/**
* Add a new fehler to the database
*/
private function _updateFehler($fehler)
{
$fehlerReferences = $fehler['references'];
$fehler = $fehler['fehler'];
// Checks if the fehler already exists in the database
$this->_ci->FehlerModel->db->where(self::FEHLERCODE.' = ', $fehler[self::FEHLERCODE]);
if (isset($fehler[self::FEHLER_KURZBZ]) && !isEmptyString($fehler[self::FEHLER_KURZBZ]))
$this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]);
$fehlerResult = $this->_ci->FehlerModel->load();
// If an error occurred then return the error itself
if (isError($fehlerResult)) return $fehlerResult;
$updateRes = null;
// if fehler has been found
if (hasData($fehlerResult))
{
$foundFehler = getData($fehlerResult)[0];
// check if fehlercode - fehler kurzbz combination is correct
if ($foundFehler->{self::FEHLERCODE} != $fehler[self::FEHLERCODE]
|| $foundFehler->{self::FEHLER_KURZBZ} != ($fehler[self::FEHLER_KURZBZ] ?? null)
) {
return error("Wrong fehlercode - fehler kurzbz combination: ".$fehler[self::FEHLERCODE].", ".$fehler[self::FEHLER_KURZBZ]);
}
$this->_ci->eprintflib->printMessage(
"Fehler ".$fehler[self::FEHLERCODE]
.(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "")
." already exists in database"
);
$updateArr = [];
// update fehler, if needed
foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo)
{
if (!array_key_exists($attributeName, $fehler)) continue;
// set attributes to be updated
if (isset($attributeInfo['updateable']) && $attributeInfo['updateable'] && $foundFehler->{$attributeName} != $fehler[$attributeName])
{
$updateArr[$attributeName] = $fehler[$attributeName];
if (isset($this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName])
&& $this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName] != $fehler[$attributeName]
) {
return error("Conflicting update values for attribute ".$attributeName.", fehler ".$foundFehler->{self::FEHLERCODE});
}
$this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName] = $fehler[$attributeName];
}
}
if (!isEmptyArray($updateArr))
{
$updateRes = $this->_ci->FehlerModel->update(
[self::FEHLERCODE => $foundFehler->{self::FEHLERCODE}],
array_merge($updateArr, ['updateamum' => 'NOW()', 'updatevon' => self::UPSERT_BY])
);
if (isError($updateRes)) return $updateRes;
$this->_ci->eprintflib->printMessage(
"Fehler ".$fehler[self::FEHLERCODE].(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "")." updated"
);
}
}
else
{
// no fehler has been found
// then add the fehler to the database
$updateRes = $this->_ci->FehlerModel->insert(
array_merge($fehler, ['insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY])
);
// If an error occurred then return the error itself
if (isError($updateRes)) return $updateRes;
// Prints info about the new added fehler
$this->_ci->eprintflib->printMessage(
sprintf(
'A new fehler has been added into the database: '.
'fehlercode => %s | fehler_kurzbz => %s | fehlertyp => %s',
$fehler[self::FEHLERCODE],
$fehler[self::FEHLER_KURZBZ],
$fehler[self::FEHLERTYP_KURZBZ]
)
);
}
// handle references
if (isset($fehlerReferences[self::APP]))
{
$this->_ci->load->model('system/FehlerApp_model', 'FehlerAppModel');
$apps = $fehlerReferences[self::APP];
// load all assigned apps
$this->_ci->FehlerAppModel->addSelect(self::APP);
$fehlerAppRes = $this->_ci->FehlerAppModel->loadWhere([self::FEHLERCODE => $fehler[self::FEHLERCODE]]);
$fehlerApps = hasData($fehlerAppRes) ? array_column(getData($fehlerAppRes), self::APP) : [];
$appsToInsert = array_diff($apps, $fehlerApps);
foreach ($appsToInsert as $app)
{
// check if app exists in db
$fehlerAppsInsertRes = $this->_ci->FehlerAppModel->insert(
[self::FEHLERCODE => $fehler[self::FEHLERCODE], self::APP => $app, 'insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY]
);
if (isError($fehlerAppsInsertRes)) return $fehlerAppsInsertRes;
$this->_ci->eprintflib->printMessage(
"Added app ".$app." to fehler ".$fehler[self::FEHLERCODE]
);
}
}
// If here then no blocking errors occurred
return success();
}
/**
* Create an array with fehler data from config entry
*/
private function _createFehlerFromEntry($configEntry)
{
$fehler = ['fehler' => [], 'references' => []];
foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo)
{
$required = isset($attributeInfo['required']) && $attributeInfo['required'];
if (!isset($configEntry[$attributeName]))
{
if ($required) return error('attribute'.$attributeName.' is missing');
continue;
}
$attributeValue = $configEntry[$attributeName];
$validType = false;
if (isset($attributeInfo['types']) && is_array($attributeInfo['types']))
{
foreach ($attributeInfo['types'] as $type)
{
switch ($type)
{
case self::TYPE_STRING:
if (is_string($attributeValue) || is_null($attributeValue)) $validType = true;
break;
case self::TYPE_ARRAY:
if (is_array($attributeValue) && !($required && isEmptyArray($attributeValue))) $validType = true;
break;
//~ default:
//~ if (is_string($configEntry[$attributeName]) || is_null($configEntry[$attributeName])) $validType = true;
}
}
}
else
{
$validType = is_string($attributeValue) || is_null($attributeValue);
}
if (!$validType)
{
return error('attribute'.$attributeName.' has invalid type');
}
if ($attributeName == self::APP)
{
if (is_string($attributeValue)) $attributeValue = [$attributeValue];
foreach ($attributeValue as $app)
{
// check if app exists in db
$this->_ci->AppModel->addSelect('1');
$appRes = $this->_ci->AppModel->loadWhere(['app' => $app]);
if (!hasData($appRes)) return error("App ".$app." does not exist");
}
}
if (isset($attributeInfo['types']) && is_array($attributeInfo['types']) && in_array(self::TYPE_ARRAY, $attributeInfo['types']))
{
$fehler['references'][$attributeName] = $attributeValue;
}
else
{
$fehler['fehler'][$attributeName] = $attributeValue;
}
}
return success($fehler);
}
}
+35 -21
View File
@@ -20,6 +20,10 @@ class IssuesLib
const ERRORTYPE_CODE = 'error';
const WARNINGTYPE_CODE = 'warning';
const STATUS_KURZBZ = 'status_kurzbz';
const VERARBEITET_AMUM = 'verarbeitetamum';
const VERARBEITET_VON = 'verarbeitetvon';
public function __construct($params = null)
{
$this->_ci =& get_instance();
@@ -91,12 +95,16 @@ class IssuesLib
return error("fehlercode_extern missing");
// get external fehlercode (unique for each app)
$this->_ci->FehlerModel->addSelect('fehlercode');
$fehlerRes = $this->_ci->FehlerModel->loadWhere(
array(
'fehlercode_extern' => $fehlercode_extern,
'app' => $this->_app
)
$fehlerRes = $this->_ci->FehlerModel->execReadOnlyQuery(
'
SELECT
fehlercode
FROM
system.tbl_fehler fe
WHERE
fehlercode_extern = ?
AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode AND app = ?)',
[$fehlercode_extern, $this->_app]
);
if (isError($fehlerRes))
@@ -105,8 +113,10 @@ class IssuesLib
// check if there is a predefined custom error for the external issue
if (hasData($fehlerRes))
{
$fehlerData = getData($fehlerRes)[0];
// if found, use the code
$fehlerData = getData($fehlerRes);
if (count($fehlerData) > 1) return error("Multiple fehlercode_extern ".$fehlercode_extern. " for app ".$this->_app);
$fehlerData = getData($fehlerRes)[0];
$fehlercode = $fehlerData->fehlercode;
}
else
@@ -128,9 +138,9 @@ class IssuesLib
public function setBehoben($issue_id, $user)
{
$data = array(
'status_kurzbz' => self::STATUS_BEHOBEN,
'verarbeitetvon' => $user,
'verarbeitetamum' => date('Y-m-d H:i:s')
self::STATUS_KURZBZ => self::STATUS_BEHOBEN,
self::VERARBEITET_VON => $user,
self::VERARBEITET_AMUM => date('Y-m-d H:i:s')
);
return $this->_changeIssueStatus($issue_id, $data, $user);
@@ -145,8 +155,8 @@ class IssuesLib
public function setInBearbeitung($issue_id, $user)
{
$data = array(
'status_kurzbz' => self::STATUS_IN_BEARBEITUNG,
'verarbeitetvon' => $user
self::STATUS_KURZBZ => self::STATUS_IN_BEARBEITUNG,
self::VERARBEITET_VON => $user
);
return $this->_changeIssueStatus($issue_id, $data, $user);
@@ -161,9 +171,9 @@ class IssuesLib
public function setNeu($issue_id, $user)
{
$data = array(
'status_kurzbz' => self::STATUS_NEU,
'verarbeitetvon' => null,
'verarbeitetamum' => null
self::STATUS_KURZBZ => self::STATUS_NEU,
self::VERARBEITET_VON => null,
self::VERARBEITET_AMUM => null
);
return $this->_changeIssueStatus($issue_id, $data, $user);
@@ -185,13 +195,18 @@ class IssuesLib
return error("Issue Id must be set correctly.");
// check if given status is same as existing
$this->_ci->IssueModel->addSelect('status_kurzbz');
$this->_ci->IssueModel->addSelect(self::STATUS_KURZBZ.', '.self::VERARBEITET_AMUM);
$currStatus = $this->_ci->IssueModel->load($issue_id);
if (hasData($currStatus))
{
if (getData($currStatus)[0]->status_kurzbz == $data['status_kurzbz'])
$currStatusData = getData($currStatus)[0];
// if same status set, and verarbeitet amum is not being newly set
if ($currStatusData->{self::STATUS_KURZBZ} == $data[self::STATUS_KURZBZ]
&& !(isset($data[self::VERARBEITET_AMUM]) && !isset($currStatusData->{self::VERARBEITET_AMUM}))
) {
return success("Same status already set");
}
}
else
return error("Error when getting status");
@@ -227,11 +242,10 @@ class IssuesLib
$fehlercode_extern = null,
$inhalt_extern = null
) {
if (isEmptyString($person_id) && isEmptyString($oe_kurzbz))
return error("Person_id or oe_kurzbz must be set.");
if (!is_numeric($person_id) && isEmptyString($oe_kurzbz)) return error("Person_id or oe_kurzbz must be set, fehlercode: $fehlercode");
// get fehlertextVorlage and replace it with params
$fehlerRes = $this->_ci->FehlerModel->load($fehlercode);
$fehlerRes = $this->_ci->FehlerModel->loadWhere(['fehlercode' => $fehlercode]);
if (hasData($fehlerRes))
{
@@ -241,7 +255,7 @@ class IssuesLib
if (!isEmptyArray($fehlertext_params))
{
if (count($fehlertext_params) != substr_count($fehlertextVorlage, '%s'))
return error('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehlercode);
return error('Wrong number of parameters for Fehlertext, fehlercode ' . $fehlercode);
$fehlertext = vsprintf($fehlertextVorlage, $fehlertext_params);
}
+178 -79
View File
@@ -17,7 +17,12 @@ class LektorLib
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
$this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->_ci->load->library('PhrasesLib', array('lehre'));
$this->_ci->load->library('VariableLib', ['uid' => getAuthUID()]);
}
public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
@@ -78,10 +83,13 @@ class LektorLib
public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data)
{
$old_uid = $mitarbeiter_uid;
$new_uid = isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid;
$this->_ci->LehreinheitmitarbeiterModel->addSelect('lehre.tbl_lehreinheitmitarbeiter.*, lehre.tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
$lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid));
if (isError($lehreinheit_result)) return $lehreinheit_result;
@@ -89,27 +97,47 @@ class LektorLib
$lehreinheit = getData($lehreinheit_result)[0];
$semesterstunden_alt = $lehreinheit->semesterstunden;
$semesterstunden_neu = isset($new_data['semesterstunden']) ? $new_data['semesterstunden'] : $semesterstunden_alt;
$bismelden_neu = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
$neue_stunden_eingerechnet = (bool)$bismelden_neu;
$alte_stunden_eingerechnet = (bool)$lehreinheit->bismelden;
$stundenplan_update = false;
//TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich
if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid)
if ($old_uid !== $new_uid)
{
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (hasData($verplant))
return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant"));
$lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id));
$lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_uid, 'lehreinheit_id' => $lehreinheit_id));
if (hasData($lehreinheit_data))
return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
$this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid));
if (hasData($verplant))
{
$kollision = $this->hasKollision(getData($verplant), $new_uid);
$ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
if ($kollision === false || $ignore_kollision == 'true')
{
$stundenplan_update = true;
}
else if (is_array($kollision))
{
return error( "Änderung fehlgeschlagen! Die Änderung des Lektors führt zu ".count($kollision)." Kollision(en) im LV-Plan. Deaktivieren Sie die Kollisionspruefung oder wenden Sie sich an die LV-Planung!\n zB. $kollision[0]");
}
else
{
return error($kollision);
}
}
}
$warning = '';
if (isset($new_data['semesterstunden']))
if (($semesterstunden_neu !== '' && $semesterstunden_alt !== '') && (($semesterstunden_neu > $semesterstunden_alt) || $neue_stunden_eingerechnet))
{
$studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz));
if (isError($studiengang_result)) return $studiengang_result;
@@ -120,7 +148,7 @@ class LektorLib
if (isError($studiensemester_result)) return $studiensemester_result;
$studiensemester = getData($studiensemester_result)[0];
$echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
$echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($new_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
$echter_dv = false;
@@ -129,83 +157,81 @@ class LektorLib
$echter_dv = true;
}
$neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
$alte_stunden_eingerechnet = $lehreinheit->bismelden;
$stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
if (isError($stundengrenze_result)) return $stundengrenze_result;
if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet)
$stundengrenze = getData($stundengrenze_result)[0];
$oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array();
$semesterstunden_alt_sql = is_null($semesterstunden_alt) ? 0 : $semesterstunden_alt;
$semesterstunden_neu_sql = is_null($semesterstunden_neu) ? 0 : $semesterstunden_neu;
if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)}) as summe");
else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql)) as summe");
else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)})) as summe");
else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $new_uid);
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
$this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
if (count($oe_array) > 0)
{
$stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
if (isError($stundengrenze_result)) return $stundengrenze_result;
$stundengrenze = getData($stundengrenze_result)[0];
$oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])}) as summe");
else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden)) as summe");
else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])})) as summe");
else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', (isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid));
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
$this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
$this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
}
if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
&& is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
&& count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
{
$this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
}
if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
&& is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
&& count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
$summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
if (isError($summe_result)) return $summe_result;
if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
$summe = getData($summe_result)[0]->summe;
if ($summe > $stundengrenze->stunden)
{
if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
{
$this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
if (!$this->LehrauftragAufFirma($new_uid))
return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
}
else
{
$warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
}
$summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
$stunden_limit_result = $this->getStundenInstitut($new_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
if (isError($summe_result)) return $summe_result;
if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
$summe = getData($summe_result)[0]->summe;
if ($summe > $stundengrenze->stunden)
if (hasData($stunden_limit_result))
{
if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
$stunden_limit_array = getData($stunden_limit_result);
foreach ($stunden_limit_array as $stunden_limit)
{
if (!$this->LehrauftragAufFirma(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid))
return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
}
else
{
$warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
}
$stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
if (hasData($stunden_limit_result))
{
$stunden_limit_array = getData($stunden_limit_result);
foreach ($stunden_limit_array as $stunden_limit)
{
$warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
}
$warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
}
}
}
}
$benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid));
$benutzer_result = $this->_ci->BenutzerModel->load(array($new_uid));
if (isError($benutzer_result)) return $benutzer_result;
@@ -227,12 +253,23 @@ class LektorLib
'bismelden'
);
$nullable_fields = array('stundensatz', 'semesterstunden', 'planstunden');
$updateData = array();
foreach ($updatableFields as $field)
{
$value = isset($new_data[$field]) ? $new_data[$field] : null;
if (!array_key_exists($field, $new_data))
{
continue;
}
if ($value !== null)
$value = $new_data[$field];
if (in_array($field, $nullable_fields))
{
$updateData[$field] = $value;
}
elseif ($value !== null)
{
$updateData[$field] = $value;
}
@@ -240,10 +277,24 @@ class LektorLib
$updateData['updatevon'] = getAuthUID();
$updateData['updateamum'] = date('Y-m-d H:i:s');
$result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid), $updateData);
$result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid), $updateData);
if (isError($result)) return $result;
if ($stundenplan_update)
{
$update_result = $this->_ci->StundenplandevModel->update([
'lehreinheit_id' => $lehreinheit_id,
'mitarbeiter_uid' => $old_uid,
], [
'mitarbeiter_uid' => $new_uid,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => getAuthUID()
]);
if (isError($update_result)) return $update_result;
}
if ($warning !== '') return success(['warning' => $warning]);
return success('Erfolgreich geupdated');
@@ -347,4 +398,52 @@ class LektorLib
$this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung');
return $this->_ci->LehreinheitmitarbeiterModel->load();
}
private function hasKollision($stunden, $mitarbeiter)
{
$kollision = array();
$ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
$ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
foreach ($stunden as $stunde)
{
$stundenplan_result = $this->_ci->StundenplandevModel->lektorHasStundenplandevEintrag($mitarbeiter, $stunde->datum, $stunde->stunde);
if (isError($stundenplan_result))
return $stundenplan_result;
if (hasData($stundenplan_result))
{
$stundenplan_result = getData($stundenplan_result)[0];
$kollision[] = "Kollision stundenplandev: $stundenplan_result->stundenplandev_id|$stundenplan_result->lektor|$stundenplan_result->ort_kurzbz|$stundenplan_result->stg_kurzbz-$stundenplan_result->semester$stundenplan_result->verband$stundenplan_result->gruppe$stundenplan_result->gruppe_kurzbz - $stundenplan_result->datum/$stundenplan_result->stunde";
}
else
{
if ($ignore_zeitsperre == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER))))
{
$zeitsperre_result = $this->_ci->ZeitsperreModel->checkIfZeitsperreExists($mitarbeiter, $stunde->datum, $stunde->stunde);
if (hasData($zeitsperre_result))
{
$zeitsperre_result = getData($zeitsperre_result)[0];
$kollision[] = "Kollision (Zeitsperre): $zeitsperre_result->zeitsperre_id|$zeitsperre_result->mitarbeiter_uid|$zeitsperre_result->zeitsperretyp_kurzbz - $zeitsperre_result->vondatum/$zeitsperre_result->vonstunde|$zeitsperre_result->bisdatum/$zeitsperre_result->bisstunde";
}
}
if ($ignore_reservierung == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER))))
{
$reservierung_result = $this->_ci->ReservierungModel->lektorHasReservierung($mitarbeiter, $stunde->datum, $stunde->stunde);
if (hasData($reservierung_result))
{
$reservierung_result = getData($reservierung_result)[0];
$kollision[] = "Kollision (Reservierung): $reservierung_result->reservierung_id|$reservierung_result->uid|$reservierung_result->ort_kurzbz|$reservierung_result->stg_kurzbz-$reservierung_result->semester$reservierung_result->verband$reservierung_result->gruppe$reservierung_result->gruppe_kurzbz - $reservierung_result->datum/$reservierung_result->stunde";
}
}
}
}
return isEmptyArray($kollision) ? false : $kollision;
}
}
+19 -1
View File
@@ -80,10 +80,12 @@ class StundenplanLib
if (isError($semester_range))
return $semester_range;
$semester_range = getData($semester_range);
$this->_ci->addMeta('semester_range', $semester_range);
$this->sortStudienSemester($semester_range);
$function_error = $this->applyLoadUeberSemesterHaelfte($semester_range);
$this->_ci->addMeta('nach_apply_semester_range', $semester_range);
if ($function_error)
return $function_error;
@@ -184,6 +186,21 @@ class StundenplanLib
return success($stundenplan_data);
}
public function getEventsByLE($lehreinheit_id, $start, $end, $stundenplan)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
return $this->_ci->StundenplanModel->getStundenplanLE($lehreinheit_id, $start, $end, $stundenplan);
}
public function getEventsByLV($lehrveranstaltung_id, $start, $end, $stundenplan)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
return $this->_ci->StundenplanModel->getStundenplanLV($lehrveranstaltung_id, $start, $end, $stundenplan);
}
/**
* Get stundenplan for a room
*
@@ -784,7 +801,8 @@ class StundenplanLib
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// gets all studiensemester from the student from start_date to end_date
$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
//$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
$semester_range = $this->_ci->StudiensemesterModel->getContainingOrNearestByDateRange($start_date, $end_date);
if (isError($semester_range))
return $semester_range;
+392
View File
@@ -0,0 +1,392 @@
<?php
/**
* FH-Complete
*
* @package FHC-Helper
* @author FHC-Team
* @copyright Copyright (c) 2026 fhcomplete.net
* @license GPLv3
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
use \stdClass as stdClass;
class TagLib
{
/**
* Object initialization
*/
public function __construct()
{
$this->_ci =& get_instance();
// Configs
$this->_ci->load->config('stv');
// Models
$this->_ci->load->model('person/Notiz_model', 'NotizModel');
$this->_ci->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->_ci->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// Libraries
$this->_ci->load->library('PermissionLib');
$this->_ci->load->library('PrestudentLib');
$this->batchUser = $this->_ci->config->item('userAutomatedTags');
}
public function updateAutomatedTags($paramsTag)
{
// ---------------------------------
// check params
// ---------------------------------
$required = ['kurzbz', 'data', 'typeId'];
foreach ($required as $key) {
if (!isset($paramsTag[$key])) {
return error('Missing Parameter: ' . $key);
}
}
$studiensemester_kurzbz = (isset ($paramsTag['studiensemester_kurzbz']) ? $paramsTag['studiensemester_kurzbz'] : null);
$tag = $paramsTag['kurzbz'];
$inputData = $paramsTag['data'];
$typeId = $paramsTag['typeId'];
// ---------------------------------
// prepare input
// ---------------------------------
$zeitraum = [];
$arrayIds = [];
foreach ($inputData as $item) {
$id = $item['id'];
$arrayIds[] = $id;
$zeitraum[$id] = [
'von' => $item['von'] ?? null,
'bis' => $item['bis'] ?? null
];
}
$arrayIds = array_unique($arrayIds);
$result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
if (isError($result)) {
return $result;
}
$data = $result->retval[0] ?? null;
$von = $data->start ?? null;
$bis = $data->ende ?? null;
// ---------------------------------
// load existing tags
// ---------------------------------
$allTags = [];
$resultAllTags = $this->_ci->NotizModel->getAllTags($tag, $von, $bis);
if (isError($resultAllTags)) {
return $resultAllTags;
}
$allTagsData = getData($resultAllTags);
if (!empty($allTagsData)) {
foreach ($allTagsData as $item) {
$allTags[$item->$typeId] = $item->notiz_id;
}
}
// ---------------------------------
// map the data
// ---------------------------------
$toRecycle = [];
$toAdd = [];
$toDelete = [];
foreach ($arrayIds as $id) {
if (isset($allTags[$id])) {
$toRecycle[$id] = $allTags[$id];
} else {
$toAdd[] = $id;
}
}
foreach ($allTags as $id => $notizId) {
if (!in_array($id, $arrayIds)) {
$toDelete[$id] = $notizId;
}
}
// ---------------------------------
// recycle (update existing)
// ---------------------------------
$countRecycled = 0;
$retagged = [];
foreach ($toRecycle as $id => $notizId)
{
$this->_updateTag($notizId, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
$countRecycled++;
$retagged[] = $id;
}
// ---------------------------------
// ADD
// ---------------------------------
$countAdded = 0;
$tagged = [];
foreach ($toAdd as $id)
{
$this->_insertTag($typeId, $id, $tag, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
$countAdded++;
$tagged[] = $id;
}
// ---------------------------------
// delete
// ---------------------------------
$countDeleted = 0;
$deleted = [];
foreach ($toDelete as $id => $notizId)
{
$result = $this->_deleteTag($notizId);
if (isError($result)) {
return $result;
}
$countDeleted++;
$deleted[] = $id;
}
// ---------------------------------
// return
// ---------------------------------
return success([
'input' => [
'tag' => $tag,
'arrayIds' => $arrayIds
],
'summary' => [
'recycled' => $countRecycled,
'added' => $countAdded,
'deleted' => $countDeleted
],
'details' => [
'existingTags' => $allTags,
'toAdd' => $toAdd,
'toRecycle' => $toRecycle,
'toDelete' => $toDelete
],
'results' => [
'retaggedIds' => $retagged,
'newTags' => $tagged,
'deletedTagsIds' => $deleted
]
]);
}
public function updateAutomatedTagsForTypeId(array $params)
{
$return = null;
$notiz_id = null;
$von = $params['von'];
$bis = $params['bis'];
$tag = $params['kurzbz'];
$id = $params['id'];
$typeId = $params['typeId'];
$this->_ci->NotizModel->addSelect('nz.notiz_id');
$this->_ci->NotizModel->addSelect($typeId);
$this->_ci->NotizModel->addJoin('public.tbl_notizzuordnung nz', 'notiz_id');
$resultAllTags = $this->_ci->NotizModel->loadWhere([
'typ' => $tag,
$typeId => $id
]);
if(hasData($resultAllTags))
{
$notiz_id = $resultAllTags->retval[0]->notiz_id;
}
//RECYCLE
if ($notiz_id !== null)
{
$resultUpdateNotiz = $this->_updateTag($notiz_id, $von, $bis);
$return = ['recycled' => $resultUpdateNotiz];
}
else
//ADD
{
$resultInsertNotiz = $this->_insertTag($typeId, $id, $tag, $von, $bis);
$return = ['added' => $resultInsertNotiz];
}
return success($return);
}
/*
* main function for rebuild Tags for typeId
* */
public function rebuildTagsForTypeId($typeId, $id, $studiensemester_kurzbz)
{
$automatedTagsRes = $this->_ci->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
$result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
if (isError($result))
return error('Error occurred during retrieving studiensemester');
if (empty($result->retval) || !isset($result->retval[0])) {
return error('No studiensemester found');
}
$startSem = $result->retval[0]->start ?? null;
$endeSem = $result->retval[0]->ende ?? null;
$return = [];
foreach ($automatedTags as $autoTag)
{
// getPath: must not be lost
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
if (file_exists($filePath)) {
require_once($filePath);
} else {
echo "File not found: " . $filePath;
continue;
}
$className = basename($autoTag->taglib);
$kurz_bz = $autoTag->typ_kurzbz;
$obj = new $className();
$criteriaIsSet = $obj->isCriteriaSetFor([
'typeId' => $typeId,
'id' => $id,
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
if (hasData($criteriaIsSet))
{
$von = isset($criteriaIsSet->retval[0]->von) ? $criteriaIsSet->retval[0]->von : '';
$bis = isset($criteriaIsSet->retval[0]->bis) ? $criteriaIsSet->retval[0]->bis : '';
$params = [
'von' => $von,
'bis' => $bis,
'kurzbz' => $autoTag->typ_kurzbz,
'typeId' => $typeId,
'id' => $id,
];
$result = $this->updateAutomatedTagsForTypeId($params);
if (isError($result))
return error('Error occurred during updateAutomatedTags' . $kurz_bz);
$return[$kurz_bz] = $result;
}
else
{
//CHECK FOR DELETE
$params = [
'von' => $startSem,
'bis' => $endeSem,
'kurzbz' => $autoTag->typ_kurzbz,
'typeId' => $typeId,
'id' => $id,
];
$result = $this->_ci->NotizModel->checkIfExistingTag($kurz_bz, $typeId, $id, $startSem, $endeSem);
if (hasData($result))
{
$notizId = $result->retval[0]->notiz_id;
$this->_deleteTag($notizId);
$return[$kurz_bz] = ['deleted' => $notizId];
}
}
}
return success($return);
}
private function _insertTag($typeId, $id, $tag, $von, $bis)
{
$resultInsert = $this->_ci->NotizModel->insert([
'titel' => 'TAG',
'text' => 'AUTOMATED TAG',
'verfasser_uid' => $this->batchUser,
'erledigt' => false,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'BatchJobTagAdd',
'typ' => $tag,
'start' => $von,
'ende' => $bis
]);
if (isError($resultInsert)) {
return error('Error inserting tag for ' . $typeId . ': ' . $id);
}
$notizId = $resultInsert->retval;
$resultZuordnung = $this->_ci->NotizzuordnungModel->insert([
'notiz_id' => $notizId,
$typeId => $id
]);
if (isError($resultZuordnung)) {
return error('Error inserting relation for ' . $typeId . ': ' . $id);
}
return $notizId;
}
private function _updateTag($notiz_id, $von, $bis)
{
$resultUpdateNotiz = $this->_ci->NotizModel->update(
[
'notiz_id' => $notiz_id
],
array(
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => 'BatchJobTagUpdate',
'start' => $von,
'ende' => $bis
));
if (isError($resultUpdateNotiz))
return error ('Error occurred during Update ' . $notiz_id);
return $notiz_id;
}
private function _deleteTag($notiz_id)
{
$result = $this->_ci->NotizzuordnungModel->delete([
'notiz_id' => $notiz_id
]);
if (isError($result)) {
return error('Error occurred during delete Notizzuordnung ' . $notiz_id);
}
$result = $this->_ci->NotizModel->delete([
'notiz_id' => $notiz_id
]);
if (isError($result)) {
return error('Error occurred during delete Notiz ' . $notiz_id);
}
return success([
'deleted' => $notiz_id
]);
}
}
@@ -9,48 +9,40 @@ class PlausicheckDefinitionLib
{
// set fehler for core plausichecks
// structure: fehler_kurzbz => class (library) name for resolving
private $_fehlerLibMappings = array(
'AbbrecherAktiv' => 'AbbrecherAktiv',
'AbschlussstatusFehlt' => 'AbschlussstatusFehlt',
'AktSemesterNull' => 'AktSemesterNull',
'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus',
'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus',
'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt',
'DatumSponsionFehlt' => 'DatumSponsionFehlt',
'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge',
'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen',
'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen',
'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen',
'GbDatumWeitZurueck' => 'GbDatumWeitZurueck',
'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus',
'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich',
'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz',
'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant',
'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung',
'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde',
'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent',
'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform',
'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan',
'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent',
'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher',
private $_fehlerKurzbz = array(
'AbbrecherAktiv',
'AbschlussstatusFehlt',
'AktSemesterNull',
'AktiverStudentOhneStatus',
'AusbildungssemPrestudentUngleichAusbildungssemStatus',
'DatumAbschlusspruefungFehlt',
'DatumSponsionFehlt',
'DatumStudiensemesterFalscheReihenfolge',
'FalscheAnzahlAbschlusspruefungen',
'FalscheAnzahlHeimatadressen',
'FalscheAnzahlZustelladressen',
'GbDatumWeitZurueck',
'InaktiverStudentAktiverStatus',
'IncomingHeimatNationOesterreich',
'IncomingOhneIoDatensatz',
'IncomingOrGsFoerderrelevant',
'InskriptionVorLetzerBismeldung',
'NationNichtOesterreichAberGemeinde',
'OrgformStgUngleichOrgformPrestudent',
'PrestudentMischformOhneOrgform',
'StgPrestudentUngleichStgStudienplan',
'StgPrestudentUngleichStgStudent',
'StudentstatusNachAbbrecher',
'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung'
//'StudienplanUngueltig' => 'StudienplanUngueltig'
//'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten'
//'StudienplanUngueltig',
//'BewerberNichtZumRtAngetreten'
);
/**
* Gets all fehler_kurzbz-library mappings for fehler which need to be checked.
*/
public function getFehlerLibMappings()
{
return $this->_fehlerLibMappings;
}
/**
* Gets all fehler_kurzbz for fehler which need to be checked.
*/
public function getFehlerKurzbz()
{
return array_keys($this->_fehlerLibMappings);
return $this->_fehlerKurzbz;
}
}
@@ -6,36 +6,43 @@ class PlausicheckProducerLib
{
const CI_PATH = 'application';
const CI_LIBRARY_FOLDER = 'libraries';
const EXTENSIONS_FOLDER = 'extensions';
const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks';
const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck';
const CONFIG_FEHLER_NAME = 'fehler';
const CONFIG_FEHLER_INDEX = 'fehler';
const FEHLER_KURZBZ_NAME = 'fehler_kurzbz';
const PRODUCER_LIB_NAME = 'producerLibName';
const EXTENSION_NAME = 'extensionName';
private $_ci; // ci instance
private $_extensionName; // name of extension
private $_konfiguration = []; // configuration parameters
private $_fehlerKurzbz = []; // fehler to produce
private $_fehlerLibMappings = []; // mappings of fehler and libraries for producing them
private $_isForResolutionCheck = false; // mappings of fehler and libraries for producing them
private $_apps = []; // apps of fehler to produce
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName'];
if (isset($params['fehlerLibMappings'])) $this->_fehlerLibMappings = $params['fehlerLibMappings'];
if (isset($params['isForResolutionCheck'])) $this->_isForResolutionCheck = $params['isForResolutionCheck'];
// set application
$app = isset($params['app']) ? $params['app'] : null;
// set application(s))
if (isset($params['apps']))
{
if (is_string($params['apps'])) $params['apps'] = [$params['apps']];
if (is_array($params['apps'])) $this->_apps = $params['apps'];
}
$this->_ci =& get_instance(); // get ci instance
// load libraries
$this->_ci->load->library('IssuesLib');
$this->_ci->load->library('ExtensionsLib');
// load models
$this->_ci->load->model('system/Fehler_model', 'FehlerModel');
$this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel');
// get all configuration parameters for the application
$fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($app);
$this->_ci->load->config(self::CONFIG_FEHLER_NAME);
// get all configuration parameters for the application(s))
$fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($this->_apps);
if (hasData($fehlerkonfigurationRes))
{
@@ -46,10 +53,88 @@ class PlausicheckProducerLib
$this->_konfiguration[$fk->fehler_kurzbz][$fk->konfigurationstyp_kurzbz] = $fk->konfiguration;
}
}
// get all fehler to be produced (by kurzbz array or app)
if (isset($params['fehlerKurzbz']) && !isEmptyArray($params['fehlerKurzbz']))
{
$this->_fehlerKurzbz = $params['fehlerKurzbz'];
}
else
{
// get fehler by apps
$fehlerRes = $this->_ci->FehlerModel->getByApps($this->_apps);
if (hasData($fehlerRes)) $this->_fehlerKurzbz = array_column(getData($fehlerRes), 'fehler_kurzbz');
}
// get producer file paths for the fehler
// Load Fehler Entries of Core
$configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX);
if (isset($configArray) && is_array($configArray))
{
foreach ($configArray as $coreEntry)
{
if (!isset($coreEntry[self::FEHLER_KURZBZ_NAME])
|| !isset($coreEntry[self::PRODUCER_LIB_NAME])
|| !in_array($coreEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz)
) {
continue;
}
$this->_fehlerLibMappings[$coreEntry[self::FEHLER_KURZBZ_NAME]][self::PRODUCER_LIB_NAME] = $coreEntry[self::PRODUCER_LIB_NAME];
}
}
// load fehler entries of extensions
$extensions = $this->_ci->extensionslib->getInstalledExtensions();
if (hasData($extensions))
{
$extensionArray = array();
$extensionsData = getData($extensions);
foreach ($extensionsData as $ext)
{
$configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php';
$configFilename = APPPATH.'config/'.$configFilePath;
// if fehler config file exists in extension
if (file_exists($configFilename))
{
$config = array(); // default value
// include the config file
include($configFilename);
if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME]))
{
foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry)
{
if (
!isset($extensionEntry[self::FEHLER_KURZBZ_NAME])
|| !isset($extensionEntry[self::PRODUCER_LIB_NAME])
|| !in_array($extensionEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz)
) {
continue;
}
// add extension config data to fehler lib mappings
$fehler_kurzbz = $extensionEntry[self::FEHLER_KURZBZ_NAME];
$this->_fehlerLibMappings[$fehler_kurzbz][self::PRODUCER_LIB_NAME] = $extensionEntry[self::PRODUCER_LIB_NAME];
$this->_fehlerLibMappings[$fehler_kurzbz][self::EXTENSION_NAME] = $ext->name;
}
}
}
}
}
}
/**
* Produces multiple plausicheck issues at once and saved them to db.
* Produces multiple plausicheck issues at once, and saves them in the database.
* @param array $params passed to each plausicheck
* @return result object with occured error and info
*/
@@ -59,10 +144,17 @@ class PlausicheckProducerLib
$result->errors = [];
$result->infos = [];
foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName)
$mappingFehlerKurbz = array_keys($this->_fehlerLibMappings);
// check if all issues to produce could be found in database
//~ $notFoundFehlerKurzbz = array_diff($this->_fehlerKurzbz, $mappingFehlerKurbz);
//~ if (!isEmptyArray($notFoundFehlerKurzbz))
//~ $result->errors[] = error('Fehler to produce not defined in config: '.implode(', ', $notFoundFehlerKurzbz));
foreach ($mappingFehlerKurbz as $fehler_kurzbz)
{
$plausicheckRes = $this->producePlausicheckIssue(
$libName,
$fehler_kurzbz,
$params
);
@@ -96,14 +188,23 @@ class PlausicheckProducerLib
/**
* Executes plausicheck using a given library, returns the result.
* @param $libName string name of library producing the issue
* @param $fehler_kurzbz string unique short name of fehler, for which issue is produced
* @param $params parameters passed to issue production method
*/
public function producePlausicheckIssue($libName, $fehler_kurzbz, $params)
public function producePlausicheckIssue($fehler_kurzbz, $params)
{
//if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return error("Mapping for Fehler " . $fehler_kurzbz . " was not found");
if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return success(null);
$mapping = $this->_fehlerLibMappings[$fehler_kurzbz];
if (!isset($mapping[self::PRODUCER_LIB_NAME]) || isEmptyString($mapping[self::PRODUCER_LIB_NAME]))
return error("No producer lib name set for Fehler " . $fehler_kurzbz);
$libName = $mapping[self::PRODUCER_LIB_NAME];
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
$libRootPath = isset($mapping[self::EXTENSION_NAME]) ? ExtensionsLib::EXTENSIONS_DIR_NAME . '/' . $mapping[self::EXTENSION_NAME] . '/' : '';
// path for loading issue library
$issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/';
@@ -121,7 +222,7 @@ class PlausicheckProducerLib
// load library connected to fehlercode
$this->_ci->load->library(
$issuesLibPath . $libName,
['configurationParams' => $config, 'isForResolutionCheck' => $this->_isForResolutionCheck]
['configurationParams' => $config]
);
$lowercaseLibName = mb_strtolower($libName);
@@ -133,4 +234,13 @@ class PlausicheckProducerLib
// call the function for checking for issue production
return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params);
}
/**
* Get fehler kurzbz -> library mappings.
* @return array with fehler kurzbz as key and fehlerinfo as values
*/
public function getFehlerMappings()
{
return $this->_fehlerLibMappings;
}
}
@@ -9,43 +9,177 @@ class PlausicheckResolverLib
const EXTENSIONS_FOLDER = 'extensions';
const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers';
const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved';
const CONFIG_FEHLER_NAME = 'fehler';
const FEHLERCODE_NAME = 'fehlercode';
const FEHLER_KURZBZ_NAME = 'fehler_kurzbz';
const RESOLVER_LIB_NAME = 'resolverLibName';
const PRODUCER_IS_RESOLVER_NAME = 'producerIsResolver';
const EXTENSION_NAME = 'extensionName';
private $_ci; // ci instance
private $_extensionName; // name of extension
private $_fehlercodes = []; // fehlercodes to resolve
private $_apps = []; // apps for which issues should be resolved
private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver
private $_codeProducerLibMappings = []; // mappings for issues which are resolved with the same check as they are produced
private $_defaultIssueParams = ['issue_id' => 'issue_id', 'issue_person_id' => 'person_id', 'issue_oe_kurzbz' => 'oe_kurzbz'];
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName'];
if (isset($params['codeLibMappings'])) $this->_codeLibMappings = $params['codeLibMappings'];
if (isset($params['codeProducerLibMappings'])) $this->_codeProducerLibMappings = $params['codeProducerLibMappings'];
// set application(s))
if (isset($params['apps']))
{
if (is_string($params['apps'])) $params['apps'] = [$params['apps']];
if (is_array($params['apps'])) $this->_apps = $params['apps'];
}
$this->_ci =& get_instance(); // get ci instance
// get all fehler to be produced (by kurzbz array or app)
if (isset($params['fehlercodes']) && !isEmptyArray($params['fehlercodes']))
{
$this->_fehlercodes = $params['fehlercodes'];
}
elseif (isset($params['apps']) && !isEmptyArray($params['apps']))
{
$this->_ci->load->model('system/Fehler_model', 'FehlerModel');
$fehlerRes = $this->_ci->FehlerModel->getByApps($this->_apps);
if (hasData($fehlerRes))
{
$this->_fehlercodes = array_column(getData($fehlerRes), 'fehlercode');
}
}
$this->_ci->load->library('IssuesLib');
$this->_ci->load->library('issues/PlausicheckProducerLib', ['extensionName' => $this->_extensionName, 'isForResolutionCheck' => true]);
$this->_ci->load->library('ExtensionsLib');
$this->_ci->load->config('fehler');
// Load Fehler Entries of Core
$configArray = $this->_ci->config->item(self::CONFIG_FEHLER_NAME);
foreach ($configArray as $coreEntry)
{
// each entry must have fehlercode
if (!isset($coreEntry[self::FEHLERCODE_NAME])
|| !in_array($coreEntry[self::FEHLERCODE_NAME], $this->_fehlercodes)
) {
continue;
}
// fill code lib mappings with needed values
$fehlercode = $coreEntry[self::FEHLERCODE_NAME];
if (isset($coreEntry[self::FEHLER_KURZBZ_NAME]))
$this->_codeLibMappings[$fehlercode][self::FEHLER_KURZBZ_NAME] = $coreEntry[self::FEHLER_KURZBZ_NAME];
$this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME] = $coreEntry[self::RESOLVER_LIB_NAME] ?? null;
$this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME]
= $coreEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false;
}
// load fehler entries of extensions
$extensions = $this->_ci->extensionslib->getInstalledExtensions();
if (hasData($extensions))
{
$extensionArray = array();
$extensionsData = getData($extensions);
foreach ($extensionsData as $ext)
{
$configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php';
// if fehler config file exists in teh extension
if (file_exists($configFilename))
{
$config = array(); // default value
// include config data
include($configFilename);
if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME]))
{
foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry)
{
if (
!isset($extensionEntry[self::FEHLERCODE_NAME])
|| !in_array($extensionEntry[self::FEHLERCODE_NAME], $this->_fehlercodes)
) {
continue;
}
// add extension config data to fehlercode lib mappings
$fehlercode = $extensionEntry[self::FEHLERCODE_NAME];
if (isset($extensionEntry[self::FEHLER_KURZBZ_NAME]))
$this->_codeLibMappings[$fehlercode][self::FEHLER_KURZBZ_NAME] = $extensionEntry[self::FEHLER_KURZBZ_NAME];
$this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME]
= $extensionEntry[self::RESOLVER_LIB_NAME] ?? null;
$this->_codeLibMappings[$fehlercode][self::EXTENSION_NAME] = $ext->name;
$this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME]
= $extensionEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false;
}
}
}
}
}
}
/**
* Reseolves multiple plausicheck issues at once.
* @param array $codeLibMappings contains fehler type to check and library responsible for check (fehlercode => libName)
* @param array $openIssues passed issues to resolve
* @param array $openIssues passed issues to resolve. If null, issues with fehlercodes in _fehlercodes property are loaded
* @return result object with occured error and info
*/
public function resolvePlausicheckIssues($openIssues)
public function resolvePlausicheckIssues($openIssues = null)
{
// loading producer lib with fehler kurzbz of provided code mappings, for "self resolving" issues
$this->_ci->load->library(
'issues/PlausicheckProducerLib',
['fehlerKurzbz' => array_column($this->_codeLibMappings, self::FEHLER_KURZBZ_NAME)], 'PlausicheckResolverProducerLib'
);
if (!isset($openIssues))
{
if (!isEmptyArray($this->_fehlercodes))
{
$this->_ci->load->model('system/Issue_model', 'IssueModel');
// load open issues with given errorcodes
$openIssuesRes = $this->_ci->IssueModel->getOpenIssues(
$this->_fehlercodes
);
$openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : [];
}
}
$result = new StdClass();
$result->errors = [];
$result->infos = [];
// check if all issues to resolve could be found in database
//~ $mappingFehlerCodes = array_keys($this->_codeLibMappings);
//~ $notFoundFehlerCodes = array_diff($this->_fehlercodes, $mappingFehlerCodes);
//~ if (!isEmptyArray($notFoundFehlerCodes))
//~ $result->errors[] = error('Fehler to resolve not defined in config: '.implode(', ', $notFoundFehlerCodes));
foreach ($openIssues as $issue)
{
$params = [];
foreach ($this->_defaultIssueParams as $index => $propertyName)
{
$params[$index] = $issue->{$propertyName};
}
// add person id and oe kurzbz automatically as params, merge it with additional params
// decode bewerbung_parameter into assoc array
$params = array_merge(
array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
$params,
isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
);
@@ -54,69 +188,72 @@ class PlausicheckResolverLib
// ignore if Fehlercode is not in libmappings (shouldn't be checked)
if (isset($this->_codeLibMappings[$issue->fehlercode]))
{
$libName = $this->_codeLibMappings[$issue->fehlercode];
$codeLibMapping = $this->_codeLibMappings[$issue->fehlercode];
$libName = $codeLibMapping[self::RESOLVER_LIB_NAME] ?? null;
$extensionName = $codeLibMapping[self::EXTENSION_NAME] ?? null;
$producerIsResolver = $codeLibMapping[self::PRODUCER_IS_RESOLVER_NAME] ?? false;
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
// path for loading issue library
$issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
// file path of library for check if file exists
$issuesLibFilePath = DOC_ROOT . self::CI_PATH
. '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath))
if ($producerIsResolver)
{
// log error and continue with next issue if not
$result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist";
continue;
}
// execute same check as used for issue production
$issueResolvedRes = $this->_ci->PlausicheckResolverProducerLib->producePlausicheckIssue(
$issue->fehler_kurzbz,
$params
);
// load library connected to fehlercode
$this->_ci->load->library($issuesLibPath . $libName);
$lowercaseLibName = mb_strtolower($libName);
// check if method is defined in library class
if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
{
// log error and continue with next issue if not
$result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName";
continue;
}
// call the function for checking for issue resolution
$issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
if (isError($issueResolvedRes))
{
$result->errors[] = getError($issueResolvedRes);
if (isError($issueResolvedRes))
{
$result->errors[] = getError($issueResolvedRes);
}
else
{
$issueResolved = !hasData($issueResolvedRes);
}
}
else
{
$issueResolved = getData($issueResolvedRes) === true;
}
}
elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode])) // check if it is an issue without explicit resolver, "self-resolving"
{
$libName = $this->_codeProducerLibMappings[$issue->fehlercode];
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($extensionName) ? self::EXTENSIONS_FOLDER . '/' . $extensionName . '/' : '';
// execute same check as used for issue production
$issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue(
$libName,
$issue->fehler_kurzbz,
$params
);
// path for loading issue library
$issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
if (isError($issueResolvedRes))
{
$result->errors[] = getError($issueResolvedRes);
}
else
{
$issueResolved = !hasData($issueResolvedRes);
// file path of library for check if file exists
$issuesLibFilePath = DOC_ROOT . self::CI_PATH
. '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath))
{
// log error and continue with next issue if not
$result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist";
continue;
}
// load library connected to fehlercode
$this->_ci->load->library($issuesLibPath . $libName);
$lowercaseLibName = mb_strtolower($libName);
// check if method is defined in library class
if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
{
// log error and continue with next issue if not
$result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName";
continue;
}
// call the function for checking for issue resolution
$issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
if (isError($issueResolvedRes))
{
$result->errors[] = getError($issueResolvedRes);
}
else
{
$issueResolved = getData($issueResolvedRes) === true;
}
}
}
@@ -23,7 +23,11 @@ class AbbrecherAktiv extends PlausiChecker
AND benutzer.aktiv=true";
protected $_config_params = ['exkludierteStudiengaenge' => " AND stg.studiengang_kz NOT IN ?"];
protected $_params_for_checking = ['studiengang_kz' => " AND stg.studiengang_kz = ?", 'prestudent_id' => " AND pre.prestudent_id = ?"];
protected $_params_for_checking = [
'studiengang_kz' => " AND stg.studiengang_kz = ?",
'prestudent_id' => " AND pre.prestudent_id = ?",
'person_id' => " AND pre.person_id = ?"
];
protected $_fehlertext_params = ['prestudent_id'];
protected $_resolution_params = ['prestudent_id'];
}
@@ -19,12 +19,14 @@ class AbschlussstatusFehlt extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAbschlussstatusFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -55,6 +57,7 @@ class AbschlussstatusFehlt extends PlausiChecker
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -62,6 +65,7 @@ class AbschlussstatusFehlt extends PlausiChecker
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
@@ -132,6 +136,12 @@ class AbschlussstatusFehlt extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,9 +19,10 @@ class AktSemesterNull extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -56,11 +57,17 @@ class AktSemesterNull extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
public function getAktSemesterNull(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
$qry = "
@@ -89,6 +96,12 @@ class AktSemesterNull extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -18,9 +18,10 @@ class AktiverStudentOhneStatus extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -48,10 +49,11 @@ class AktiverStudentOhneStatus extends PlausiChecker
* Students with active Benutzer should have a status in the current semester.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
@@ -88,6 +90,12 @@ class AktiverStudentOhneStatus extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAktiverStudentstatusOhneKontobuchung(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -61,6 +63,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -68,6 +71,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
@@ -109,6 +113,13 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pers.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAusbildungssemPrestudentUngleichAusbildungssemStatus(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -64,6 +66,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -71,6 +74,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz);
@@ -105,6 +109,12 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getBewerberNichtZumRtAngetreten(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -58,6 +60,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -65,6 +68,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
@@ -112,6 +116,12 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getDatumAbschlusspruefungFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -58,6 +60,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -65,6 +68,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$abschlusspruefung_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
@@ -112,6 +116,12 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker
$params[] = $abschlusspruefung_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class DatumSponsionFehlt extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getDatumSponsionFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -58,6 +60,7 @@ class DatumSponsionFehlt extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -65,6 +68,7 @@ class DatumSponsionFehlt extends PlausiChecker
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$abschlusspruefung_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
@@ -112,6 +116,12 @@ class DatumSponsionFehlt extends PlausiChecker
$params[] = $abschlusspruefung_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -18,9 +18,10 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -50,11 +51,16 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker
* Status Dates and status studysemester dates should be in correct order.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge
* @return success with prestudents or error
*/
public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
public function getDatumStudiensemesterFalscheReihenfolge(
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
// all active students with Status student in current semester
@@ -97,6 +103,12 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class DualesStudiumOhneMarkierung extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getDualesStudiumOhneMarkierung(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -61,6 +63,7 @@ class DualesStudiumOhneMarkierung extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -68,6 +71,7 @@ class DualesStudiumOhneMarkierung extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
@@ -132,6 +136,12 @@ class DualesStudiumOhneMarkierung extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND tbl_person.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getFalscheAnzahlAbschlusspruefungen(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -55,6 +57,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
@@ -62,6 +65,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
@@ -111,6 +115,12 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,13 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$personRes = $this->getFalscheAnzahlHeimatadressen(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -19,12 +19,13 @@ class FalscheAnzahlZustelladressen extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$personRes = $this->getFalscheAnzahlZustelladressen(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -0,0 +1,131 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscherIncomingZweckPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getFalscherIncomingZweck(
$studiensemester_kurzbz,
$studiengang_kz,
$bisio_id,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
//'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id),
'resolution_params' => array('bisio_id' => $prestudent->bisio_id)
);
}
}
// return the results
return success($results);
}
/**
* Incomings should have the correct Zweck.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param bisio_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getFalscherIncomingZweck(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$bisio_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$studiensemester_clause = '';
if (isset($studiensemester_kurzbz))
{
$studiensemester_clause = "AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
$qry = "
SELECT * FROM (
SELECT
DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, zw.zweck_code, stg.studiengang_kz,
bisio.bisio_id, COUNT(zw.zweck_code) OVER (PARTITION BY bisio_id) AS anzahl
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING (prestudent_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid
JOIN bis.tbl_bisio_zweck zw USING (bisio_id)
WHERE
stg.melderelevant
AND pre.bismelden
AND status.status_kurzbz = 'Incoming'
AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start
{$studiensemester_clause}
) zwecke
WHERE anzahl = 1 AND zweck_code NOT IN ('1', '2', '3')";
if (isset($studiengang_kz))
{
$qry .= " AND zwecke.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($bisio_id))
{
$qry .= " AND zwecke.bisio_id = ?";
$params[] = $bisio_id;
}
if (isset($person_id))
{
$qry .= " AND zwecke.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND zwecke.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -19,9 +19,10 @@ class GbDatumWeitZurueck extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz);
$personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, $person_id, $exkludierte_studiengang_kz);
if (isError($personRes)) return $personRes;
@@ -0,0 +1,108 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class GeburtsnationFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$personRes = $this->_getGeburtsnationFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$persons = getData($personRes);
// populate results with data necessary for writing issues
foreach ($persons as $person)
{
$results[] = array(
'person_id' => $person->person_id,
'fehlertext_params' => array(),
'resolution_params' => array()
);
}
}
// return the results
return success($results);
}
/**
* Geburtsnation is missing.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getGeburtsnationFehlt(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT person_id
FROM
public.tbl_prestudent pre
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
(geburtsnation IS NULL OR geburtsnation = '')
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -19,12 +19,14 @@ class InaktiverStudentAktiverStatus extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getInaktiverStudentAktiverStatus(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -58,21 +60,26 @@ class InaktiverStudentAktiverStatus extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getInaktiverStudentAktiverStatus(
$studiensemester_kurzbz,
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
$aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt();
if (!isset($studiensemester_kurzbz))
{
$this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
$aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt();
if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes;
if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes;
$studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : '';
$studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : '';
}
$params = array($studiensemester_kurzbz);
@@ -103,6 +110,12 @@ class InaktiverStudentAktiverStatus extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,13 @@ class IncomingHeimatNationOesterreich extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$personRes = $this->getIncomingHeimatNationOesterreich(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -18,9 +18,10 @@ class IncomingOhneIoDatensatz extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -48,10 +49,11 @@ class IncomingOhneIoDatensatz extends PlausiChecker
* Incoming should have IN/OUT data.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
@@ -85,6 +87,12 @@ class IncomingOhneIoDatensatz extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND tbl_person.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getIncomingOrGsFoerderrelevant(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -55,6 +57,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return object success or error
*/
@@ -62,6 +65,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
@@ -114,6 +118,12 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pers.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getInskriptionVorLetzerBismeldung(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -59,7 +61,7 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker
/**
* Students of a semester shouldn't start studies before the date of Bismeldung.
* e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020
* e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2022
* e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
@@ -71,11 +73,14 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
// get Bismeldedatum
$datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz);
if (!$datumBis) return success([]);
$params = array($datumBis, $studiensemester_kurzbz, $datumBis);
// get active students
@@ -117,6 +122,12 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -132,17 +143,16 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker
*/
private function _getBisdateFromSemester($studiensemester_kurzbz)
{
$semesterYear = substr($studiensemester_kurzbz, 2, 6);
$semesterType = substr($studiensemester_kurzbz, 0, 2);
$bisdate = null;
if ($semesterType == 'SS')
{
return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d');
}
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$prevSemester = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
if (!hasData($prevSemester)) return null;
$prevSemester = getData($prevSemester)[0]->studiensemester_kurzbz;
if ($semesterType == 'WS')
{
return date_format(date_create($semesterYear."-04-15"), 'Y-m-d');
}
$this->_ci->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel');
$bisDate = $this->_ci->BismeldestichtagModel->getLastReachedMeldestichtag($prevSemester);
if (!hasData($bisDate)) return null;
return getData($bisDate)[0]->meldestichtag;
}
}
@@ -0,0 +1,125 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class KeinAufenthaltszweckPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getKeinAufenthaltszweck(
$studiensemester_kurzbz,
$studiengang_kz,
$bisio_id,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
//'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id),
'resolution_params' => array('bisio_id' => $prestudent->bisio_id)
);
}
}
// return the results
return success($results);
}
/**
* Students with mobility should have Aufenthaltszweck.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param bisio_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getKeinAufenthaltszweck(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$bisio_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
zw.zweck_code, stg.studiengang_kz, bisio.bisio_id
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING (prestudent_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid
LEFT JOIN bis.tbl_bisio_zweck zw USING (bisio_id)
WHERE
(zw.zweck_code IS NULL OR zw.zweck_code = '')
AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($bisio_id))
{
$qry .= " AND bisio.bisio_id = ?";
$params[] = $bisio_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $bisio_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -18,11 +18,12 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$personRes = $this->getNationNichtOesterreichAberGemeinde(
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -19,12 +19,14 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getOrgformStgUngleichOrgformPrestudent(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -70,6 +72,7 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
@@ -116,6 +119,12 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -0,0 +1,129 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OutgoingAngerechneteEctsFehlenPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getAngerechneteEctsFehlen(
$studiensemester_kurzbz,
$studiengang_kz,
$bisio_id,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
//'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id),
'resolution_params' => array('bisio_id' => $prestudent->bisio_id)
);
}
}
// return the results
return success($results);
}
/**
* Outgoing should have angerechnete ECTS.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param bisio_id int if check is to be executed only for one prestudent
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getAngerechneteEctsFehlen(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$bisio_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
stg.studiengang_kz, bisio.bisio_id
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING (prestudent_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid
WHERE
bisio.bis IS NOT NULL
AND bisio.bis::date <= NOW()
AND bisio.bis::date - bisio.von::date >= 29
AND bisio.ects_angerechnet IS NULL
AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id)
AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($bisio_id))
{
$qry .= " AND bisio.bisio_id = ?";
$params[] = $bisio_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,128 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OutgoingAufenthaltfoerderungfehltPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getAufenthaltsfoerderungFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
$bisio_id,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
//'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id),
'resolution_params' => array('bisio_id' => $prestudent->bisio_id)
);
}
}
// return the results
return success($results);
}
/**
* Student with mobility should have Aufenthaltsfoerderung.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param bisio_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getAufenthaltsfoerderungFehlt(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$bisio_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
stg.studiengang_kz, bisio.bisio_id
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING (prestudent_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid
LEFT JOIN bis.tbl_bisio_aufenthaltfoerderung foerd USING (bisio_id)
WHERE
bisio.bis IS NOT NULL
AND bisio.bis::date - bisio.von::date >= 29
AND foerd.aufenthaltfoerderung_code IS NULL
AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id)
AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($bisio_id))
{
$qry .= " AND bisio.bisio_id = ?";
$params[] = $bisio_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,128 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OutgoingErworbeneEctsFehlenPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getAngerechneteEctsFehlen(
$studiensemester_kurzbz,
$studiengang_kz,
$bisio_id,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
//'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id),
'resolution_params' => array('bisio_id' => $prestudent->bisio_id)
);
}
}
// return the results
return success($results);
}
/**
* Outgoing should have erworbene ECTS.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param bisio_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getAngerechneteEctsFehlen(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$bisio_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
stg.studiengang_kz, bisio.bisio_id
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING (prestudent_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid
WHERE
bisio.bis IS NOT NULL
AND bisio.bis::date <= NOW()
AND bisio.bis::date - bisio.von::date >= 29
AND bisio.ects_erworben IS NULL
AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id)
AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($bisio_id))
{
$qry .= " AND bisio.bisio_id = ?";
$params[] = $bisio_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -5,12 +5,12 @@
*/
abstract class PlausiChecker
{
const ISSUE_ID_NAME = 'issue_id';
protected $_ci; // code igniter instance
protected $_config; // all applicable configuration parameters for this plausicheck
protected $_db; // database for queries
protected $_isForResolutionCheck; // if true, additional parameters only needed for resolution are checked
protected $_config_params = []; // name of all config params which should be applied for this plausicheck, with sql [name] => [sql]
protected $_params_for_checking = []; // name of all passed params for checking, with sql [name] => [sql]
@@ -24,8 +24,6 @@ abstract class PlausiChecker
// set configuration
$this->_config = $params['configurationParams'] ?? [];
$this->_isForResolutionCheck = $params['isForResolutionCheck'] ?? false;
// get database for queries
$this->_db = new DB_Model();
}
@@ -41,15 +39,20 @@ abstract class PlausiChecker
$params = [];
$qry = $this->_base_sql;
if ($this->_isForResolutionCheck == true)
// if issue id is set, issue is resolving - check if behebung parameter are present
if (isset($paramsForChecking[self::ISSUE_ID_NAME]))
{
foreach ($this->_resolution_params as $resParam)
{
if (!isset($paramsForChecking[$resParam]))
return error("$resParam missing".(isset($paramsForChecking['issue_id']) ? ", issue ID: ".$paramsForChecking['issue_id'] : ""));
return error("$resParam missing"
.(isset($paramsForChecking[self::ISSUE_ID_NAME]) ? ", issue ID: ".$paramsForChecking[self::ISSUE_ID_NAME] : ""));
}
}
// get fehlertext and resolution params
// add config params to query
if (isset($this->_config_params) && !isEmptyArray($this->_config_params))
{
@@ -19,12 +19,14 @@ class PrestudentMischformOhneOrgform extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getPrestudentMischformOhneOrgform(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -68,6 +70,7 @@ class PrestudentMischformOhneOrgform extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
@@ -98,6 +101,12 @@ class PrestudentMischformOhneOrgform extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND tbl_person.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -18,9 +18,10 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -51,7 +52,7 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
@@ -79,6 +80,12 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pers.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -18,9 +18,10 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -56,6 +57,7 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker
$studiengang_kz = null,
$prestudent_id = null,
$studienordnung_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
@@ -93,6 +95,12 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker
$params[] = $studienordnung_id;
}
if (isset($person_id))
{
$qry .= " AND tbl_person.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -18,9 +18,10 @@ class StudentstatusNachAbbrecher extends PlausiChecker
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz);
$prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
@@ -51,7 +52,7 @@ class StudentstatusNachAbbrecher extends PlausiChecker
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
@@ -79,6 +80,12 @@ class StudentstatusNachAbbrecher extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND prestudent.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -19,12 +19,14 @@ class StudienplanUngueltig extends PlausiChecker
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getStudienplanUngueltig(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$person_id,
$exkludierte_studiengang_kz
);
@@ -69,6 +71,7 @@ class StudienplanUngueltig extends PlausiChecker
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
@@ -115,6 +118,12 @@ class StudienplanUngueltig extends PlausiChecker
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND tbl_person.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
@@ -0,0 +1,112 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class UhstatPersonkennungFehltCore extends PlausiChecker
{
const PERSONKENNUNG_KENNZEICHEN_TYPEN = ['vbpkAs', 'vbpkBf'];
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getUhstatPersonkennungFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id
//'fehlertext_params' => array('person_id' => $prestudent->person_id),
//'resolution_params' => array('person_id' => $prestudent->person_id)
);
}
}
// return the results
return success($results);
}
/**
* Student should have Personenkennung for UHSTAT reporting.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getUhstatPersonkennungFehlt(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (person_id) prestudent_id, person_id
FROM
public.tbl_prestudent pre
JOIN public.tbl_person pers USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
stg.melderelevant
AND pre.bismelden
AND EXISTS (SELECT 1 FROM bis.tbl_uhstat1daten WHERE person_id = pers.person_id)
AND (SELECT COUNT (DISTINCT kennzeichentyp_kurzbz) FROM public.tbl_kennzeichen WHERE person_id = pers.person_id AND kennzeichentyp_kurzbz IN ('vbpkAs', 'vbpkBf')) < 2
AND pers.ersatzkennzeichen IS NULL";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($person_id))
{
$qry .= " AND pers.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,135 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZgvDatumInZukunft extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
$person_id = isset($params['person_id']) ? $params['person_id'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_getZgvDatumInZukunft(
$studiensemester_kurzbz,
$studiengang_kz,
$prestudent_id,
$person_id,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
//'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id)
);
}
}
// return the results
return success($results);
}
/**
* ZGV date should be in the past.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
private function _getZgvDatumInZukunft(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
pre.zgvdatum::date > NOW()
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
//~ $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
//~ if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
//~ if (hasData($prevStudiensemesterRes))
//~ {
//~ // if Studiensemester given, check only if has status in current or previous semester
//~ $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
//~ $qry .= " AND EXISTS (
//~ SELECT 1
//~ FROM public.tbl_prestudentstatus ps
//~ WHERE studiensemester_kurzbz IN (?, ?)
//~ AND ps.prestudent_id = pre.prestudent_id
//~ )";
//~ $params[] = $prevStudiensemester;
//~ $params[] = $studiensemester_kurzbz;
//~ }
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND pre.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($person_id))
{
$qry .= " AND pre.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}

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