Compare commits

...

398 Commits

Author SHA1 Message Date
Johann Hoffmann 3e8e977eef export default statement in BaseApi.js 2026-01-26 10:20:11 +01:00
Johann Hoffmann 94eb7021bb created FhcBase.js plugin which coordinates time orderly setup between Alerts, Phrasen & Api Plugins. These have slightly rewritten Adaption as BaseAlerts.js, BasePhrase.js & BaseApi.js which have internal ready states activated once their required dependencies have been injected. Added await/async to several handlers to guarantee initialized cross dependencies in all plugins; While testing new Plugin Setup found a few legacy Instances of $fhcApi in Cis4 Studium.js that were only still working because plugins/Phrasen is still importing the legacyApi. Fixed that code and the corresponding errors in Studium.php that where now alerted into ui! wow! Also added FhcBase Plugin to all apps inside fhc-core/public/js/apps; 2026-01-23 13:48:04 +01:00
Andreas Österreicher ef8314c33a Config to check Extension LVEvaluierung is enabled 2026-01-21 15:32:52 +01:00
Andreas Österreicher e4ebdd59b6 Merge branch 'epic-56039/LV-Evaluierung' 2026-01-21 14:51:24 +01:00
Andreas Österreicher d1cc7244f7 Merge branch 'feature-70999/bewerbungstool_datenschutz_checkbox' 2026-01-21 10:56:54 +01:00
ma0048 2f5b90b9d5 dsgvo confirm und proctoring confirm beim RT Login 2026-01-21 09:04:11 +01:00
Cristina 9b90e0edde Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-20 10:53:36 +01:00
Cristina 56e9b253d2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-20 10:52:23 +01:00
Cristina c5c7123358 Added lvevaluierung phrase 2026-01-20 10:51:49 +01:00
Cristina 50e93fc9ba Fixed wrong configs (restored CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN + removed double CIS_EVALUIERUNG_ANZEIGEN_STG) 2026-01-19 13:33:12 +01:00
Andreas Österreicher 47ea1e848c Merge branch 'feature-69528/reihungstestueberwachung_constructor' 2026-01-19 10:17:38 +01:00
ma0048 e0f99a8e88 gewichtung und regeln in die config verschoben 2026-01-19 08:28:25 +01:00
Harald Bamberger 63aebde7f2 Merge branch 'bug-70906/FHC4_Archive_Dokument_Studienbestaetigung' 2026-01-15 18:01:25 +01:00
ma0068 62f5b66324 add missing parameters studiensemester and studiengang_kz for document Studienbestaetigung and StudienbestaetigungEnglish 2026-01-15 17:24:38 +01:00
Harald Bamberger ef08e39449 api endpoint student: prevent storing an empty string as alias e.g. from StudVw Details Tab 2026-01-15 17:09:30 +01:00
Harald Bamberger c720c46125 education/Projektarbeit_model: fix missing from-clause entry for table tbl_projektarbeit error - ticket#6059687 2026-01-15 16:28:38 +01:00
Harald Bamberger 597d4dbfec Abschusspruefung Modal add model-type to datepicker to prevent sending full utc timestamp to backend 2026-01-15 11:37:51 +01:00
ma0048 d67cad925d externe ueberwachung deaktivieren ueber config
params in die config verlagert
2026-01-14 13:59:42 +01:00
Harald Bamberger 2d9e9df8a0 fix notiz component showing no data when setting sort an switching tabs in stv 2026-01-13 14:10:33 +01:00
Cristina 6d6659f6e5 Merge remote-tracking branch 'origin/epic-56039/LV-Evaluierung' into epic-56039/LV-Evaluierung 2026-01-13 13:39:21 +01:00
Cristina 6512ad0f1c Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-13 13:38:04 +01:00
Cristina f034a99928 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-13 13:37:43 +01:00
ma0048 40ae57fb0c proctoring check ueberarbeitet 2026-01-08 12:01:20 +01:00
Harald Bamberger c113c80862 fix calculation of next student matrikelnr aka personenkennzeichen and student uid 2025-12-22 21:11:05 +01:00
Andreas Österreicher 063cbcbf4f Merge branch 'feature-62775/reihungstesttool_firefox_check_entfernen' 2025-12-19 09:50:15 +01:00
Andreas Österreicher 7e6805ca98 Merge branch 'master' into epic-56039/LV-Evaluierung 2025-12-18 13:18:16 +01:00
Cristina 871534af52 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-12-18 13:07:27 +01:00
Harald Bamberger 0616236e00 bugfix: ZGV Übernahme bei Interessentenanlage, bestehende ZGVs die null sind ausfiltern 2025-12-18 12:48:08 +01:00
Cristina 4dd4d8aaa5 Removed filtering aktiv studienganege from method to get Studiengaenge by Stgs
otherwise when switching to former semester (which will have inactive studiengaenge) it will not appear
2025-12-17 14:35:24 +01:00
Cristina f9ac824cc0 Added LV-Evaluierung NEU link button to CIS LV Menu 2025-12-17 14:33:04 +01:00
Harald Bamberger 79ad8601da Merge branch 'feature-68763/CIS4_Profilupdate_Additional_Changes' 2025-12-17 13:35:59 +01:00
Harald Bamberger 6b0526fb95 add tabulator persistence config 2025-12-17 13:22:39 +01:00
Harald Bamberger 39d708aa61 Merge branch 'master' into feature-68763/CIS4_Profilupdate_Additional_Changes 2025-12-17 12:56:07 +01:00
Harald Bamberger becbe5823c Merge branch 'feature-69286/StudStatusWiedereinstiegsmail_an_Studierende' 2025-12-16 16:16:29 +01:00
Harald Bamberger ddfcef9ad7 log Error if mail can not be sent, only change status if both reminder emails were successfully sent 2025-12-16 15:52:44 +01:00
Harald Bamberger 4f5e49a93c send to all private email addresses marked as zustellung 2025-12-16 15:27:31 +01:00
Harald Bamberger a3b5718422 Merge branch 'master' into feature-69286/StudStatusWiedereinstiegsmail_an_Studierende 2025-12-16 07:43:45 +01:00
Cristina db048e876c Renamed getEntitledStgs to getByStgs
Permissions check happens in application controller.
2025-12-15 16:48:07 +01:00
Harald Bamberger a4be020156 Merge branch 'feature-68768/Studierendenstatus_Neue_Abmeldungsgruende' 2025-12-15 16:36:16 +01:00
Harald Bamberger 2149ed2384 Merge branch 'master' into feature-68768/Studierendenstatus_Neue_Abmeldungsgruende 2025-12-15 16:27:57 +01:00
Cristina e6ef234c8b Added method getOrgformsByStg to Studiengang_model.php
Get OrgForms of given Studiengang and Studiensemester
2025-12-15 16:27:47 +01:00
Harald Bamberger 29c8e6fb19 Merge branch 'master' into feature-69286/StudStatusWiedereinstiegsmail_an_Studierende 2025-12-15 16:27:25 +01:00
Harald Bamberger cf7e9921b5 change grades sort order 2025-12-15 16:11:46 +01:00
Harald Bamberger 887d9f9cbd Merge branch 'feature-69877/StudVw_Status_GrundAndAnmerkungEditable' 2025-12-15 15:31:52 +01:00
Harald Bamberger 7de3c4a24e remove unnecessary line 2025-12-15 15:22:32 +01:00
Harald Bamberger 11ff26d8e7 remove empty lines 2025-12-15 15:20:19 +01:00
Harald Bamberger 718272e8a1 remove empty line 2025-12-15 15:13:53 +01:00
Harald Bamberger 3f891179aa move check for critical changes bis from frontend to backend 2025-12-15 15:12:49 +01:00
Andreas Österreicher 56ef700ec8 Merge branch 'feature-69439/negative_stunden_im_neuen_kartereiter' 2025-12-15 14:27:27 +01:00
Harald Bamberger afc3cd0131 Merge branch 'master' into feature-69877/StudVw_Status_GrundAndAnmerkungEditable 2025-12-15 13:53:28 +01:00
Harald Bamberger 5536408065 add property stg_kz to json of org_forms to prevent clearing tabulator when changing form a node with stg_kz property set to an orgform_node 2025-12-15 13:35:50 +01:00
ma0048 5a77478071 insertvon entfernt 2025-12-15 12:27:17 +01:00
Harald Bamberger 293a8625e4 change sort order in grades list api endpoint 2025-12-15 12:03:41 +01:00
Harald Bamberger 5266a6fe4d Merge branch 'master' into feature-69877/StudVw_Status_GrundAndAnmerkungEditable 2025-12-12 16:28:35 +01:00
Harald Bamberger 3485ee624c Merge branch 'studvw_2025-12_rc3' 2025-12-12 15:22:24 +01:00
Harald Bamberger 61c859f2e1 Merge branch 'bugfix-69874/Dokument_Ausbildungsvertrag_ohneParamUid' into studvw_2025-12_rc3 2025-12-12 15:06:49 +01:00
Harald Bamberger b967f83dd4 skip adding uid to params for templates Ausbildungsver and AusbVerEng instead of deleting it afterwards 2025-12-12 15:05:37 +01:00
Harald Bamberger ad184f5c16 change projektbetreuer tabulator layout, use correct phrases for columns person_id and punkte 2025-12-12 14:37:44 +01:00
ma0068 34d6b2d97a use only prestundent_id in Archive-functionality 2025-12-12 14:36:02 +01:00
ma0068 431ae8ddac - make button edit editable
- set field anmerkung editable (like statusgrund and statusgrund)
- refactor function updateStatus to skip validation
- change phrases
2025-12-12 13:04:58 +01:00
Harald Bamberger 0072d87f3b Merge branch 'bug-69804/FHC4_StudVw_Mobility_showAddedZweckAndGrund' into studvw_2025-12_rc3 2025-12-11 16:41:43 +01:00
ma0068 d91789aee5 Aufruf Ausbildungsvertrag mit Param prestudent-id 2025-12-11 16:20:09 +01:00
Cristina 8280ec42b0 Added method getEntitledStgs to Studiengang_model.php
Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. Helpful to easily get Studiengänge the user is entitled for.
2025-12-11 16:07:07 +01:00
Harald Bamberger d8766e8f7a Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' into studvw_2025-12_rc3 2025-12-11 16:06:28 +01:00
Alexei Karpenko 91f141326a Studierendenverwaltung Projektarbeiten PRojektbetreuer: replaced "formdata modified" check with edit mode check 2025-12-11 15:38:53 +01:00
ma0068 a6907d1bc5 - bugfix delete Purpose
- reload local data after pushing new entries in Purpose and Support
2025-12-11 14:20:22 +01:00
Harald Bamberger 95027937bd remove debug code 2025-12-11 12:52:05 +01:00
Harald Bamberger a86d35f731 Merge branch 'master' into feature-69065/Projektarbeiten_Firmen_verwalten 2025-12-11 12:12:05 +01:00
Alexei Karpenko 1c511f9c66 Projektarbeit controller: added comments 2025-12-11 11:42:31 +01:00
ma0048 df639c8b07 sprache mitschicken 2025-12-11 08:28:01 +01:00
Alexei Karpenko 80f80ab8e8 added comments to Projektbetreuer 2025-12-10 19:43:15 +01:00
Alexei Karpenko 32b73b7287 Studierendenverwaltung Projektarbeiten: delete checks bugfixes, layout guidelines 2025-12-10 18:03:04 +01:00
Alexei Karpenko 98bcbda53e added check for Projektarbeitsbeurteilung when deleting Projektarbeit 2025-12-10 16:09:44 +01:00
Harald Bamberger ba1f3da02f Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 15:35:58 +01:00
Harald Bamberger 994d523258 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' 2025-12-10 15:29:07 +01:00
Harald Bamberger 213f20eab3 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' into studvw_2025-12_rc3 2025-12-10 15:20:27 +01:00
Harald Bamberger 2bb58e24cc fix timing to prevent zgv autocomplete fields from being empty when switching from and to prestudent tab 2025-12-10 15:18:16 +01:00
ma0048 53cf777970 check im menu entfernt 2025-12-10 15:18:15 +01:00
ma0048 48512f46ab exam name geandert 2025-12-10 15:15:23 +01:00
Harald Bamberger da78332a92 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' into studvw_2025-12_rc3 2025-12-10 14:50:56 +01:00
Harald Bamberger 83a76d06b6 Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 14:16:46 +01:00
Harald Bamberger cfd24dd8bc Merge branch 'feature-69452/studvw_status_aktion_vorruecken_ausblenden_via_config' 2025-12-10 14:07:45 +01:00
Harald Bamberger ea5d2bc6f8 Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 13:50:20 +01:00
Harald Bamberger 8468d881f1 Merge branch 'feature-69517/FHC4_Abschlusspruefung_Pruefungsprotokolltext' 2025-12-10 13:40:59 +01:00
Harald Bamberger 5041999b4b Merge branch 'master' into feature-69517/FHC4_Abschlusspruefung_Pruefungsprotokolltext 2025-12-10 13:34:52 +01:00
ma0048 8bab5285e9 testversuch ueber config
abfrage gefixed
menu wird nicht mehr angezeigt
2025-12-10 08:08:46 +01:00
Cristina 76cdaefdc7 Merge branch 'master' into epic-56039/LV-Evaluierung 2025-12-09 17:06:06 +01:00
Harald Bamberger 033af68343 teleport datepicker out of modal 2025-12-09 17:01:30 +01:00
Cristina f725594f0c Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-12-09 17:00:24 +01:00
Harald Bamberger f460a909d9 Merge branch 'feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte' into studvw_2025-12_rc3 2025-12-09 16:37:16 +01:00
Harald Bamberger 054574f9fb Merge branch 'feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten' into studvw_2025-12_rc3 2025-12-09 16:35:45 +01:00
ma0048 597aa1aa4e status vorruecken ueber config steuerbar
statusgrund kann wieder entfernt werden
2025-12-09 12:36:08 +01:00
Harald Bamberger 7c57f5a308 Merge branch 'master' into feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte 2025-12-09 11:50:08 +01:00
Harald Bamberger 50439ee6cc Merge branch 'master' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-12-09 11:37:57 +01:00
Alexei Karpenko 016d4a1927 Studierendenverwaltung Projektbetreuer: added phrases, added check for existing Projektbetreuer when saving 2025-12-06 01:28:38 +01:00
Alexei Karpenko 112e30ab39 Studierendenverwaltung Projektarbeit: added concatenated Betreuer, sorted autocomplete suggestions, added Gesamtnote, freigegeben check removed when lock date set, added phrases 2025-12-05 22:01:35 +01:00
Harald Bamberger 7e0acdbf45 fix typo 2025-12-04 14:57:03 +01:00
Harald Bamberger 391a4753d5 fix flex-grow with tabulator exceeding width (found by ma0646) 2025-12-04 14:38:30 +01:00
ma0068 c6686f56f6 make ZGV fields and bisMelden field editable
- new Berechtigung student/editDokZgv
- Berechtigungen student/editBakkZGV, student/editMakkZGV, student/editBismelden
2025-12-04 10:35:43 +01:00
Harald Bamberger 1c2937dfb6 Merge branch 'feature-69570/StudVw_Filter_broken' 2025-12-04 08:47:55 +01:00
Harald Bamberger 841b4736a9 do not send filters to backend when search endpoint is used 2025-12-04 08:39:37 +01:00
Alexei Karpenko c79ff24c89 Studierendenverwaltung Projektarbeit: added Studiensemester dropdown for Lv-Teil 2025-12-03 19:29:42 +01:00
Alexei Karpenko 77a1067ea5 Studierendenverwaltung Projektbetreuer: default Stunden coming from global config, Stundensatz is requested each time BetreuerIn is selected 2025-12-03 15:32:21 +01:00
ma0068 d33af0ae21 bugfix: resetModal in openMode modal 2025-12-03 15:14:26 +01:00
ma0068 7726c3ce21 disable pruefungsnotizen 2025-12-03 10:23:58 +01:00
Harald Bamberger 5a970c3f2e fix typo 2025-12-03 09:58:33 +01:00
Harald Bamberger abcc1269eb add permission to show profile images in new studvw 2025-12-03 09:44:34 +01:00
Harald Bamberger c849b5defa fix broken filters 2025-12-02 18:08:03 +01:00
ma0068 d75939a8f8 refactor Messages
- endpoint: using apiMessages instead of prop
- add Phrases
- openMode Modal: resetModal if no messageId
- openMode inSamePage: loadReplyData
- function getNameOfDefaulRecipients: add missing check, if id[]
2025-12-02 16:08:13 +01:00
Andreas Österreicher 3ee81ae6e7 Merge branch 'feature-55978/infocenter_electronic_onboarding_filter' 2025-12-02 16:04:51 +01:00
Andreas Österreicher d1f684f0b3 Merge branch 'feature-69182/PHP8-Stringzugriff_mit_geschwungenen_Klammern' 2025-12-02 15:53:15 +01:00
ma0048 d8e57d43f9 session url in die config verschoben 2025-12-02 13:53:38 +01:00
ma0048 5c9710f44d externe ueberwachung v1 2025-12-02 13:49:05 +01:00
ma0048 257038a2d1 negative stunden markieren
headerfilter angepasst fuer minusstunden
2025-12-02 13:25:46 +01:00
Harald Bamberger 4dabc642ed Merge branch 'master' into feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte 2025-12-02 07:54:40 +01:00
Harald Bamberger afb3ce4cae modify using open mode newTab or window with multiple Recipients via post request 2025-12-02 07:54:13 +01:00
ma0068 be2b578f82 reset default openmode to modal 2025-12-01 14:43:21 +01:00
ma0068 17519eac83 refactor Messaging
- headerFilter for table Messages
- multiactions for sendMessages for openmodes modal and inSamePage
2025-12-01 13:27:42 +01:00
Harald Bamberger 89ec51bd0a Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' 2025-11-28 14:45:29 +01:00
Harald Bamberger 0372853df2 Aufnahmetermine: fix error persiting boolean, GS: sortorder studiensemester, Gruppen exclude generated groups from search result 2025-11-28 14:01:20 +01:00
Harald Bamberger dc603375ec Merge branch 'master' into feature-69065/Projektarbeiten_Firmen_verwalten 2025-11-28 11:15:59 +01:00
ma0068 aa84bdec1e ---staging---- 2025-11-27 14:46:55 +01:00
Alexei Karpenko eb1c3189b5 Studierendenverwaltung Projektarbeit: title not required anymore 2025-11-26 16:45:51 +01:00
Andreas Österreicher 6d27c3f6e2 PHPInfo entfernt 2025-11-26 08:27:14 +01:00
ma0068 93e25bb5fc added Reminder for Unterbrecher for Student 2025-11-25 17:35:44 +01:00
Harald Bamberger a413b6c779 fix bug when changing studiensemester on route search 2025-11-25 14:00:31 +01:00
Harald Bamberger f0e0bdc082 add optional query parameter studiensemester to notenspiegel and notenspiegel_erweitert to override semester_aktuell if multiple tabs in new studvw have different current semesters 2025-11-24 18:37:30 +01:00
Harald Bamberger 60661d3457 Merge branch 'studvw_2025-11_rc2' 2025-11-24 17:02:00 +01:00
Harald Bamberger 41bb99b5ea Merge branch 'master' into studvw_2025-11_rc2 2025-11-24 16:48:11 +01:00
Harald Bamberger 054b9fdee3 Merge branch 'feature-69388/Pruefung_API_insert_Propleme' 2025-11-24 16:42:49 +01:00
Harald Bamberger 61faf5386a Merge branch 'master' into studvw_2025-11_rc2 2025-11-24 16:39:47 +01:00
Harald Bamberger 6b4f5778c2 refactor stv Pruefung Tab and API endpoint to use same logic for insert and update, use luxon lib to initialize datepicker with iso date and send iso date format to api endpoint 2025-11-24 16:26:11 +01:00
Andreas Österreicher 060f11f1d8 Anmerkung und Spaltenanzahl bei Leistungsstipendien Import angepasst 2025-11-24 09:49:15 +01:00
Harald Bamberger cdc1933ce4 fix typo 2025-11-24 09:48:05 +01:00
Harald Bamberger 239a9c89d7 compare DateTime with DateTime instead of String 2025-11-24 09:46:53 +01:00
Harald Bamberger 4964a2c06d set tabulator layout to fitDataStretchFrozen when frozen columns are defined, change css classes to display disabled status use the same as in students list 2025-11-24 09:40:33 +01:00
Harald Bamberger ce5e3131c1 Merge branch 'master' into studvw_2025-11_rc2 2025-11-21 10:55:47 +01:00
Harald Bamberger 7eee6d51aa clear tabulator when returning to index or studiensemester route from search route 2025-11-21 10:55:01 +01:00
chfhtw 1666ba82b2 Bugfix: correct compare values in Pruefung->insertPruefung() 2025-11-21 10:42:13 +01:00
Harald Bamberger e54e83f718 Merge branch 'bug-68552/LV-Plan_mobile_Wochenansicht_links_rechts_scrollen' 2025-11-21 08:48:19 +01:00
chfhtw d916c6ab31 make Pruefung->insertPruefung() behave exactly like old FAS 2025-11-21 08:27:05 +01:00
Harald Bamberger be35fd5313 fix typo 2025-11-20 19:09:31 +01:00
Harald Bamberger dd92c815da fix back button behavior in studvw and lvverwaltung 2025-11-20 18:59:44 +01:00
ma0068 d76e84639f neue Phrasen bzw. Phrasenupdate zu Abmeldungsgruende Studierendenantrag 2025-11-20 16:18:55 +01:00
Harald Bamberger 6357aca656 show combine person tab only if permission basis/person, restore endpoint handling logic in List.js 2025-11-20 15:19:36 +01:00
Harald Bamberger d001e3c168 add option to deactivate livesearch, so the searchresult in studvw is shown in tabulator 2025-11-20 13:40:10 +01:00
Harald Bamberger d88f2a0a48 Merge branch 'feature-69176/Studierendenverwaltung_Berichte' into studvw_2025-11_rc2 2025-11-20 13:35:01 +01:00
Harald Bamberger 6378e75c37 Merge branch 'feature-68744/Studierendenverwaltung_Einstellungen' into studvw_2025-11_rc2 2025-11-20 13:33:56 +01:00
Harald Bamberger e22344e9dd Merge branch 'feature-68770/FHC4_Studierendenverwaltung_Funktion_Personen_Zusammenlegen' into studvw_2025-11_rc2 2025-11-20 13:28:37 +01:00
Harald Bamberger 0ed11a02a5 Merge branch 'master' into feature-69176/Studierendenverwaltung_Berichte 2025-11-20 13:27:30 +01:00
Harald Bamberger 23d1104602 Merge branch 'master' into feature-68770/FHC4_Studierendenverwaltung_Funktion_Personen_Zusammenlegen 2025-11-20 13:26:34 +01:00
Harald Bamberger bab15bc5b2 add fs_x-small and fs_xx-small and ajust css em settings 2025-11-19 13:01:47 +01:00
Harald Bamberger 1cc77c8eba Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-19 11:42:21 +01:00
Harald Bamberger 2f2c7d0d92 Merge branch 'feature-69379/Tooltip-Direktive' 2025-11-19 11:19:37 +01:00
Paolo e837101651 PHP8 compatibility: replaced the curly brackets {} with square brackets [] where used in combination with strings 2025-11-19 10:53:59 +01:00
Harald Bamberger e4a7955239 fix editor params stored empty in tabulator local storage causing empty grade dropdown when switching tabs 2025-11-18 16:42:31 +01:00
Cristina 92030ca697 Merge branch 'feature-69379/Tooltip-Direktive' into epic-56039/LV-Evaluierung 2025-11-18 11:02:57 +01:00
Cristina 53424999dc Created Vue Tooltip directive
This directive initializes and disposes Bootstrap tooltip
2025-11-18 10:58:57 +01:00
Cristina a59f90112d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-11-18 10:51:18 +01:00
Alexei Karpenko ad7012367c added Link to company management in project work management 2025-11-17 14:52:58 +01:00
chfhtw 03b3182000 adding Notenspiegel to AppMenu 2025-11-17 13:09:16 +01:00
Andreas Österreicher 126aa890c4 Merge branch 'feature-6976/Link_fuer_unverifizierte_email_anpassen' 2025-11-17 10:50:34 +01:00
Andreas Österreicher 4762154bbc Merge branch 'feature-67484/lvverwaltung_finetunning' 2025-11-17 09:06:10 +01:00
Harald Bamberger c9506adc10 do not use cisroot for link to placement test administration 2025-11-14 11:19:54 +01:00
Harald Bamberger f281925874 do not use cisroot for link to final exam protocol 2025-11-14 11:13:23 +01:00
Harald Bamberger 1c319addc5 do not use cisroot for document download 2025-11-14 11:03:48 +01:00
Harald Bamberger dbfa64a436 do not use cisroot for document download 2025-11-14 10:46:27 +01:00
Harald Bamberger 366d48b836 Merge branch 'feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen' 2025-11-14 09:45:21 +01:00
Harald Bamberger 0a53ca49aa readd accoutinfoblatt to single student dropdown 2025-11-14 09:39:46 +01:00
ma0048 284633012f Merge remote-tracking branch 'origin/master' into feature-67484/lvverwaltung_finetunning 2025-11-14 08:09:25 +01:00
ma0048 63eda8b934 addgroup/addperson immer anzeigen
gruppen sortierung angepasst
fehlende les anzeigen
2025-11-14 08:07:39 +01:00
chfhtw de012b290b get semester & orgform from Verband to StudVw Main Component 2025-11-13 16:27:15 +01:00
chfhtw dbf9547f9c add CSS class disabled to AppMenu 2025-11-13 16:23:57 +01:00
chfhtw 65df13ca9f add slot to AppMenu 2025-11-13 16:23:04 +01:00
Harald Bamberger 1d786d3e16 Merge branch 'master' into feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen 2025-11-13 16:09:31 +01:00
Harald Bamberger 339639cc6e add Link to Lehrauftraege to apps menu in stv 2025-11-13 15:48:20 +01:00
Cristina 993dff3351 Gendered phrase lektorInnen (FHTW style) 2025-11-13 11:11:37 +01:00
Cristina 0a118a1427 Clustered LV-Evaluierung phrases after merge 2025-11-13 10:50:36 +01:00
Cristina 4ab0c0a44e Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-11-13 10:44:39 +01:00
chfhtw e36e86fd50 Code Quality 2025-11-13 09:54:56 +01:00
Cristina d99d1c5ca0 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-11-13 09:49:37 +01:00
Cristina 43281c6ba2 Removed test buttons from FhcChart basic template 2025-11-13 09:48:54 +01:00
chfhtw cd574cd12c Reload settings setup on language change 2025-11-13 09:39:38 +01:00
chfhtw 95f1c66684 Stv Settings Phrases 2025-11-13 09:11:06 +01:00
chfhtw 5d957e38ae Phrase settings saved 2025-11-13 08:52:47 +01:00
chfhtw 7566e8aac2 Make AppConfig a general Component 2025-11-13 08:48:54 +01:00
chfhtw 7fdfa94d11 Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-12 08:15:56 +01:00
chfhtw 77604c5e15 StV: Font Size setting 2025-11-12 08:02:06 +01:00
Harald Bamberger 84b9b08d28 Merge branch 'studvw_2025-11_rc' 2025-11-11 16:40:30 +01:00
Harald Bamberger a9e90cf10d add absoluteJsImportUrl helper function - to generate absolute urls with fhcomplete_build_version for dynamic imports - and use it in stv config 2025-11-11 13:01:48 +01:00
Harald Bamberger b31ebf3412 Merge branch 'feature-67518/Studierendenverwaltung_Karteireiter_anzeigen_verstecken_wenn_Interessent_gewaehlt' into studvw_2025-11_rc 2025-11-10 13:20:36 +01:00
Harald Bamberger 00eac334c0 Merge branch 'feature-63443/Studierendenverwaltung_Tab_Abschlusspruefung_Finetuning' into studvw_2025-11_rc 2025-11-10 12:48:01 +01:00
chfhtw 775d865878 StV settings 2025-11-10 12:38:57 +01:00
Harald Bamberger d2b1eb4645 Merge branch 'feature-68738/FHC4_Studierendenverwaltung_Studentlist_Export' into studvw_2025-11_rc 2025-11-10 09:40:42 +01:00
Alexei Karpenko f15932964f Studierendenverwaltung email: descending order kontakt_id 2025-11-07 01:06:22 +01:00
Alexei Karpenko 5678c18619 keepemailunverified parameter: email is passed even if unverified 2025-11-07 00:51:07 +01:00
ma0068 74a00a4ce0 changes according to userStory #68983 2025-11-05 17:26:39 +01:00
Harald Bamberger 1c5d3d7c78 Merge branch 'master' into studvw_2025-11_rc 2025-11-05 17:15:39 +01:00
Harald Bamberger 1ac9c9b6cb Merge branch 'feature-68672/Studierendenverwaltung_Suche_nach_Personenkennzeichen_und_Matrikelnummer' 2025-11-05 17:10:40 +01:00
Harald Bamberger 303f29ebdb Merge branch 'bug-68772/Suche_mit_Sonderzeichen' 2025-11-05 17:07:17 +01:00
Harald Bamberger 383590fa6b Merge branch 'master' into feature-68672/Studierendenverwaltung_Suche_nach_Personenkennzeichen_und_Matrikelnummer 2025-11-05 16:55:26 +01:00
Harald Bamberger 0d449d60c2 Merge branch 'master' into studvw_2025-11_rc 2025-11-05 16:51:38 +01:00
chfhtw 5ecd81bb09 translate logout 2025-11-05 16:50:22 +01:00
chfhtw 1cdebbe977 remove unused changed eventlistener 2025-11-05 16:49:12 +01:00
chfhtw a97a176522 use phrasen in stv list 2025-11-05 16:47:31 +01:00
Harald Bamberger 327e849fc6 Merge branch 'bug-66932/studierendenverwaltung_status_tab_fehlermeldung_meldestichtage' 2025-11-05 16:46:19 +01:00
chfhtw ede2e1710e Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-05 16:45:21 +01:00
Harald Bamberger f54ad298fa Merge branch 'feature-69107/StringHelpersCapitalize' 2025-11-05 16:41:31 +01:00
Harald Bamberger 5e1fc3abf7 Merge branch 'master' into feature-69107/StringHelpersCapitalize 2025-11-05 16:39:06 +01:00
Harald Bamberger 819a7ef219 Merge branch 'master' into studvw_2025-11_rc 2025-11-05 16:33:40 +01:00
Harald Bamberger d815176bab Merge branch 'bug-66890/studierendenverwaltung_statuswechsel_doppelte_statuseintraege' 2025-11-05 16:29:41 +01:00
Harald Bamberger 4e01420ce0 Merge branch 'master' into bug-66890/studierendenverwaltung_statuswechsel_doppelte_statuseintraege 2025-11-05 16:22:58 +01:00
Harald Bamberger 683360b13a Merge branch 'master' into studvw_2025-11_rc 2025-11-05 16:17:39 +01:00
Harald Bamberger 9042caa06b Merge branch 'bug-66774/Messages_Vorlagen_Subject_Bezeichnung_statt_Vorlagekurzbz' 2025-11-05 16:12:17 +01:00
Harald Bamberger 9668c67197 Merge branch 'bug-66933/studierendenverwaltung_message_tab_fehlermeldung' 2025-11-05 16:05:48 +01:00
Harald Bamberger 84610faedc Merge branch 'master' into bug-66933/studierendenverwaltung_message_tab_fehlermeldung 2025-11-05 15:58:48 +01:00
Harald Bamberger 8c4a163671 Merge branch 'master' into bug-66774/Messages_Vorlagen_Subject_Bezeichnung_statt_Vorlagekurzbz 2025-11-05 15:53:36 +01:00
Johann Hoffmann 9e40c6b21f declaration, import & binding of capitalize function from StringHelpers.js; 2025-11-05 15:41:17 +01:00
Andreas Österreicher 67d41f1df9 Note Bestanden am Diploamsupplement priorisiert damit diese als
"bessere" Note als Nicht Genügend gewertet wird
2025-11-05 14:26:45 +01:00
chfhtw 6011109132 Fix language on details tabs 2025-11-05 11:44:25 +01:00
chfhtw cc3da1439d StV: add user menu 2025-11-05 11:06:45 +01:00
Harald Bamberger c97e1b6453 Merge branch 'feature-67490/studstatus_suche_abort_controller_haengt' 2025-11-05 11:06:32 +01:00
Harald Bamberger 72403e0960 Merge branch 'feature-68745/Menue_zur_Verlinkung_von_Apps' into studvw_2025-11_rc 2025-11-04 17:12:19 +01:00
Harald Bamberger e91b829c25 Merge branch 'feature-68390/Studierendenverwaltung-Details_Header_und_Tabsnav_nicht_mitscrollen' into studvw_2025-11_rc 2025-11-04 17:11:23 +01:00
Harald Bamberger c56fd038b8 Merge branch 'feature-63445/Studierendenverwaltung_Filter' into studvw_2025-11_rc 2025-11-04 17:10:24 +01:00
Harald Bamberger 24c014e8dd Merge branch 'feature-63444/stv_mehrfachaktion_mail_an_private_oder_interne_adresse' into studvw_2025-11_rc 2025-11-04 17:06:23 +01:00
Harald Bamberger 608dab1e65 Merge branch 'feature-63435/Studierendenverwaltung_Studierende_Verbandsgruppen_und_Spezialgruppen_zuordnen_Multiaktion' into studvw_2025-11_rc 2025-11-04 17:03:52 +01:00
Harald Bamberger fe1433a19c Merge branch 'feature-63374/Studierendenverwaltung_International_Baum_Filter' into studvw_2025-11_rc 2025-11-04 16:56:51 +01:00
Harald Bamberger 8c83e08472 Merge branch 'feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen' into studvw_2025-11_rc 2025-11-04 16:55:20 +01:00
chfhtw 0893ec30d9 Bugfix: use plainto_tsquery instead of to_tsquery to avoid errors on special chars 2025-11-04 15:26:18 +01:00
Harald Bamberger 0417afeea8 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into studvw_2025-11_rc 2025-11-04 14:56:54 +01:00
chfhtw 9601c8bdd2 add personenkennzeichen & matrikelnummer to stv search config 2025-11-04 11:40:08 +01:00
Harald Bamberger 146bb5f336 replace legacy lvplan link in room content with cis4 lvplan link 2025-11-03 15:34:54 +01:00
chfhtw 9e4401d441 better contrast for apps-menu-button 2025-11-03 13:14:14 +01:00
Andreas Österreicher aa43a2f32c Merge branch 'master' into feature-55978/infocenter_electronic_onboarding_filter 2025-11-03 12:57:41 +01:00
chfhtw d6c4e0db41 show submit btn in StV 2025-11-03 11:36:24 +01:00
chfhtw 398478e575 searchbar submit button 2025-11-03 11:36:10 +01:00
chfhtw 17540070a1 remove comments 2025-11-03 11:35:31 +01:00
chfhtw d923f30ccf Add search from url functionality 2025-11-03 11:05:26 +01:00
Andreas Österreicher 3c910d03bb Fixed Problem with Special Characters in Permission Description 2025-10-30 15:33:12 +01:00
chfhtw fc16a9e4c6 Stv: add search results to student list 2025-10-30 14:01:46 +01:00
chfhtw 9699684946 Stv: students search function 2025-10-30 14:00:41 +01:00
chfhtw 06b562786d searchbar: make abort function 2025-10-30 14:00:03 +01:00
chfhtw 539c78166f Stv list: allow post calls on tabulator 2025-10-30 13:59:12 +01:00
chfhtw 5a0134c6cc searchbar: prevent clear on enter 2025-10-30 13:58:18 +01:00
chfhtw a8535e6e0f replace old $fhcApi calls with new $api 2025-10-30 13:57:15 +01:00
Andreas Österreicher 5677142b0b Merge branch 'feature-68676/Ausbildungsvertrag_Lehrgaenge_2025' 2025-10-30 12:59:47 +01:00
Alexei Karpenko 565640c73b Ausbildungsvertrag: akad grad from Studienordnung is own field 2025-10-26 17:36:22 +01:00
Andreas Österreicher 3c9a52e389 Merge branch 'feature-68950/Anmelderegel' 2025-10-24 13:44:35 +02:00
Andreas Österreicher 3e52ea39d5 LVRegel Fixed Semester Check 2025-10-24 13:36:11 +02:00
Andreas Österreicher 2b53eb327f LVRegeln - Abschlussregel bei Anmeldung entfernt da diese dort zu Problemen führt 2025-10-24 13:10:41 +02:00
chfhtw 406b93a628 remove comment & renaming Studierenden Verwaltung to Studierendenverwaltung 2025-10-24 09:22:17 +02:00
ma0068 4be0a831a1 add Phrases 2025-10-23 13:49:05 +02:00
ma0068 9ed3251e55 open in iframe, only show tab if count in config is valid 2025-10-23 12:55:14 +02:00
chfhtw 94d5e8f780 use AppMenu in LvV 2025-10-23 12:48:11 +02:00
chfhtw 5baf8b645f use AppMenu in StV 2025-10-23 11:49:07 +02:00
chfhtw 11daf96850 add navigation entries for StV & LvV 2025-10-23 11:48:55 +02:00
chfhtw 752ef8a57b AppMenu Component 2025-10-23 11:48:03 +02:00
chfhtw 8ddc2f02fe SVG Icons 2025-10-23 11:47:33 +02:00
Alexei Karpenko 1623c8e51c Ausbildungsvertrag: akadgrad is coming from Studienordnung 2025-10-22 16:57:19 +02:00
ma0068 9a8fbabbe4 move dropdown profileUpdateStates to FilterComponent, delete not needed code 2025-10-22 14:25:43 +02:00
ma0068 6337869098 new Multitab CombinePeople, start Function 2025-10-22 10:23:24 +02:00
ma0068 1423579a49 refactor Profile Update for filter, backendfilter not active 2025-10-21 14:42:02 +02:00
Andreas Österreicher 87ec4fd482 Problem beim Drucken von Zeugnissen behoben wo die LV der
Studienverpflichtung Sonderzeichen enthält
2025-10-20 17:32:43 +02:00
ma0068 6e9969d9e4 use shorter table names for columns stg and orgform , add column ausbildungssemester 2025-10-20 16:08:12 +02:00
Andreas Österreicher 4407310f40 Merge branch 'master' into feature-67484/lvverwaltung_finetunning 2025-10-20 11:33:43 +02:00
Harald Bamberger 4495632393 join only prestudent for studiengang_kz of student 2025-10-17 14:45:03 +02:00
ma0068 9fa7166c84 added download to StudentList 2025-10-17 12:33:22 +02:00
chfhtw 1fbca8bdab Bugfix: Add overflow for horizontal scrolling 2025-10-17 10:14:47 +02:00
Harald Bamberger a9670fce5c Merge branch 'bug-68555/Dokumente_Studienbestaetigung_wird_nicht_angezeigt' 2025-10-16 15:38:37 +02:00
chfhtw e7788fc18f Bugfix: format betrag in StV Konto correctly 2025-10-16 08:38:59 +02:00
chfhtw 11205e9ec1 Bugfix: multiple types in CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN config were concatenated wrong in CIS 4.0 2025-10-16 08:38:17 +02:00
Cristina 343964750b Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-10-14 17:22:39 +02:00
Cristina 0201bac046 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-10-14 17:19:29 +02:00
Cristina 2aee86baba Changed phrase lvevaluierung/logoutText 2025-10-14 16:16:23 +02:00
Alexei Karpenko 07bcbee11b add Interessent: insertamum and insertvon when adding prestuden 2025-10-13 10:52:52 +02:00
Alexei Karpenko b9cb8f9cce Interessent anlegen: bugfix Geburtsdatum save, when searching for existing persons, more fields are displayed, form is emptied each time it is opened, adress can only be added, but not overwritten 2025-10-10 16:42:14 +02:00
ma0048 e11d72ace0 bei den tags copy button hinzugefuegt
datatree reexpand gefixed nach dem loeschen und hinzufuegen
2025-10-08 13:48:45 +02:00
Alexei Karpenko 309faaae06 phrasesupdate coma bugfix 2025-10-06 16:57:31 +02:00
Alexei Karpenko 1c21e8f88d Merge branch 'master' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-10-06 16:54:41 +02:00
Alexei Karpenko 5640f229d3 Studierendenverwaltung add Interessenten: switched to new API, Studienplaene are loaded in time 2025-10-06 16:10:06 +02:00
ma0048 9309a48e97 autcomplete gefixed 2025-10-06 10:20:21 +02:00
Alexei Karpenko b22c6c10e4 Student.php controller: renamed method add Interessent to addFirstPrestudentstatus 2025-10-03 14:05:40 +02:00
Alexei Karpenko 60a1d40048 prstudentlib incoming: removed addmeta (debugging) 2025-10-03 14:03:41 +02:00
Alexei Karpenko 8c6033fed6 add first incoming: correctly check lehrverband, moved creating of incoming prestudentstatus to prestudent lib 2025-10-03 14:02:53 +02:00
Alexei Karpenko 3a6fb08350 Creating of Interessenten: moved to PRestudentlib, renamed check to getPerson, corrected transaction handling, enabled creating of Incomings 2025-10-02 16:52:11 +02:00
ma0048 81725a0fe9 echterdv ueberprfung fixed 2025-10-02 14:27:14 +02:00
Cristina 0d51df95f9 Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-10-02 11:30:55 +02:00
Cristina bfd513a475 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-10-02 11:27:31 +02:00
Harald Bamberger 3d50eacdc3 limit height of profile img in detail header 2025-10-01 18:45:26 +02:00
Harald Bamberger 4e4269033b Merge branch 'master' into feature-63445/Studierendenverwaltung_Filter 2025-10-01 17:50:22 +02:00
Harald Bamberger 9d2b147248 Details Header und TabsNav nicht mitscrollen 2025-10-01 17:32:17 +02:00
chfhtw 7b1bb27b34 Multiselect group selection: show only when all selected have an UID 2025-10-01 14:53:08 +02:00
chfhtw 2f20ddaefa Change StV config to hide Tabs when Prestudents without UID are selected 2025-10-01 14:51:29 +02:00
chfhtw ba7cfc3890 Make showOnlyWithUid and showOnlyWithoutUid available for multiselects 2025-10-01 14:50:18 +02:00
Cristina deebe987d3 Added slot selectedItem to autocomplete component in Input.js 2025-10-01 13:51:43 +02:00
Cristina cb77f3148a Added method to get Stundenplantermine for Lehreinheit/Lehrveranstaltung 2025-10-01 13:50:57 +02:00
Cristina cb64c83b50 Added method to get LV-Leitung from given LV 2025-10-01 13:48:10 +02:00
Harald Bamberger ac5ce1573a Merge branch 'master' into bug-66890/studierendenverwaltung_statuswechsel_doppelte_statuseintraege 2025-10-01 13:24:45 +02:00
chfhtw 1414d5f1ef Code Quality 2025-09-30 14:10:21 +02:00
chfhtw f9e2d784cf phrases for fhtw addon 2025-09-30 11:47:34 +02:00
chfhtw f518d56d4e StV: configurable Filters 2025-09-30 11:01:08 +02:00
Harald Bamberger 76e6874a1a Merge branch 'master' into feature-63444/stv_mehrfachaktion_mail_an_private_oder_interne_adresse 2025-09-29 17:33:23 +02:00
Harald Bamberger 3c47453762 add projektarbeit tab to tab_order 2025-09-29 15:49:13 +02:00
Harald Bamberger 4fa2de5105 Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-09-29 15:37:42 +02:00
Harald Bamberger ca55c8b1a7 Archiv.js: import add missing file extension, DocumentDropdown: remove wrapper div causing button not being aligned 2025-09-29 13:48:14 +02:00
Harald Bamberger 5c66dfad49 Merge branch 'master' into feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen 2025-09-29 08:24:18 +02:00
ma0048 e3b6852017 bug beim aendern des status auf student mit ausbildungssemester 0 behoben 2025-09-25 14:42:34 +02:00
ma0048 0f43e8eb7a autocomplete auf backend umgestellt
textarea formattedAnmerkung rausgenommen
ui angepasst
2025-09-24 14:27:01 +02:00
ma0048 6abdb25c0a abort controller fixed und index auf campus.tbl_studierendenantrag_status.studierendenantrag_id hinzugefuegt 2025-09-24 09:33:41 +02:00
Alexei Karpenko 6199283698 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-09-22 17:36:11 +02:00
Alexei Karpenko 3f0f48a4e0 Student.php: bracket bugfix, return person id of added Personinstead of true, Studierendenverwaltung Projektarbeit phrases 2025-09-22 17:34:50 +02:00
Alexei Karpenko 0cb36c2d30 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-09-22 15:54:46 +02:00
Alexei Karpenko a533294121 removed addMeta in Student.php Studierendenverwaltung 2025-09-22 15:54:26 +02:00
Alexei Karpenko c07697c541 Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-09-22 13:52:37 +02:00
Alexei Karpenko 8e7a1a2ddd Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-09-22 13:39:36 +02:00
Alexei Karpenko d062e8903f Mitarbeiter model searchMitarbeiter method: removed redundant person id 2025-09-19 11:29:08 +02:00
Alexei Karpenko 566938d4f0 Studierendenverwaltung Abschlusspruefung: moved Vorsitz and Pruefer search to backend, searched by vorname or nachname or combinations of vorname and nachname 2025-09-18 17:25:00 +02:00
ma0048 aca4195df6 stv kontaktieren tab hinzugefuegt 2025-09-17 11:01:08 +02:00
ma0048 651452d821 bug beim laden des status tabs ohne meldestichtag 2025-09-16 08:40:40 +02:00
ma0048 69a1e945b3 bug beim laden des messages tab ohne oe zuordnung 2025-09-16 08:36:12 +02:00
Alexei Karpenko 776222fd11 bugfix Studierendenverwaltung Projektarbeiten: correct default Stunden at all times 2025-09-12 13:52:21 +02:00
Alexei Karpenko 97f72caf90 Studierendenverwaltung Projektarbeiten: display of lv orgform only if present, hiding modal again after save, Betreuer can be edited after initial creation of Projektarbeit 2025-09-12 02:02:31 +02:00
chfhtw 6658e80d99 code quality 2025-09-11 14:58:20 +02:00
chfhtw ee6e7f3a48 finetuning drag&drop 2025-09-11 13:13:57 +02:00
chfhtw 112211fb0b move function 2025-09-11 13:11:34 +02:00
Alexei Karpenko 3a06dc613f Studierendenverwalung Projektarbeiten: preserve data before saved, modal not closed after saving 2025-09-10 17:28:15 +02:00
chfhtw 86bbfe42db missing break 2025-09-10 11:21:58 +02:00
chfhtw 455698b28e StV Groups Drag&Drop 2025-09-10 11:18:23 +02:00
chfhtw ff061a3e95 FhcAPI: expose getConfig function 2025-09-05 14:04:41 +02:00
chfhtw 1b76b852cf Merge branch 'master' into feature-63435/Studierendenverwaltung_Studierende_Verbandsgruppen_und_Spezialgruppen_zuordnen_Multiaktion 2025-09-05 14:02:48 +02:00
Cristina ed747fe07c Merge remote-tracking branch 'origin/epic-56039/LV-Evaluierung' into epic-56039/LV-Evaluierung
# Conflicts:
#	application/models/education/Lehrveranstaltung_model.php
2025-09-03 15:26:39 +02:00
Cristina 10d58d1a42 Added column prestudent_id to getStudentsByLv method query in Lehrveranstaltung_model.php 2025-09-03 15:24:44 +02:00
Cristina fd2ff27e22 Added column prestudent_id to getStudentsByLv method query in Lehrveranstaltung_model.php 2025-09-03 15:24:07 +02:00
Cristina 594333889d Merge branch 'epic-56039/LV-Evaluierung_NEU' of https://github.com/FH-Complete/FHC-Core into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-09-03 15:14:53 +02:00
Cristina 174ed990a7 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-09-03 13:06:47 +02:00
chfhtw 61cfb175e3 use undefined to avoid VueJs warning 2025-09-03 11:06:09 +02:00
chfhtw 86641ea02d StV: Lehrverband- & Special-groups 2025-09-02 16:06:04 +02:00
chfhtw eae79e9f5e CSS fix: primevue autocomplete inside bootstrap input-group 2025-09-02 16:04:47 +02:00
chfhtw b378649b06 add validation "is_in_db" 2025-09-02 16:04:02 +02:00
Alexei Karpenko fc845ebf4e Studierendenverwaltung Projektarbeit: separate saving of Projektarbeit and Betreuer, added action for editing Betreuer 2025-09-02 15:04:45 +02:00
ma0068 3cdb391a6d use helper file instead of private function for building dropdown entry 2025-08-28 14:29:26 +02:00
ma0068 7b187ebadd add Dropdown for Multiaction Print
add Event for adding Documents to PrintArray
add Berechtigung hasPermissionOutputformat to enable Print for odt and doc Formats (documents abschlusspruefung)
add Validations
2025-08-28 11:05:04 +02:00
ma0068 3a5c4444cb Tab Archive: Documentdropdown for Printing
- define structure for single print array
- fill array with documents according to Fas Dropdown Drucken
- event for adding documents from extension/addons
2025-08-27 14:11:03 +02:00
Alexei Karpenko ce9a4e2e09 Merge branch 'feature-60973/komponente_fuer_lehrfaecherverteilung' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-08-23 16:16:41 +02:00
chfhtw 9b8ac595c6 Code Quality 2025-08-21 12:59:24 +02:00
chfhtw 608e2b5171 Implement: stv/students/getGemeinsamestudien 2025-08-21 09:18:52 +02:00
chfhtw 7de81fab7d Implement: stv/students/getOutgoing 2025-08-20 17:00:14 +02:00
chfhtw c9104749c5 Faster Query for stv/students/getIncoming 2025-08-20 16:52:16 +02:00
chfhtw 5ba0007641 fix: correct relative priority calculation 2025-08-20 14:34:19 +02:00
chfhtw 923427b41f Implement: stv/students/getIncoming 2025-08-20 11:57:31 +02:00
chfhtw 31a5caa558 better (safer) output for semester verband gruppe prio 2025-08-20 11:56:29 +02:00
chfhtw b73eac62b5 add studiensemester param to incoming/outgoing/gs backend 2025-08-20 11:54:01 +02:00
ma0068 6ee3f1d241 show Bezeichnung in Subject Vorlage, add adaption for Tinymce for openMode inSamePage 2025-08-20 11:32:31 +02:00
chfhtw ca3f8bc554 move statusofsemester select into shared function 2025-08-19 11:24:51 +02:00
Cristina bbf147ec39 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-08-14 11:37:57 +02:00
Alexei Karpenko 75adcefd51 Studentenverwaltung Projektarbeit: made text input possible for all date input 2025-07-21 17:52:21 +02:00
Cristina 94e25da6c8 Added phrases for lvevaluierung 2025-07-16 16:13:27 +02:00
Cristina 430da0b236 Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-07-16 11:22:42 +02:00
Cristina c61f87a8d5 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-07-16 11:21:58 +02:00
Alexei Karpenko 01a3dc1fd0 Studierendenverwaltung archiv: removed tabulator columns from computed 2025-07-15 23:08:12 +02:00
Alexei Karpenko 1f258c84d4 Studierendenverwaltung Projektarbeit: moved Beurteilung download to table actions, separate tabs for details and Betreuer 2025-07-15 18:56:49 +02:00
Alexei Karpenko caa70715ad Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-07-15 15:24:30 +02:00
Alexei Karpenko 325cbf9314 Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-07-15 12:44:55 +02:00
Alexei Karpenko 4eaf71e5c6 cancel Vertrag: correct error handling 2025-07-14 17:01:16 +02:00
Alexei Karpenko 1c8ffa786e Studierendenverwaltung Projektarbeit improvements: tabulator (supposedly) stores column changes, changed some phrases, projektarbeit download button is now shown when Projektbeurteilung extension is not installted, errors are displayed near input fields not in pop up, changed modal layout, Vertrag fields are now just text fields, validation errors are cleared 2025-07-10 16:59:58 +02:00
ma0048 153e273fec firefox check entfernt 2025-07-09 13:52:46 +02:00
Alexei Karpenko abbeec11fc Studierendenverwaltung Projektarbeit: date value ende and gesperrt bis can be saved, full type name is shown in Projektarbeit table, made "kontaktdaten bearbeiten" and "person anlegen" buttons less prominent, bugfix cancel contract: contract display is updated immediately 2025-07-08 15:35:46 +02:00
Alexei Karpenko 549f7867ae Kontakt component permission: possible to check if a person is neither student nor employee 2025-07-03 15:26:53 +02:00
Alexei Karpenko 3e924b62a6 Studentenverwaltung new person: errors are shown in fields, not as popup 2025-07-03 15:26:03 +02:00
Cristina 0df082af1f Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-07-02 12:16:19 +02:00
Cristina b3c05f2fe1 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-07-02 12:15:21 +02:00
Cristina 56bfe46675 Added phrases for lvevaluierung 2025-07-02 12:12:44 +02:00
Cristina daf9d2ea15 Added checkbox 'evaluierung' Lehrveranstaltung Details in VILESCI 2025-06-25 13:35:20 +02:00
Cristina 4b8af46a2e Added 'evaluierung' to lehrveranstaltung.class.php and updated related methods 2025-06-25 13:30:05 +02:00
Cristina fd2de106f8 Added column evaluierung to lehre.tbl_lehrveranstaltung
- evaluierung (boolean) indicates if lehrveranstaltung shall be evaluated. Default is true.
2025-06-24 15:02:45 +02:00
Cristina 08182fe0f5 Added phrases for LV-Evaluierung 2025-06-23 15:51:30 +02:00
Andreas Österreicher 02df06288e Bugfix Rückstellgrund 2025-06-16 11:37:04 +02:00
Andreas Österreicher ce47579870 Merge branch 'master' into feature-55978/infocenter_electronic_onboarding_filter 2025-06-16 11:35:49 +02:00
Cristina 1e32bc211b Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-06-16 09:36:04 +02:00
Cristina 1f8d87587d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-06-16 09:35:29 +02:00
Alexei Karpenko d15d27b3e1 Studierendenverwaltung Projektarbeit: added Verträge 2025-06-13 16:19:53 +02:00
Alexei Karpenko e26bce2cf7 removed merge text from code 2025-06-10 14:14:32 +02:00
Alexei Karpenko 6f5fa9624f Merge branch 'feature-60973/komponente_fuer_lehrfaecherverteilung' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-06-10 13:58:50 +02:00
Alexei Karpenko fe81e7fb7c Studierendenverwaltung Projektarbeit: added button for Projektarbeit download 2025-06-03 21:18:03 +02:00
Alexei Karpenko 750b956dd2 Studentenverwaltung Projektarbeit: added button for editing contact data 2025-06-02 15:28:10 +02:00
Alexei Karpenko 9a7cba0717 Studentenverwaltung Projektarbeit: added possibility to create persons, added phrases 2025-05-30 17:54:51 +02:00
Cristina 5ee72fd836 Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-05-27 18:23:51 +02:00
Cristina 4f8c408a8a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-05-27 18:22:45 +02:00
Alexei Karpenko 69e05ccb38 Studentenverwaltung archive: switched to new api factory 2025-05-24 10:14:08 +02:00
Alexei Karpenko 1ca5bd5691 Studierendenverwaltung Projektarbeit: added phrases, only necessary Projektarbeit properties are set when saving 2025-05-21 22:00:04 +02:00
Alexei Karpenko d1c2cf8e64 Merge branch 'master' into feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren 2025-05-19 13:22:05 +02:00
Alexei Karpenko 7548d7b55f Projektbetreuer: new and edit mode 2025-05-18 16:35:30 +02:00
Alexei Karpenko 168e2890c7 Studierendenverwaltung Projektarbeit: set default stunden value, correct lvs when new Projektarbeit, Projektarbetreuer form hidden by default 2025-05-18 15:55:43 +02:00
Alexei Karpenko 4cf2ef2927 removed console logs 2025-05-16 13:40:47 +02:00
Alexei Karpenko 382006aa8b Projektarbeit Studierendenverwaltung: now possible to save and edit Projektbetreuer 2025-05-16 13:37:21 +02:00
Alexei Karpenko 405062f549 added Projektarbeit tab to Studierendenverwaltung, adding, editing, deleting of Projektarbeiten now possible 2025-05-07 18:36:51 +02:00
ma0048 bc48445304 - infocenter filter fuer electronic onboarding hinzugefuegt 2025-02-10 13:05:44 +01:00
241 changed files with 16721 additions and 2804 deletions
+21
View File
@@ -336,3 +336,24 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'requiredPermissions' => array('admin:rw')
),
);
$config['navigation_menu']['apps'] = [
'stv' => [
'link' => site_url('studentenverwaltung'),
'description' => 'Studierendenverwaltung',
#'icon' => 'users',
'requiredPermissions' => array('admin:r', 'assistenz:r')
],
'lvv' => [
'link' => site_url('lVVerwaltung'),
'description' => 'LV Verwaltung',
#'icon' => 'person-chalkboard',
'requiredPermissions' => array('admin:r', 'assistenz:r')
],
'lav' => [
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Lehraufträge',
#'icon' => 'person-chalkboard',
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
]
];
+5 -5
View File
@@ -1,6 +1,6 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
if (! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
@@ -51,7 +51,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
| my-controller/my-method -> my_controller/my_method
*/
$route['default_controller'] = defined('CIS4') && CIS4 ? 'Cis4' : 'Vilesci';
$route['translate_uri_dashes'] = FALSE;
$route['translate_uri_dashes'] = false;
// Class name conflicts
$route['api/v1/organisation/[S|s]tudiengang/(:any)'] = 'api/v1/organisation/studiengang2/$1';
@@ -71,9 +71,9 @@ $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv
// (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';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1';
// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
+2 -2
View File
@@ -29,7 +29,7 @@ $config['similar'] = [
$config['vector'] = [
'priority' => 1,
'rank' => "ts_rank({field}, to_tsquery('simple', {word}))",
'compare' => "to_tsquery('simple', {word}) @@ {field}"
'rank' => "ts_rank({field}, plainto_tsquery('simple', {word}))",
'compare' => "plainto_tsquery('simple', {word}) @@ {field}"
];
+38
View File
@@ -7,5 +7,43 @@ $CI =& get_instance();
$config['student'] = $CI->config->item('student', 'search');
$config['student']['searchfields']['pkz'] = [
'alias' => ['personenkennzeichen', 'personalid'],
'comparison' => 'equals',
'field' => 'matrikelnr'
];
$config['student']['searchfields']['matrnr'] = [
'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
'comparison' => 'equals',
'field' => 'matr_nr',
'join' => [
[
'table' => "public.tbl_prestudent",
'using' => "prestudent_id"
],
[
'table' => "public.tbl_person",
'using' => "person_id"
]
]
];
$config['prestudent'] = $CI->config->item('prestudent', 'search');
$config['prestudent']['searchfields']['pkz'] = [
'alias' => ['personenkennzeichen', 'personalid'],
'comparison' => 'equals',
'field' => 'matrikelnr',
'join' => [
'table' => "public.tbl_student",
'using' => "prestudent_id"
]
];
$config['prestudent']['searchfields']['matrnr'] = [
'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
'comparison' => 'equals',
'field' => 'matr_nr',
'join' => [
'table' => "public.tbl_person",
'using' => "person_id"
]
];
+19 -2
View File
@@ -61,9 +61,13 @@ $config['tabs'] =
'notes' => [
//if true, the count of Messages will be shown in the header of the Tab Messages
'showCountNotes' => true
]
],
'combinePeople' => [
//multitab should only be shown with this length of selection
'validCountMulti' => 2,
],
];
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code'];
@@ -84,6 +88,16 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
);
}
$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] =
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR')
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR
: '0.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] =
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER')
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER
: '0.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0';
$config['student_tab_order'] = [
'details',
'notes',
@@ -97,6 +111,7 @@ $config['student_tab_order'] = [
'grades',
'exam',
'exemptions',
'projektarbeit',
'finalexam',
'mobility',
'jointstudies',
@@ -109,7 +124,9 @@ $config['student_tab_order'] = [
$config['students_tab_order'] = [
'banking',
'status',
'messages',
'groups',
'finalexam',
'combinePeople',
'archive',
];
+1 -1
View File
@@ -72,7 +72,7 @@ class Documents extends Auth_Controller
$stgs = [];
$stsemArray = [];
$buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []);
$buchungstypen = defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : [];
$person_ids = [];
foreach ($stati as $status) {
$person_ids[] = $status->person_id;
+1 -1
View File
@@ -14,7 +14,7 @@ class Pub extends Auth_Controller
{
parent::__construct(
array(
'bild' => ['basis/cis:r']
'bild' => ['basis/cis:r', 'assistenz:r']
)
);
}
+8 -1
View File
@@ -20,11 +20,18 @@ class NeueNachricht extends Auth_Controller
*/
public function _remap()
{
$typeid = $this->input->post('typeid');
$ids = ($this->input->post('ids') && strpos($this->input->post('ids'), ','))
? explode(',', $this->input->post('ids'))
: $this->input->post('ids');
//now working
$this->load->view('Nachrichten', [
'permissions' => [
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
]
],
'ids' => $ids,
'typeid' => $typeid
]);
}
}
@@ -32,6 +32,10 @@ class Studentenverwaltung extends Auth_Controller
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
'student/editBakkZgv' => $this->permissionlib->isBerechtigt('student/editBakkZgv'),
'student/editMakkZgv' => $this->permissionlib->isBerechtigt('student/editMakkZgv'),
'student/editDokZgv' => $this->permissionlib->isBerechtigt('student/editDokZgv'),
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
@@ -442,6 +442,10 @@ class Documents extends FHCAPI_Controller
'betreuerart_kurzbz',
'studiensemester_kurzbz'
] as $key) {
if (in_array($xsl, array('Ausbildungsver', 'AusbVerEng')) && $key === 'uid')
{
continue;
}
$value = $this->input->post_get($key);
if ($value !== null)
$params .= '&' . $key . '=' . urlencode($value);
@@ -119,7 +119,19 @@ class Lehrveranstaltung extends FHCAPI_Controller
if (hasData($lehreinheiten_data))
{
$lehreinheiten = getData($lehreinheiten_data);
$rowData->_children = $lehreinheiten;
if (!isset($row->_children))
{
$row->_children = $lehreinheiten;
}
else
{
if (!is_array($row->_children))
{
$row->_children = [$row->_children];
}
$row->_children = array_merge($row->_children, $lehreinheiten);
}
}
if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent))
@@ -637,7 +637,7 @@ class ProfilUpdate extends FHCAPI_Controller
//? Send email to the Studiengangsassistentinnen
$this->StudentModel->addSelect(["public.tbl_studiengang.email"]);
$this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid");
$this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id");
$this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id and public.tbl_student.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id");
$this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]);
@@ -29,7 +29,7 @@ class Studium extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getStudienAllSemester'=> self::PERM_LOGGED,
'getAllStudienSemester'=> self::PERM_LOGGED,
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
'getLvEvaluierungInfo'=> self::PERM_LOGGED,
@@ -51,7 +51,7 @@ class Studium extends FHCAPI_Controller
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStudienAllSemester(){
public function getAllStudienSemester(){
$parameter_studiensemester = $this->input->get('studiensemester',true);
$parameter_studiengang = $this->input->get('studiengang',true);
@@ -59,24 +59,26 @@ class Studium extends FHCAPI_Controller
$parameter_studienplan = $this->input->get('studienplan',true);
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAktOrNextSemester()));
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
$lv_result =$this->StudentlehrverbandModel->loadWhere([
"student_uid" => getAuthUID(),
"studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz
]);
$lv_data = $this->getDataOrTerminateWithError($lv_result);
if ($studentLehrverband = current($lv_data)) {
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
$student_studiengang = $studentLehrverband->studiengang_kz;
$student_semester = $studentLehrverband->semester;
}
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
$student_studiengang = $studentLehrverband->studiengang_kz;
$student_semester = $studentLehrverband->semester;
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
if(!isset($parameter_studiensemester))
$parameter_studiensemester = $student_studiensemester;
if(!isset($parameter_studiengang))
$parameter_studiengang = $student_studiengang;
if(!isset($parameter_semester))
$parameter_semester = $student_semester;
if(!isset($parameter_studienplan))
$parameter_studienplan = $student_studienplan;
$parameter_studiensemester = $parameter_studiensemester ?? $student_studiensemester;
$parameter_studiengang = $parameter_studiengang ?? $student_studiengang;
$parameter_semester = $parameter_semester ?? $student_semester;
$parameter_studienplan = $parameter_studienplan ?? $student_studienplan;
}
if(isset($parameter_studiensemester)){
@@ -12,8 +12,8 @@ class Gruppe extends FHCAPI_Controller
'add' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'],
'getBenutzer' => ['admin:r', 'assistenz:r'],
'getAll' => ['admin:r', 'assistenz:r'],
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
'getAllSearch' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
]);
@@ -22,7 +22,8 @@ class Gruppe extends FHCAPI_Controller
$this->_ci->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui'
'ui',
'lehre'
)
);
@@ -91,11 +92,11 @@ class Gruppe extends FHCAPI_Controller
$lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
@@ -108,15 +109,33 @@ class Gruppe extends FHCAPI_Controller
}
public function getAll()
public function getAllSearch()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->GruppeModel->addSelect('gruppe_kurzbz,
studiengang_kz,
semester,
bezeichnung,
gid,
\'false\' as lehrverband');
$gruppen_result = $this->_ci->GruppeModel->loadWhere(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
$this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
$this->_ci->GruppeModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->GruppeModel->db->group_start();
$this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%");
$this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%");
$this->_ci->GruppeModel->db->group_end();
}
$this->_ci->GruppeModel->db->group_end();
$gruppen_result = $this->_ci->GruppeModel->load();
$gruppen_array = array();
@@ -135,7 +154,18 @@ class Gruppe extends FHCAPI_Controller
$this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehrverbandModel->addOrder('verband');
$this->_ci->LehrverbandModel->addOrder('gruppe');
$lehrverband_result = $this->_ci->LehrverbandModel->loadWhere(array('tbl_lehrverband.aktiv' => true));
$this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true));
$this->_ci->LehrverbandModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->LehrverbandModel->db->group_start();
$this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%");
$this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%");
$this->_ci->LehrverbandModel->db->group_end();
}
$this->_ci->LehrverbandModel->db->group_end();
$lehrverband_result = $this->_ci->LehrverbandModel->load();
$lehrverband_array = array();
@@ -150,15 +180,40 @@ class Gruppe extends FHCAPI_Controller
$this->terminateWithSuccess($all_gruppen);
}
public function getBenutzer()
public function getBenutzerSearch()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang');
$this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$personen = $this->_ci->PersonModel->loadWhere(array('tbl_benutzer.aktiv' => true));
$this->_ci->PersonModel->db->where(array('tbl_benutzer.aktiv' => true));
$this->_ci->PersonModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->PersonModel->db->group_start();
$this->_ci->PersonModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('uid ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz) ILIKE', "%" . $word . "%");
if (is_numeric($word))
{
$this->_ci->PersonModel->db->or_where('semester', $word);
}
$this->_ci->PersonModel->db->group_end();
}
$this->_ci->PersonModel->db->group_end();
$personen = $this->_ci->PersonModel->load();
$this->terminateWithSuccess(hasData($personen) ? getData($personen) : array());
}
@@ -169,6 +169,10 @@ class Lehreinheit extends FHCAPI_Controller
{
$value = $this->input->post($field);
if ($field === 'lehre')
{
$value = (bool)$value;
}
if ($value !== null)
{
$updateData[$field] = $value;
@@ -281,15 +285,43 @@ class Lehreinheit extends FHCAPI_Controller
public function delete()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
$errors = array();
if (is_array($lehreinheit_id))
{
foreach ($lehreinheit_id as $le_id)
{
$lehreinheit = $this->checkLehreinheit($le_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
if (isError($result))
$this->terminateWithValidationErrors(getError($result));
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
$this->terminateWithSuccess('Erfolgreich geloescht');
if (isError($result))
{
$errors[] = getError($result);
}
}
}
else
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
}
if (!isEmptyArray($errors))
{
if (count($errors) !== count($lehreinheit_id))
$this->terminateWithSuccess(array('errors' => $errors));
else
$this->terminateWithError($errors);
}
else
$this->terminateWithSuccess('Erfolgreich geloescht');
}
public function update()
@@ -15,7 +15,7 @@ class Lektor extends FHCAPI_Controller
'deleteLVPlan' => ['admin:rw', 'assistenz:rw'],
'deletePerson' => ['admin:rw', 'assistenz:rw'],
'getLehrfunktionen' => ['admin:r', 'assistenz:r'],
'getLektoren' => ['admin:r', 'assistenz:r'],
'getLektorenSearch' => ['admin:r', 'assistenz:r'],
'getLektorenByLE' => ['admin:r', 'assistenz:r'],
'getLektorDaten' => ['admin:r', 'assistenz:r'],
'getLektorVertrag' => ['admin:r', 'assistenz:r'],
@@ -208,12 +208,35 @@ class Lektor extends FHCAPI_Controller
$this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load()));
}
public function getLektoren()
public function getLektorenSearch()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
$this->terminateWithSuccess(getData($this->_ci->MitarbeiterModel->loadWhere(array('public.tbl_benutzer.aktiv' => true))));
$this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true);
$this->_ci->MitarbeiterModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->MitarbeiterModel->db->group_start();
$this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->group_end();
}
$this->_ci->MitarbeiterModel->db->group_end();
$this->_ci->MitarbeiterModel->addOrder('nachname');
$this->_ci->MitarbeiterModel->addOrder('vorname');
$result = $this->_ci->MitarbeiterModel->load();
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
private function checkLehreinheit($lehreinheit_id)
@@ -5,7 +5,7 @@ if (!defined('BASEPATH'))
class Tags extends Tag_Controller
{
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:r'];
public function __construct()
{
@@ -1,6 +1,5 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Messages extends FHCAPI_Controller
@@ -14,13 +13,15 @@ class Messages extends FHCAPI_Controller
'getMsgVarsPrestudent' => ['admin:r', 'assistenz:r'],
'getMsgVarsLoggedInUser' => ['admin:r', 'assistenz:r'],
'getNameOfDefaultRecipient' => ['admin:r', 'assistenz:r'],
'getNameOfDefaultRecipients' => ['admin:r', 'assistenz:r'],
'sendMessage' => ['admin:r', 'assistenz:r'],
'deleteMessage' => ['admin:r', 'assistenz:r'],
'getVorlagentext' => ['admin:r', 'assistenz:r'],
'getDataVorlage' => ['admin:r', 'assistenz:r'],
'getPreviewText' => ['admin:r', 'assistenz:r'],
'getReplyData' => ['admin:r', 'assistenz:r'],
'getPersonId' => ['admin:r', 'assistenz:r'],
'getUid' => ['admin:r', 'assistenz:r'],
'getUids' => ['admin:r', 'assistenz:r'],
]);
//Load Models
@@ -37,7 +38,7 @@ class Messages extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui'
'ui', 'messages'
]);
}
@@ -52,11 +53,14 @@ class Messages extends FHCAPI_Controller
$result = $this->MessageModel->getMessagesForTable($id, $offset, $limit);
$data = $this->getDataOrTerminateWithError($result);
if (hasData($result))
{
$data = getData($result);
$this->addMeta('count', $data['count']);
$this->terminateWithSuccess($data['data']);
}
$this->addMeta('count', $data['count']);
$this->terminateWithSuccess($data['data']);
$this->terminateWithSuccess(array());
}
public function getVorlagen()
@@ -66,33 +70,23 @@ class Messages extends FHCAPI_Controller
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
$data = $this->getDataOrTerminateWithError($result);
$oe_kurzbz = current($data);
if (hasData($result))
{
$this->load->model('system/Vorlage_model', 'VorlageModel');
$this->load->model('system/Vorlage_model', 'VorlageModel');
$data = getData($result);
$result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$oe_kurzbz = array_column($data, 'oe_kurzbz');
$result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
$this->terminateWithSuccess($data);
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
//If admin
$this->VorlageModel->addOrder('vorlage_kurzbz', 'ASC');
$result = $this->VorlageModel->loadWhere(
array(
'mimetype' => 'text/html'
));
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
$this->terminateWithSuccess(array());
}
public function getVorlagentext($vorlage_kurzbz)
public function getDataVorlage($vorlage_kurzbz)
{
//$this->terminateWithError("vor " . $vorlage_kurzbz, self::ERROR_TYPE_GENERAL);
//$studiengang_kz = 227; //TODO(Manu) dynamisieren NULL
$studiengang_kz = 0;
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$this->VorlagestudiengangModel->addOrder('version', 'DESC');
@@ -104,30 +98,53 @@ class Messages extends FHCAPI_Controller
]);
$data = $this->getDataOrTerminateWithError($result);
//not correct with Vorlage
$vorlage = current($data);
//$this->terminateWithSuccess($data);
$this->terminateWithSuccess($vorlage->text);
$this->terminateWithSuccess($vorlage);
}
public function getMessageVarsPerson($id, $typeId)
public function getMessageVarsPerson($typeId)
{
$person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id;
$result = $this->MessageModel->getMsgVarsDataByPersonId($person_id);
$data = $this->getDataOrTerminateWithError($result);
$ids = $this->input->post('ids');
$messageVarsPerson = [];
$this->terminateWithSuccess($data);
foreach ($ids as $id)
{
$person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id;
$result = $this->MessageModel->getMsgVarsDataByPersonId($person_id);
$data = $this->getDataOrTerminateWithError($result);
$messageVarsPerson[] = current($data);
}
$this->terminateWithSuccess($messageVarsPerson);
}
public function getMsgVarsPrestudent($id, $typeId)
public function getMsgVarsPrestudent($typeId)
{
$prestudent_id = ($typeId == 'uid') ? $this->_getPrestudentIdFromUid($id) : $id;
$result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$ids = $this->input->post('ids');
if(!is_array($ids)) {
$ids = array($ids);
}
$messageVarsPrestudent = [];
$this->terminateWithSuccess($data);
if($typeId == 'uid')
{
$prestudent_ids = [];
foreach ($ids as $id)
{
$prestudent_ids[] = $this->_getPrestudentIdFromUid($id);
}
}
else
$prestudent_ids = $ids;
foreach ($prestudent_ids as $prestudent_id)
{
$result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$messageVarsPrestudent[] = current($data);
}
$this->terminateWithSuccess($messageVarsPrestudent);
}
public function getMsgVarsLoggedInUser()
@@ -138,27 +155,45 @@ class Messages extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
public function getNameOfDefaultRecipient($id, $type_id)
public function getNameOfDefaultRecipients($type_id)
{
$id = ($type_id != 'person_id') ? $this->_getPersonId($id, $type_id) : $id;
$ids = $this->input->post('ids');
if(!is_array($ids)) {
$ids = array($ids);
}
$recipients = [];
if (empty($ids)) {
throw new InvalidArgumentException($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL);
}
$this->load->model('person/Person_model', 'PersonModel');
if($type_id != 'person_id'){
foreach ($ids as $id)
{
$person_id = $this->_getPersonId($id, $type_id);
$result = $this->PersonModel->load($person_id);
$data = $this->getDataOrTerminateWithError($result);
$name = current($data);
$recipients[$id] = $name->vorname . " " . $name->nachname;
}
}
else {
foreach ($ids as $id) {
$result = $this->PersonModel->load($id);
$data = $this->getDataOrTerminateWithError($result);
$name = current($data);
$recipients[$id] = $name->vorname . " " . $name->nachname;
}
}
$result = $this->PersonModel->load($id);
$data = $this->getDataOrTerminateWithError($result);
$name = current($data);
$this->terminateWithSuccess($name->vorname . " " . $name->nachname );
$this->terminateWithSuccess($recipients);
}
public function sendMessage($recipient_id)
public function sendMessage($typeId)
{
//has to be uid
// $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL);
//default setting
$receiversPersonId = $this->_getPersonId($recipient_id, 'uid');
$resultReturn = [];
$uid = getAuthUID();
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
@@ -196,49 +231,61 @@ class Messages extends FHCAPI_Controller
$body = $this->input->post('body');
$relationmessage_id = $this->input->post('relationmessage_id');
$typeId = $this->input->post('type_id');
$id = $this->input->post('id');
if($typeId == 'uid')
if (isset($_POST['ids']))
{
$prestudent_id = $this-> _getPrestudentIdFromUid($id);
//parseMessagetext for variables Prestudent
$result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
if($typeId == 'mitarbeiter_uid')
{
$person_id = $this->_getPersonId($id, $typeId);
$result = $this->MessagesModel->parseMessageTextPerson($person_id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
$this->terminateWithError($bodyParsed, self::ERROR_TYPE_GENERAL);
}
elseif($typeId == 'person_id')
{
$result = $this->MessagesModel->parseMessageTextPerson($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
elseif($typeId == 'prestudent_id')
{
// $this->terminateWithError("prestudent_id ", self::ERROR_TYPE_GENERAL);
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
else
{
$this->terminateWithError("type_id " . $typeId . " not valid", self::ERROR_TYPE_GENERAL);
$ids = json_decode($_POST['ids']);
unset($_POST['ids']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
$result = $this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id);
if (!is_array($ids)) {
$ids = [$ids];
}
$this->terminateWithSuccess($result);
foreach ($ids as $id)
{
$receiversPersonId = $typeId == "person_id" ? $id : $this->_getPersonId($id, $typeId);
if($typeId == 'uid')
{
$prestudent_id = $this-> _getPrestudentIdFromUid($id);
$result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
if($typeId == 'mitarbeiter_uid')
{
$person_id = $this->_getPersonId($id, $typeId);
$result = $this->MessagesModel->parseMessageTextPerson($person_id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
elseif($typeId == 'person_id')
{
$result = $this->MessagesModel->parseMessageTextPerson($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
elseif($typeId == 'prestudent_id')
{
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$result =$this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id);
$data = $this->getDataOrTerminateWithError($result);
$resultReturn[] = current($data);
}
$this->terminateWithSuccess($resultReturn);
}
public function getPreviewText($id, $type_id)
public function getPreviewText($type_id)
{
if (isset($_POST['data']))
{
@@ -246,39 +293,60 @@ class Messages extends FHCAPI_Controller
unset($_POST['data']);
}
else
$this->terminateWithError("Textbody missing ", self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('messages', 'errorMissingOrInvalidParameters', ['parameter'=> "Textbody"]), self::ERROR_TYPE_GENERAL);
switch($type_id)
if (isset($_POST['ids']))
{
case 'uid':
$prestudent_id = $this->_getPrestudentIdFromUid($id);
$result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data);
break;
case 'prestudent_id':
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $data);
break;
case 'person_id':
$result = $this->MessagesModel->parseMessageTextPerson($id, $data);
break;
case 'mitarbeiter_uid':
{
$person_id = $this->_getPersonId($id, $type_id);
$result = $this->MessagesModel->parseMessageTextPerson($person_id, $data);
}
break;
default:
$this->terminateWithError("MESSAGES::getPreviewText logic for type_id " . $type_id . " not defined yet", self::ERROR_TYPE_GENERAL);
break;
$ids = json_decode($_POST['ids']);
if(!is_array($ids))
{
$ids = array($ids);
}
unset($_POST['ids']);
}
else
$this->terminateWithError($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL);
$bodyParsed = $this->getDataOrTerminateWithError($result);
$bodyParsed = [];
foreach ($ids as $id)
{
switch($type_id)
{
case 'uid':
$prestudent_id = $this->_getPrestudentIdFromUid($id);
$result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
break;
case 'prestudent_id':
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
break;
case 'person_id':
$result = $this->MessagesModel->parseMessageTextPerson($id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
break;
case 'mitarbeiter_uid':
{
$person_id = $this->_getPersonId($id, $type_id);
$result = $this->MessagesModel->parseMessageTextPerson($person_id, $data);
$bodyParsed[$id] = $this->getDataOrTerminateWithError($result);
}
break;
default:
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $type_id]), self::ERROR_TYPE_GENERAL);
break;
}
}
$this->terminateWithSuccess($bodyParsed);
}
public function getReplyData($messageId)
{
//TODO(Manu) validation of messageId: if number
if (!is_numeric($messageId)) {
$this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value'=> 'Message ID']), self::ERROR_TYPE_GENERAL);
}
$this->MessageModel->addSelect('public.tbl_msg_message.*');
$this->MessageModel->addSelect('r.*');
@@ -301,7 +369,6 @@ class Messages extends FHCAPI_Controller
$replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum);
$dataMessage[0]->replyBody = $replyBody;
$dataMessage[0]->rest = "Help Manu";
$dataMessage[0]->replySubject = $prefix . $subject;
$this->terminateWithSuccess($dataMessage);
@@ -349,6 +416,11 @@ class Messages extends FHCAPI_Controller
['prestudent_id' => $id]
);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$data = $this->getDataOrTerminateWithError($result);
$person = current($data);
@@ -356,8 +428,11 @@ class Messages extends FHCAPI_Controller
$this->terminateWithSuccess($person->person_id);
}
public function getUid($id, $typeId)
public function getUids($typeId)
{
$ids = $this->input->post('ids');
$benutzerIds = [];
if (!$typeId)
{
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Type ID']), self::ERROR_TYPE_GENERAL);
@@ -365,39 +440,50 @@ class Messages extends FHCAPI_Controller
elseif ($typeId == 'person_id')
{
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['person_id' => $id]
);
foreach ($ids as $id)
{
$result = $this->BenutzerModel->loadWhere(
['person_id' => $id]
);
$data = $this->getDataOrTerminateWithError($result);
$benutzer = current($data);
$benutzerIds[$id] = $benutzer->uid;
}
}
elseif($typeId == 'prestudent_id')
{
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->loadWhere(
['prestudent_id' => $id]
);
foreach ($ids as $id)
{
$result = $this->PrestudentModel->loadWhere(
['prestudent_id' => $id]
);
$data = $this->getDataOrTerminateWithError($result);
$person = current($data);
$person_id = $person->person_id;
$data = $this->getDataOrTerminateWithError($result);
$person = current($data);
$person_id = $person->person_id;
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['person_id' => $person_id]
);
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
['person_id' => $person_id]
);
$data = $this->getDataOrTerminateWithError($result);
$benutzer = current($data);
$benutzerIds[$id] = $benutzer->uid;
}
}
elseif($typeId == 'uid' || $typeId == 'mitarbeiter_uid')
{
$this->terminateWithSuccess($id);
$this->terminateWithSuccess($ids);
}
else
{
$this->terminateWithError("MESSAGES::getUID logic for type_id " . $typeId . " not defined yet", self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$data = $this->getDataOrTerminateWithError($result);
$benutzer = current($data);
$this->terminateWithSuccess($benutzer->uid);
$this->terminateWithSuccess($benutzerIds);
}
private function _getPersonId($id, $typeId)
@@ -416,11 +502,16 @@ class Messages extends FHCAPI_Controller
['prestudent_id' => $id]
);
}
else
{
$this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
$data = $this->getDataOrTerminateWithError($result);
if (count($data) < 1)
{
$this->terminateWithError('Error: Messages API no person_id found.');
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
}
$person = current($data);
@@ -429,7 +520,6 @@ class Messages extends FHCAPI_Controller
private function _getPrestudentIdFromUid($uid)
{
// $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL);
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(
['student_uid' => $uid]
@@ -438,7 +528,7 @@ class Messages extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
if (count($data) < 1)
{
$this->terminateWithError('Error: Messages API no prestudent_id found.');
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
}
$student = current($data);
@@ -463,4 +553,4 @@ class Messages extends FHCAPI_Controller
date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body
);
}
}
}
@@ -0,0 +1,69 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Studienplan extends FHCAPI_Controller
{
public function __construct()
{
// TODO(chris): access!
parent::__construct([
'getBySemester' => self::PERM_LOGGED
]);
}
public function getBySemester()
{
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$studiengang_kz = $this->input->get('studiengang_kz');
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
$ausbildungssemester = $this->input->get('ausbildungssemester') ?: null;
$orgform_kurzbz = $this->input->get('orgform_kurzbz') ?: null;
if (!$studiengang_kz || !is_numeric($studiengang_kz))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL);
if (!$studiensemester_kurzbz)
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiensemester']), self::ERROR_TYPE_GENERAL);
if (isset($ausbildungssemester) && !is_numeric($ausbildungssemester))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Ausbildungssemester']), self::ERROR_TYPE_GENERAL);
//~ $this->load->library('form_validation');
//~ $this->form_validation->set_rules('studiengang_kz', 'StudiengangKz', 'required|numeric');
//~ $this->form_validation->set_rules('studiensemester_kurzbz', 'StudiensemesterKurbz', 'required');
//~ $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'numeric');
//~ if (!$this->form_validation->run())
//~ {
//~ $this->addMeta('fail2', 'fail2');
//~ return $this->terminateWithValidationErrors($this->form_validation->error_array());
//~ }
$this->addMeta('stg_kz', $studiengang_kz);
$this->addMeta('sem', $studiensemester_kurzbz);
$this->addMeta('sem2', $ausbildungssemester);
$this->addMeta('org', $orgform_kurzbz);
$result = $this->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester, $orgform_kurzbz);
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
}
@@ -20,8 +20,6 @@ class Abschlusspruefung extends FHCAPI_Controller
'getBeurteilungen' => ['admin:rw', 'assistenz:rw'],
'getAkadGrade' => ['admin:rw', 'assistenz:rw'],
'getMitarbeiter' => ['admin:rw', 'assistenz:rw'],
'getAllMitarbeiter' => ['admin:rw', 'assistenz:rw'],
'getAllPersons' => ['admin:rw', 'assistenz:rw'],
'getPruefer' => ['admin:rw', 'assistenz:rw'],
'getTypStudiengang' => ['admin:rw', 'assistenz:rw'],
'checkForExistingExams' => ['admin:rw', 'assistenz:rw'],
@@ -102,35 +100,45 @@ class Abschlusspruefung extends FHCAPI_Controller
{
$abschlusspruefung_id = $this->input->post('id');
$this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*');
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN pruefer1 IS NOT NULL
THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
ELSE NULL
END AS p1
");
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN pruefer2 IS NOT NULL
THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
ELSE NULL
END AS p2
");
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN pruefer3 IS NOT NULL
THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
ELSE NULL
END AS p3
");
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN vorsitz IS NOT NULL
THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
ELSE NULL
END AS pv
");
$this->AbschlusspruefungModel->addSelect(
'lehre.tbl_abschlusspruefung.*,
p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname,
p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost,
p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname,
p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost,
p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname,
p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost,
pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname,
pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid'
);
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN pruefer1 IS NOT NULL
//~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
//~ ELSE NULL
//~ END AS p1
//~ ");
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN pruefer2 IS NOT NULL
//~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
//~ ELSE NULL
//~ END AS p2
//~ ");
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN pruefer3 IS NOT NULL
//~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
//~ ELSE NULL
//~ END AS p3
//~ ");
//~ $this->AbschlusspruefungModel->addSelect("
//~ CASE
//~ WHEN vorsitz IS NOT NULL
//~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
//~ ELSE NULL
//~ END AS pv
//~ ");
$this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT');
@@ -220,8 +228,10 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithSuccess($typStudiengang);
}
public function getMitarbeiter($searchString)
public function getMitarbeiter()
{
$searchString = $this->input->get('searchString') ?? '';
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
@@ -232,8 +242,10 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithSuccess($result ?: []);
}
public function getPruefer($searchString)
public function getPruefer()
{
$searchString = $this->input->get('searchString') ?? '';
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
@@ -444,58 +456,4 @@ class Abschlusspruefung extends FHCAPI_Controller
}
$this->terminateWithSuccess('step3');
}
/*
* returns list of all Mitarbeiter
* as key value list to be used in select or autocomplete
*/
public function getAllMitarbeiter()
{
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$sql = "
SELECT
ma.mitarbeiter_uid as mitarbeiter_uid,
CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid, ')') as label
FROM
public.tbl_mitarbeiter ma
JOIN public.tbl_benutzer bn ON (bn.uid = ma.mitarbeiter_uid)
JOIN public.tbl_person p ON (p.person_id = bn.person_id)
ORDER BY
p.nachname ASC
";
$result = $this->MitarbeiterModel->execReadOnlyQuery($sql);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/*
* returns list of all Persons
* as key value list to be used in select or autocomplete
*/
public function getAllPersons()
{
$this->load->model('person/Person_model', 'PersonModel');
$sql = "
SELECT
p.vorname, p.nachname, p.person_id,
CONCAT(p.nachname, ' ', p.vorname) as label
FROM
public.tbl_person p
-- JOIN public.tbl_benutzer bn ON (p.person_id = bn.person_id)
-- and bn.aktiv = 'true'
ORDER BY
p.nachname ASC
";
//TODO(manu) check if filter active benutzer
$result = $this->PersonModel->execReadOnlyQuery($sql);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -39,7 +39,7 @@ class Archiv extends FHCAPI_Controller
'archive' => ['admin:w', 'assistenz:w'],
'download' => ['admin:w', 'assistenz:w'],
'update' => ['admin:w'],
'delete' => ['admin:w', 'assistenz:w']
'delete' => ['admin:w', 'assistenz:w'],
]);
// Load models
@@ -107,13 +107,9 @@ class Archiv extends FHCAPI_Controller
$result = $this->AkteModel->load($akte_id);
if (!hasData($result)) $this->terminateWithError('Akte not found');
$data = $this->getDataOrTerminateWithError($result);
$data = getData($result)[0];
//$this->addMeta("daa", $data->inhalt);
$fileObj = new stdClass();
if (isset($data->inhalt) && $data->inhalt != '')
@@ -133,12 +129,7 @@ class Archiv extends FHCAPI_Controller
//header("Content-type: $data->mimetype");
header('Content-Disposition: attachment; filename="'.$data->titel.'"');
readfile($filename);
//echo base64_decode($data->inhalt);
die();
//~ $fileObj->file = $data->inhalt;
//~ $fileObj->name = $data->titel;
//~ $fileObj->mimetype = $data->mimetype;
//~ $fileObj->disposition = 'attachment';
}
else
{
@@ -146,12 +137,6 @@ class Archiv extends FHCAPI_Controller
$result = $this->aktelib->get($akte_id);
}
/* $fileObj->filename
* $fileObj->file
* $fileObj->name
* $fileObj->mimetype
* $fileObj->disposition*/
}
/**
@@ -298,7 +298,7 @@ class Aufnahmetermine extends FHCAPI_Controller
$reihungstestangetreten =
(isset($formData['reihungstestangetreten']) && !empty($formData['reihungstestangetreten']))
? $formData['reihungstestangetreten']
: null;
: false;
$aufnahmegruppe_kurzbz =
(isset($formData['aufnahmegruppe_kurzbz']) && !empty($formData['aufnahmegruppe_kurzbz']))
? $formData['aufnahmegruppe_kurzbz']
@@ -33,6 +33,9 @@ class Config extends FHCAPI_Controller
{
// TODO(chris): permissions
parent::__construct([
'get' => ['admin:r', 'assistenz:r'],
'set' => ['admin:r', 'assistenz:r'],
'filter' => ['admin:r', 'assistenz:r'],
'student' => ['admin:r', 'assistenz:r'],
'students' => ['admin:r', 'assistenz:r']
]);
@@ -45,13 +48,255 @@ class Config extends FHCAPI_Controller
'lehre',
'stv',
'konto',
'abschlusspruefung'
'abschlusspruefung',
'projektarbeit'
]);
// Load Config
$this->load->config('stv');
}
/**
* get App config
*/
public function get()
{
$this->load->model('system/Variable_model', 'VariableModel');
$this->load->config('stv');
$config = [];
#number_displayed_past_studiensemester
$result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
$data = $this->getDataOrTerminateWithError($result);
$number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default');
$config['number_displayed_past_studiensemester'] = [
"type" => "number",
"label" => $this->p->t('stv', 'settings_no_displayed_past_sem'),
"value" => $data['number_displayed_past_studiensemester']
?? $number_displayed_past_studiensemester_default
];
#font_size
$result = $this->VariableModel->getVariables(getAuthUID(), ['stv_font_size']);
$data = $this->getDataOrTerminateWithError($result);
$config['font_size'] = [
"type" => "select",
"label" => $this->p->t('stv', 'settings_fontsize'),
"value" => $data['stv_font_size'] ?? "fs_normal",
"options" => [
"fs_xx-small" => $this->p->t('stv', 'settings_fontsize_xx-small'),
"fs_x-small" => $this->p->t('stv', 'settings_fontsize_x-small'),
"fs_small" => $this->p->t('stv', 'settings_fontsize_small'),
"fs_normal" => $this->p->t('stv', 'settings_fontsize_normal'),
"fs_big" => $this->p->t('stv', 'settings_fontsize_big'),
"fs_huge" => $this->p->t('stv', 'settings_fontsize_huge')
]
];
#others
Events::trigger('stv_config_get', function & () use (&$config) {
return $config;
});
$this->terminateWithSuccess($config);
}
/**
* set App config
*/
public function set()
{
$this->load->model('system/Variable_model', 'VariableModel');
$this->load->library('form_validation');
$this->form_validation->set_rules(
'number_displayed_past_studiensemester',
$this->p->t('stv', 'settings_no_displayed_past_sem'),
'required|integer'
);
$this->form_validation->set_rules(
'font_size',
$this->p->t('stv', 'settings_fontsize'),
'required|in_list[fs_xx-small,fs_x-small,fs_small,fs_normal,fs_big,fs_huge]'
);
Events::trigger('stv_config_validation', $this->form_validation);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$this->VariableModel->setVariable(
getAuthUID(),
'number_displayed_past_studiensemester',
$this->input->post('number_displayed_past_studiensemester')
);
$this->VariableModel->setVariable(
getAuthUID(),
'stv_font_size',
$this->input->post('font_size')
);
Events::trigger('stv_config_set', $this->input);
$this->terminateWithSuccess();
}
/*
* Get the config for the student filters
*
* @return void
*/
public function filter()
{
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
$this->BuchungstypModel->addOrder('beschreibung');
$result = $this->BuchungstypModel->load();
$buchungstyp_kurzbz = $this->getDataOrTerminateWithError($result);
$buchungstyp_kurzbz_plus_all = array_merge([[
'buchungstyp_kurzbz' => 'all',
'beschreibung' => $this->p->t('stv', 'konto_all_types')
]], $buchungstyp_kurzbz);
$this->load->model('crm/Statusgrund_model', 'StatusgrundModel');
$result = $this->StatusgrundModel->getAktiveGruende();
$statusgruende = $this->getDataOrTerminateWithError($result);
$result = [];
$result[] = [
'id' => 'filter_konto_count_0',
'label' => $this->p->t('stv', 'filter_konto_count_0'),
'type' => 'konto',
'fixed' => [
'missing' => true,
'usestdsem' => true
],
'dynamic' => [
'buchungstyp_kurzbz' => [
'type' => 'select',
'values' => $buchungstyp_kurzbz,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
]
]
];
$result[] = [
'id' => 'filter_konto_missing_counter',
'label' => $this->p->t('stv', 'filter_konto_missing_counter'),
'type' => 'konto_counter',
'dynamic' => [
'buchungstyp_kurzbz' => [
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
],
'samestg' => [
'type' => 'bool',
'label' => $this->p->t('stv', 'filter_konto_samestg'),
'default' => $this->variablelib->getVar('kontofilterstg') == 'true'
]
]
];
$result[] = [
'id' => 'filter_documents',
'label' => $this->p->t('stv', 'filter_documents'),
'type' => 'documents'
];
$result[] = [
'id' => 'filter_konto_missing_counter_past',
'label' => $this->p->t('stv', 'filter_konto_missing_counter_past'),
'type' => 'konto_counter',
'fixed' => [
'past' => true
],
'dynamic' => [
'buchungstyp_kurzbz' => [
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
],
'samestg' => [
'type' => 'bool',
'label' => $this->p->t('stv', 'filter_konto_samestg'),
'default' => $this->variablelib->getVar('kontofilterstg') == 'true'
]
]
];
$result[] = [
'id' => 'filter_konto_missing_studiengebuehr',
'label' => $this->p->t('stv', 'filter_konto_missing_studiengebuehr'),
'type' => 'konto',
'fixed' => [
'missing' => true,
'usestdsem' => true
],
'dynamic' => [
'buchungstyp_kurzbz' => [
'type' => 'select',
'values' => $buchungstyp_kurzbz,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
]
]
];
$result[] = [
'id' => 'filter_konto_studiengebuehrerhoeht',
'label' => $this->p->t('stv', 'filter_konto_studiengebuehrerhoeht'),
'type' => 'konto',
'fixed' => [
'usestdsem' => true
],
'dynamic' => [
'buchungstyp_kurzbz' => [
'type' => 'select',
'values' => $buchungstyp_kurzbz,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
]
]
];
$result[] = [
'id' => 'filter_zgv_without_date',
'label' => $this->p->t('stv', 'filter_zgv_without_date'),
'type' => 'zgv'
];
$result[] = [
'id' => 'filter_statusgrund',
'label' => $this->p->t('stv', 'filter_statusgrund'),
'type' => 'statusgrund',
'fixed' => [
'usestdsem' => true
],
'dynamic' => [
'statusgrund_id' => [
'type' => 'select',
'values' => $statusgruende,
'value_key' => 'statusgrund_id',
'label_key' => 'bezeichnung'
]
]
];
Events::trigger('stv_conf_filter', function & () use (&$result) {
return $result;
});
$this->terminateWithSuccess($result);
}
public function student()
{
$result = [];
@@ -59,21 +304,21 @@ class Config extends FHCAPI_Controller
$result['details'] = [
'title' => $this->p->t('stv', 'tab_details'),
'component' => './Stv/Studentenverwaltung/Details/Details.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Details.js'),
'config' => $config['details']
];
$result['notes'] = [
'title' => $this->p->t('stv', 'tab_notes'),
'component' => './Stv/Studentenverwaltung/Details/Notizen.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Notizen.js'),
'config' => $config['notes'],
'showSuffix' => ($config['notes']['showCountNotes'] ?? false),
'suffixhelper' => APP_ROOT . 'public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js'
'suffixhelper' => absoluteJsImportUrl('public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js')
];
$result['contact'] = [
'title' => $this->p->t('stv', 'tab_contact'),
'component' => './Stv/Studentenverwaltung/Details/Kontakt.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js'),
'config' => [
'showBankaccount' => $this->permissionlib->isBerechtigt('mitarbeiter/bankdaten')
|| $this->permissionlib->isBerechtigt('student/bankdaten')
@@ -81,20 +326,23 @@ class Config extends FHCAPI_Controller
];
$result['prestudent'] = [
'title' => $this->p->t('stv', 'tab_prestudent'),
'component' => './Stv/Studentenverwaltung/Details/Prestudent.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js'),
'config' => $config['prestudent']
];
$result['status'] = [
'title' => 'Status',
'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'),
'config' => [
'showStatusVorruecken' => defined('STATUS_VORRUECKEN_ANZEIGEN') ? STATUS_VORRUECKEN_ANZEIGEN : true,
]
];
$result['documents'] = [
'title' => $this->p->t('stv', 'tab_documents'),
'component' => './Stv/Studentenverwaltung/Details/Dokumente.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Dokumente.js')
];
$result['banking'] = [
'title' => $this->p->t('stv', 'tab_banking'),
'component' => './Stv/Studentenverwaltung/Details/Konto.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
'config' => [
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
@@ -106,20 +354,22 @@ class Config extends FHCAPI_Controller
];
$result['resources'] = [
'title' => $this->p->t('stv', 'tab_resources'),
'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Betriebsmittel.js'),
'showOnlyWithUid' => true
];
$result['groups'] = [
'title' => $this->p->t('stv', 'tab_groups'),
'component' => './Stv/Studentenverwaltung/Details/Gruppen.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
'showOnlyWithUid' => true
];
$result['messages'] = [
'title' => $this->p->t('stv', 'tab_messages'),
'component' => './Stv/Studentenverwaltung/Details/Messages.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'),
];
$result['grades'] = [
'title' => $this->p->t('stv', 'tab_grades'),
'component' => './Stv/Studentenverwaltung/Details/Noten.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Noten.js'),
'showOnlyWithUid' => true,
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
@@ -132,29 +382,42 @@ class Config extends FHCAPI_Controller
$result['exam'] = [
'title' => $this->p->t('stv', 'tab_exam'),
'component' => './Stv/Studentenverwaltung/Details/Pruefung.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js'),
'showOnlyWithUid' => true
];
$result['exemptions'] = [
'title' => $this->p->t('lehre', 'anrechnungen'),
'component' => './Stv/Studentenverwaltung/Details/Anrechnungen.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js'),
'config' => $config['exemptions']
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
'showOnlyWithUid' => true,
'config' => $config['finalexam']
];
$result['projektarbeit'] = [
'title' => $this->p->t('stv', 'tab_projektarbeit'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit.js'),
'config' => array_merge(
$config['projektarbeit'],
['showVertragsdetails' =>
defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN]
)
];
$result['mobility'] = [
'title' => $this->p->t('stv', 'tab_mobility'),
'component' => './Stv/Studentenverwaltung/Details/Mobility.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Mobility.js'),
'showOnlyWithUid' => true
];
$result['archive'] = [
'title' => $this->p->t('stv', 'tab_archive'),
'component' => './Stv/Studentenverwaltung/Details/Archiv.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
'config' => [
'showEdit' => $this->permissionlib->isBerechtigt('admin')
]
@@ -162,22 +425,24 @@ class Config extends FHCAPI_Controller
$result['jointstudies'] = [
'title' => $this->p->t('stv', 'tab_jointstudies'),
'component' => './Stv/Studentenverwaltung/Details/JointStudies.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js'),
'showOnlyWithUid' => true
];
$result['coursedates'] = [
'title' => $this->p->t('stv', 'tab_courseDates'),
'component' => './Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js')
];
$result['admissionDates'] = [
'title' => $this->p->t('stv', 'tab_admissionDates'),
'component' => './Stv/Studentenverwaltung/Details/Aufnahmetermine.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Aufnahmetermine.js')
];
$result['functions'] = [
'title' => $this->p->t('stv', 'tab_functions'),
'component' => './Stv/Studentenverwaltung/Details/Funktionen.js'
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Funktionen.js'),
'showOnlyWithUid' => true
];
Events::trigger('stv_conf_student', function & () use (&$result) {
@@ -195,7 +460,7 @@ class Config extends FHCAPI_Controller
$config = $this->config->item('tabs');
$result['banking'] = [
'title' => $this->p->t('stv', 'tab_banking'),
'component' => './Stv/Studentenverwaltung/Details/Konto.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
'config' => [
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
@@ -205,9 +470,14 @@ class Config extends FHCAPI_Controller
'additionalCols' => []
]
];
$result['groups'] = [
'title' => $this->p->t('stv', 'tab_groups'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
'showOnlyWithUid' => true
];
$result['status'] = [
'title' => 'Status',
'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'),
'config' => [
'changeStatusToAbbrecherStgl' => $this->permissionlib->isBerechtigt('admin'),
'changeStatusToAbbrecherStud' => $this->permissionlib->isBerechtigt('admin'),
@@ -218,17 +488,37 @@ class Config extends FHCAPI_Controller
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
'showOnlyWithUid' => true,
'config' => $config['finalexam']
];
$result['archive'] = [
'title' => $this->p->t('stv', 'tab_archive'),
'component' => './Stv/Studentenverwaltung/Details/Archiv.js',
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
'config' => [
'showEdit' => $this->permissionlib->isBerechtigt('admin')
]
];
if($this->permissionlib->isBerechtigt('basis/person'))
{
$result['combinePeople'] = [
'title' => $this->p->t('stv', 'tab_combine_people'),
'component' => './Stv/Studentenverwaltung/Details/CombinePeople.js',
'config' => $config['combinePeople']
];
}
$result['kontaktieren'] = [
'title' => $this->p->t('stv', 'tab_kontaktieren'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontaktieren.js'),
];
$result['messages'] = [
'title' => $this->p->t('stv', 'tab_messages'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'),
];
Events::trigger('stv_conf_students', function & () use (&$result) {
return $result;
});
@@ -2,6 +2,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \CI3_Events as Events;
use \DateTime as DateTime;
class Dokumente extends FHCAPI_Controller
@@ -19,6 +20,8 @@ class Dokumente extends FHCAPI_Controller
'getDoktypen' => ['admin:r', 'assistenz:r'],
'uploadDokument' => ['admin:rw', 'assistenz:rw'],
'download' => ['admin:rw', 'assistenz:rw'],
'getDocumentDropDown' => ['admin:rw', 'assistenz:rw'],
'getDocumentDropDownMulti' => ['admin:rw', 'assistenz:rw'],
]);
// Load Libraries
@@ -566,4 +569,422 @@ class Dokumente extends FHCAPI_Controller
return false;
}
}
public function getDocumentDropDown($prestudent_id, $studiensemester_kurzbz, $studiengang_kz)
{
$this->load->helper('hlp_common');
//permission to create also odt, and doc outputs of certain documents(menu abschlusspruefung)
$hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's');
if (!$prestudent_id)
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent_id']), self::ERROR_TYPE_GENERAL);
if (!$studiensemester_kurzbz)
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL);
if(!$studiengang_kz)
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
$uid = $this->_loadUIDFromPrestudent($prestudent_id);
$semArray = $this->_getEntriesStudiensemester();
$stgTyp = $this->_getStudiengangstyp($studiengang_kz);
$documents = [
buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uid, 10, null),
buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf&prestudent_id=$prestudent_id", null,20, null),
buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Zweisprachig", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf&prestudent_id=$prestudent_id", null,21, null),
buildDropdownEntryPrintArray("bescheid", "Bescheid (nur Voransicht)", "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf", $uid, 25, null),
buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uid, 26, null),
buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uid, 50, null),
buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uid, 51, null),
buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uid", $uid,200, "zutrittskarte.php"),
buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uid, 60, null),
buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uid, 61, null),
$this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz),
$this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz),
$this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz, true),
$this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz, true),
[
"id" => "submenu_studstatus",
"type" => "submenu",
"name" => "Verwaltung des StudierendenStatus",
"order" => 110,
"data" => [
buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
]
],
//Bakkzeugnis bzw. Diplomzeugnis is just shown in tab final_exam
buildDropdownEntryPrintArray("zeugnis", "Zeugnis", "xml=zeugnis.rdf.php&xsl=Zeugnis&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uid, 121, null),
buildDropdownEntryPrintArray("zeugnis_en", "Zeugnis Englisch", "xml=zeugnis.rdf.php&xsl=ZeugnisEng&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uid, 122, null),
];
Events::trigger('DocumentGenerationDropDown',
// passing $menu per reference
function & () use (&$documents) {
return $documents;
},
$prestudent_id,
$studiensemester_kurzbz,
$studiengang_kz
);
$extraEntries = $this->loadDropDownEntriesBakkOrDipl($stgTyp, $uid);
$documents = array_merge($documents, $extraEntries);
usort($documents, function ($a, $b) {
$orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX;
$orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX;
return $orderA <=> $orderB;
});
$this->terminateWithSuccess($documents);
//return $documents || null;
}
public function getDocumentDropDownMulti($studiensemester_kurzbz,$studiengang_kz)
{
//permission to create also odt, and doc outputs of certain documents (menu abschlusspruefung)
$hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's');
$studentUids = $this->input->get('studentUids');
$prestudentIds = [];
if (is_array($studentUids) && !empty($studentUids)) {
foreach ($studentUids as $uid) {
$prestudent_id = $this-> _loadPrestudentFromUid($uid);
$prestudentIds[] = $prestudent_id;
}
}
else
{
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Array StudentUIDs']), self::ERROR_TYPE_GENERAL);
}
if (!$studiensemester_kurzbz)
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL);
if(!$studiengang_kz)
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
$uidString = implode(";", $studentUids);
$prestudentIdsString = implode(";", $prestudentIds);
$semArray = $this->_getEntriesStudiensemester();
$stgTyp = $this->_getStudiengangstyp($studiengang_kz);
$documents = [
buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uidString, 10, null),
buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uidString, 20, null),
buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Englisch", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uidString, 21, null),
buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uidString, 50, null),
buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uidString, 51, null),
buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uidString", $uidString,200, "zutrittskarte.php"),
buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uidString, 60, null),
buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uidString, 61, null),
// Studienerfolg Menüs automatisch
$this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz),
$this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz),
$this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz, true),
$this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz, true),
[
"id" => "submenu_studstatus",
"type" => "submenu",
"name" => "Verwaltung des StudierendenStatus",
"order" => 110,
"data" => [
buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
]
],
buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uidString, 35, null),
buildDropdownEntryPrintArray("zeugnis", "Zeugnis", "xml=zeugnis.rdf.php&xsl=Zeugnis&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uidString, 121, null),
buildDropdownEntryPrintArray("zeugnis_en", "Zeugnis Englisch", "xml=zeugnis.rdf.php&xsl=ZeugnisEng&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uidString, 122, null),
];
Events::trigger('DocumentGenerationDropDownMulti',
// passing $menu per reference
function & () use (&$documents) {
return $documents;
},
$studentUids,
$studiensemester_kurzbz,
$studiengang_kz
);
$extraEntries = $this->loadDropDownEntriesBakkOrDipl($stgTyp, $uidString);
$documents = array_merge($documents, $extraEntries);
usort($documents, function ($a, $b) {
$orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX;
$orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX;
return $orderA <=> $orderB;
});
$this->terminateWithSuccess($documents);
return $documents || null;
}
private function _loadUIDFromPrestudent($prestudent_id)
{
if(!$prestudent_id){
return $this->terminateWithError("no prestudent ID received.");
}
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(
['prestudent_id' => $prestudent_id]
);
$data = $this->getDataOrTerminateWithError($result);
$student = current($data);
return $student->student_uid;
}
private function _loadPrestudentFromUid($studentUid)
{
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(
['student_uid' => $studentUid]
);
$data = $this->getDataOrTerminateWithError($result);
$student = current($data);
return $student->prestudent_id;
}
/**
* is building an array with studiensemesterkurzb
* actual studiensemester plus the 5 studiensemester in the past
* @return Array Studiensemester_kurzbz
*/
private function _getEntriesStudiensemester(){
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addPlusMinus(1, 5);
$this->StudiensemesterModel->addOrder('ende', 'DESC');
$result = $this->StudiensemesterModel->load();
$data = $this->getDataOrTerminateWithError($result);
foreach($data as $sem)
{
$semArray[] = $sem->studiensemester_kurzbz;
}
array_shift($semArray);
return $semArray;
}
/**
* is returning the typ of Studiengang (Bakk oder Master)
* @return character eg. 'b' or 'm'
*/
private function _getStudiengangstyp($studiengang_kz)
{
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->loadWhere(
array('studiengang_kz' => $studiengang_kz)
);
$data = $this->getDataOrTerminateWithError($result);
$typStudiengang = current($data)->typ;
return $typStudiengang;
}
/**
* helper function to create ArrayStructure
* actual studiensemester plus the 5 studiensemester in the past
* @return Array Studiensemester_kurzbz
*/
private function buildStudienerfolgSubmenu($lang, $uid, $semArray, $studiensemester_kurzbz, $fa = false)
{
$entries = [];
$xsl = $lang === "de" ? "Studienerfolg" : "StudienerfolgEng";
$idPrefix = "submenu_studienerfolg_" . $lang . ($fa ? "_fa" : "");
$entries[] = buildDropdownEntryPrintArray(
$idPrefix . "_aktuell",
"ausgewähltes Semester",
"xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz" . ($fa ? "&typ=finanzamt" : ""),
$uid
);
//all semester
$entries[] = buildDropdownEntryPrintArray(
$idPrefix . "_all",
"alle Semester",
"xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz&all=true" . ($fa ? "&typ=finanzamt" : ""),
$uid
);
//sem from array
foreach ($semArray as $i => $sem) {
$entries[] = buildDropdownEntryPrintArray(
$idPrefix . ($i === 0 ? "_akt" : "_minus" . $i),
$sem,
"xml=studienerfolg.rdf.php&xsl=$xsl&ss=$sem" . ($fa ? "&typ=finanzamt" : ""),
$uid
);
}
$order = 0;
if ($lang === "de" && !$fa) $order = 75; // Studienerfolg
if ($lang === "en" && !$fa) $order = 76; // Studienerfolg Englisch
if ($lang === "de" && $fa) $order = 77; // Studienerfolg Finanzamt
if ($lang === "en" && $fa) $order = 78; // Studienerfolg Finanzamt Englisch
return [
"id" => $idPrefix,
"type" => "submenu",
"name" => "Studienerfolg " . ($fa ? " Finanzamt" : "") . ($lang === "de" ? "" : "Englisch") ,
"order" => $order,
"data" => $entries,
];
}
private function loadDropDownEntriesFinalExam($hasPermissionOutputformat, $stgTyp, $uid)
{
if ($stgTyp == 'b')
$postfix = 'Bakk';
else if ($stgTyp == 'm' || $stgTyp == 'd')
$postfix = 'Master';
else
return [];
$arrayFinalExam = [
'pruefungsprotokoll' => [
'de' => [
'Bakk' => 'PrProtBA',
'Master' => 'PrProtMA',
],
'en' => [
'Bakk' => 'PrProtBAEng',
'Master' => 'PrProtMAEng',
],
],
'pruefungszeugnis' => [
'de' => [
'Bakk' => 'Bakkzeugnis',
'Master' => 'Diplomzeugnis',
],
'en' => [
'Bakk' => 'BakkzeugnisEng',
'Master' => 'DiplomzeugnisEng',
],
],
'urkunde' => [
'de' => [
'Bakk' => 'Bakkurkunde',
'Master' => 'Diplomurkunde',
],
'en' => [
'Bakk' => 'BakkurkundeEng',
'Master' => 'DiplomurkundeEng',
],
],
];
$langLabels = [
"de" => "Deutsch",
"en" => "Englisch"
];
$docLabels = [
"pruefungsprotokoll" => "Prüfungsprotokoll",
"pruefungszeugnis" => "Zeugnis",
"urkunde" => "Urkunde"
];
$submenuData = [];
if ($hasPermissionOutputformat) {
foreach ($arrayFinalExam as $docType => $langs) {
foreach ($langs as $lang => $types) {
$xsl = $types[$postfix];
$idPrefix = $docType . "_" . $lang;
$baseName = $docLabels[$docType] . " " . $langLabels[$lang];
$baseUrl = "xml=abschlusspruefung.rdf.php&xsl={$xsl}";
//3 outputformates
foreach (["pdf", "odt", "docx"] as $format) {
$submenuData[] = buildDropdownEntryPrintArray(
$idPrefix . "_" . $format,
$baseName . " (" . strtoupper($format) . ")",
$baseUrl . "&output=" . $format,
$uid
);
}
}
}
}
else
{
foreach ($arrayFinalExam as $docType => $langs) {
foreach ($langs as $lang => $types) {
$xsl = $types[$postfix]; // Auswahl Bakk/Master für jeweilige Sprache
$id = $docType . "_" . $lang;
$name = $docLabels[$docType] . " " . $langLabels[$lang];
$url = "xml=abschlusspruefung.rdf.php&xsl=" . $xsl . "&output=pdf";
$submenuData[] = buildDropdownEntryPrintArray($id, $name, $url, $uid);
}
}
}
return [
"id" => "submenu_finalexam",
"type" => "submenu",
"name" => "Abschlussprüfung",
"data" => $submenuData,
"order" => null,
"order" => 80,
];
}
private function loadDropDownEntriesBakkOrDipl($stgTyp, $uid)
{
$entries = [];
if ($stgTyp == 'b')
{
$entries[] = buildDropdownEntryPrintArray("bakkurkunde", "Bakkurkunde", "xml=abschlusspruefung.rdf.php&xsl=Bakkurkunde&output=pdf", $uid, 22, null);
$entries[] = buildDropdownEntryPrintArray("bakkurkundeEng", "Bakkurkunde Englisch", "xml=abschlusspruefung.rdf.php&xsl=BakkurkundeEng&output=pdf", $uid, 23, null);
}
if ($stgTyp == 'm' || $stgTyp == 'd')
{
$entries[] = buildDropdownEntryPrintArray("diplomurkunde", "Diplomurkunde", "xml=abschlusspruefung.rdf.php&xsl=Diplomurkunde&output=pdf", $uid, 27, null);
$entries[] = buildDropdownEntryPrintArray("diplomurkundeEng", "Diplomurkunde Englisch", "xml=abschlusspruefung.rdf.php&xsl=DiplomurkundeEng&output=pdf", $uid, 28, null);
}
return $entries;
}
}
@@ -83,7 +83,7 @@ class GemeinsameStudien extends FHCAPI_Controller
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
$this->StudiensemesterModel->addOrder('start', 'DESC');
$result = $this->StudiensemesterModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
@@ -60,7 +60,8 @@ class Grades extends FHCAPI_Controller
{
$this->load->model('codex/Note_model', 'NoteModel');
$this->NoteModel->addOrder('note');
$this->NoteModel->addOrder('notenwert', 'ASC');
$this->NoteModel->addOrder('bezeichnung', 'ASC');
$result = $this->NoteModel->load();
@@ -9,6 +9,8 @@ class Gruppen extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'search' => ['admin:r', 'assistenz:r'],
'getGruppen' => ['admin:r', 'assistenz:r'],
'deleteGruppe' => ['admin:rw', 'assistenz:rw'],
]);
@@ -18,7 +20,9 @@ class Gruppen extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'gruppenmanagement'
'ui',
'gruppenmanagement',
'lehre'
]);
// Load models
@@ -26,15 +30,141 @@ class Gruppen extends FHCAPI_Controller
$this->load->model('organisation/Gruppe_model', 'GruppeModel');
}
public function add()
{
$this->load->library("form_validation");
$this->form_validation->set_rules(
'gruppe_kurzbz',
$this->p->t('gruppenmanagement', 'gruppe'),
'required|is_in_db[organisation/Gruppe_model]',
[
'required' => $this->p->t('ui', 'error_fieldRequired'),
'is_in_db' => $this->p->t('ui', 'error_fieldNotFound')
]
);
$this->form_validation->set_rules(
'uid',
$this->p->t('ui', 'student_uid'),
'required|is_in_db[crm/Student_model:student_uid]',
[
'required' => $this->p->t('ui', 'error_fieldRequired'),
'is_in_db' => $this->p->t('ui', 'error_fieldNotFound')
]
);
$this->form_validation->set_rules(
'studiensemester_kurzbz',
$this->p->t('lehre', 'studiensemester'),
'required|is_in_db[organisation/Studiensemester_model]',
[
'required' => $this->p->t('ui', 'error_fieldRequired'),
'is_in_db' => $this->p->t('ui', 'error_fieldNotFound')
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
$uid = $this->input->post('uid');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$result = $this->BenutzergruppeModel->load([
$gruppe_kurzbz,
$uid
]);
$benutzergruppe = $this->getDataOrTerminateWithError($result);
if ($benutzergruppe) {
$this->terminateWithError(
$this->p->t('gruppenmanagement', 'error_alreadyInGroup', [
'uid' => $uid,
'studiensemester_kurzbz' => current($benutzergruppe)->studiensemester_kurzbz
]),
self::ERROR_TYPE_GENERAL
);
}
$result = $this->BenutzergruppeModel->insert([
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'insertamum' => date('c'),
'insertvon' => getAuthUID()
]);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess();
}
public function search()
{
$query = $this->input->post('query');
if (!$query)
$this->terminateWithSuccess([]);
// add query to where clause
$query = strtoupper($query);
$query = $this->GruppeModel->db->escape_like_str($query);
$query = '%' . str_replace(' ', '%', $query) . '%';
$this->GruppeModel->db->group_start();
$this->GruppeModel->db->or_like('UPPER(gruppe_kurzbz)', $query, 'none', false);
$this->GruppeModel->db->or_like('UPPER(bezeichnung)', $query, 'none', false);
$this->GruppeModel->db->or_like('UPPER(beschreibung)', $query, 'none', false);
$this->GruppeModel->db->group_end();
// add stg sorting 1
$studiengang_kz = $this->input->post('studiengang_kz');
$sort_stg = $studiengang_kz ? "WHEN studiengang_kz = " . $this->GruppeModel->escape($studiengang_kz) . " THEN 0" : "";
// add stg sorting 2
$studiengang_kzs = [];
$result = $this->permissionlib->getSTG_isEntitledFor('admin');
if ($result)
$studiengang_kzs = array_merge($studiengang_kzs, $result);
$result = $this->permissionlib->getSTG_isEntitledFor('assistenz');
if ($result)
$studiengang_kzs = array_merge($studiengang_kzs, $result);
// selects
$this->GruppeModel->addSelect("*");
$this->GruppeModel->addSelect("CASE
" . $sort_stg . "
WHEN studiengang_kz IN (" . implode(",", $this->GruppeModel->db->escape($studiengang_kzs)) . ")
THEN 1
ELSE 2
END AS sort_stg");
// ordering
$this->GruppeModel->addOrder("sort_stg");
$this->GruppeModel->addOrder("sort");
$this->GruppeModel->addOrder("gruppe_kurzbz");
// default where clause & execute
$result = $this->GruppeModel->loadWhere([
'lehre' => true,
'sichtbar' => true,
'aktiv' => true,
'direktinskription' => false,
'generiert' => false
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getGruppen($student_uid)
{
$this->BenutzergruppeModel ->addSelect('gruppe_kurzbz');
$this->BenutzergruppeModel ->addSelect('bezeichnung');
$this->BenutzergruppeModel ->addSelect('generiert');
$this->BenutzergruppeModel ->addSelect('uid');
$this->BenutzergruppeModel ->addSelect('studiensemester_kurzbz');
$this->BenutzergruppeModel ->addJoin('public.tbl_gruppe', 'gruppe_kurzbz');
$this->BenutzergruppeModel-> addOrder('bezeichnung', 'ASC');
$this->BenutzergruppeModel->addSelect('gruppe_kurzbz');
$this->BenutzergruppeModel->addSelect('bezeichnung');
$this->BenutzergruppeModel->addSelect('generiert');
$this->BenutzergruppeModel->addSelect('uid');
$this->BenutzergruppeModel->addSelect('studiensemester_kurzbz');
$this->BenutzergruppeModel->addJoin('public.tbl_gruppe', 'gruppe_kurzbz');
$this->BenutzergruppeModel->addOrder('bezeichnung', 'ASC');
$result = $this->BenutzergruppeModel->loadWhere(
array(
@@ -49,29 +179,48 @@ class Gruppen extends FHCAPI_Controller
public function deleteGruppe()
{
$student_uid = $this->input->post('id');
$this->load->library("form_validation");
$this->form_validation->set_rules(
'uid',
$this->p->t('person', 'UID'),
'required',
[
'required' => $this->p->t('ui', 'error_fieldRequired')
]
);
$this->form_validation->set_rules(
'gruppe_kurzbz',
$this->p->t('gruppenmanagement', 'gruppe'),
'required',
[
'required' => $this->p->t('ui', 'error_fieldRequired')
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$uid = $this->input->post('uid');
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
//Validate if automatic group generation
$result = $this->GruppeModel-> loadWhere(
array(
'gruppe_kurzbz' => $gruppe_kurzbz
)
);
// Validate if automatic group generation
$result = $this->GruppeModel->loadWhere([
'gruppe_kurzbz' => $gruppe_kurzbz
]);
$data = $this->getDataOrTerminateWithError($result);
$generation = current($data);
if($generation->generiert)
if ($generation->generiert)
{
$this->terminateWithError($this->p->t('gruppenmanagement', 'error_deleteGeneratedGroups'), self::ERROR_TYPE_GENERAL);
}
$result = $this->BenutzergruppeModel->delete(
array(
'gruppe_kurzbz' => $gruppe_kurzbz,
'uid' => $student_uid
)
);
$result = $this->BenutzergruppeModel->delete([
'gruppe_kurzbz' => $gruppe_kurzbz,
'uid' => $uid
]);
$data = $this->getDataOrTerminateWithError($result);
@@ -52,6 +52,7 @@ class Kontakt extends FHCAPI_Controller
// Extra Permissionchecks
$permsMa = [];
$permsStud = [];
$permsDefault = null;
switch ($this->router->method) {
case 'getBankverbindung':
case 'loadBankverbindung':
@@ -68,7 +69,7 @@ class Kontakt extends FHCAPI_Controller
case 'getKontakte':
case 'loadAddress':
case 'loadContact':
$permsMa = $permsStud = ['admin:r', 'assistenz:r'];
$permsMa = $permsStud = $permsDefault = ['admin:r', 'assistenz:r'];
break;
case 'addNewAddress':
case 'addNewContact':
@@ -76,7 +77,7 @@ class Kontakt extends FHCAPI_Controller
case 'updateContact':
case 'deleteAddress':
case 'deleteContact':
$permsMa = $permsStud = ['admin:rw', 'assistenz:rw'];
$permsMa = $permsStud = $permsDefault = ['admin:rw', 'assistenz:rw'];
break;
}
if ($this->router->method == 'getAdressen'
@@ -91,7 +92,7 @@ class Kontakt extends FHCAPI_Controller
if (is_null($person_id) || !ctype_digit((string)$person_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermissionsForPerson($person_id, $permsMa, $permsStud);
$this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault);
} elseif ($this->router->method == 'loadAddress'
|| $this->router->method == 'loadContact'
|| $this->router->method == 'loadBankverbindung'
@@ -135,7 +136,7 @@ class Kontakt extends FHCAPI_Controller
$person_id = current($data)->person_id;
$this->checkPermissionsForPerson($person_id, $permsMa, $permsStud);
$this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault);
}
}
public function getAdressen($person_id)
@@ -352,7 +352,7 @@ class Konto extends FHCAPI_Controller
continue;
}
$result = $this->KontoModel->insert([
'person_id' => $buchung['person_id'],
'studiengang_kz' => $buchung['studiengang_kz'],
@@ -361,7 +361,7 @@ class Konto extends FHCAPI_Controller
'buchungstyp_kurzbz' => $buchung['buchungstyp_kurzbz'],
'credit_points' => $buchung['credit_points'],
'zahlungsreferenz' => $buchung['zahlungsreferenz'],
'betrag' => $betrag,
'betrag' => number_format($betrag, 2, '.', ''),
'buchungsdatum' => $buchungsdatum,
'mahnspanne' => '0',
'buchungsnr_verweis' => $buchung['buchungsnr'],
@@ -0,0 +1,63 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Lehrverband extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'hasOrgforms' => ['admin:r', 'assistenz:r'],
'getTree' => ['admin:r', 'assistenz:r'],
'getSpecialgroups' => ['admin:r', 'assistenz:r']
]);
}
public function hasOrgforms($studiengang_kz)
{
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->load($studiengang_kz);
$data = $this->getDataOrTerminateWithError($result);
if ($data) {
$data = current($data)->mischform;
}
$this->terminateWithSuccess($data);
}
public function getTree($studiengang_kz)
{
$this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
$result = $this->LehrverbandModel->loadWhere([
'studiengang_kz' => $studiengang_kz,
'aktiv' => true
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getSpecialgroups($studiengang_kz)
{
$this->load->model('organisation/Gruppe_model', 'GruppeModel');
$where = [
'studiengang_kz' => $studiengang_kz,
'lehre' => true,
'sichtbar' => true,
'aktiv' => true,
'direktinskription' => false
];
$result = $this->GruppeModel->loadWhere($where);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,413 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Projektarbeit extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getProjektarbeit' => ['admin:r', 'assistenz:r'],
'loadProjektarbeit' => ['admin:r', 'assistenz:r'],
'insertProjektarbeit' => ['admin:rw', 'assistenz:rw'],
'updateProjektarbeit' => ['admin:rw', 'assistenz:rw'],
'deleteProjektarbeit' => ['admin:rw', 'assistenz:rw'],
'getTypenProjektarbeit' => ['admin:r', 'assistenz:r'],
'getFirmen' => ['admin:r', 'assistenz:r'],
'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'],
'getNoten' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r']
]);
// Load Libraries
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'person',
'projektarbeit'
]);
// Load models
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$this->load->model('education/Projekttyp_model', 'ProjekttypModel');
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->load->model('ressource/Firma_model', 'FirmaModel');
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('education/Note_model', 'NoteModel');
$this->load->model('education/Projektbetreuer_model', 'BetreuerModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// load libraries
$this->load->library('PermissionLib');
}
/**
* Get projekt works for a uid.
*/
public function getProjektarbeit()
{
$student_uid = $this->input->get('uid');
if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
$result = $this->ProjektarbeitModel->getProjektarbeit($student_uid);
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result)) $this->terminateWithSuccess([]);
$projektarbeiten = getData($result);
foreach ($projektarbeiten as $projektarbeit)
{
$projektarbeit_id = $projektarbeit->projektarbeit_id;
$abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL);
if (hasData($abgabeRes))
{
$paabgabe = getData($abgabeRes)[0];
$projektarbeit->abgabedatum = $paabgabe->abgabedatum;
}
}
$this->terminateWithSuccess($projektarbeiten);
}
/**
* Load a single Projektarbeit by id.
*/
public function loadProjektarbeit()
{
$projektarbeit_id = $this->input->get('projektarbeit_id');
if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) return $this->terminateWithError('Projektarbeit Id missing', self::ERROR_TYPE_GENERAL);
$this->ProjektarbeitModel->addSelect(
'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
);
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
$this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
$result = $this->ProjektarbeitModel->loadWhere(
array('projektarbeit_id' => $projektarbeit_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
/**
* Inwert a Projektarbeit.
*/
public function insertProjektarbeit()
{
$student_uid = $this->input->post('uid');
if (!$student_uid) return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
if (!$this->_hasBerechtigungForStudent($student_uid))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
$formData = $this->input->post('formData');
if ($this->_validate($formData) == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$projektarbeit = $this->_getProjektarbeitArr($formData);
$result = $this->ProjektarbeitModel->insert(
array_merge($projektarbeit, ['insertamum' => date('c'), 'insertvon' => getAuthUID(), 'student_uid' => $student_uid])
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* Update a Projektarbeit by ID.
*/
public function updateProjektarbeit()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
if (!$projektarbeit_id || !is_numeric($projektarbeit_id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
$formData = $this->input->post('formData');
if ($this->_validate($formData) == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$projektarbeit = $this->_getProjektarbeitArr($formData);
$result = $this->ProjektarbeitModel->update(
$projektarbeit_id,
array_merge($projektarbeit, ['updateamum' => date('c'), 'updatevon' => getAuthUID()])
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* Delete Projektarbeit by ID after validation.
*/
public function deleteProjektarbeit()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID'], self::ERROR_TYPE_GENERAL));
if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
$validate = $this->_validateDelete($projektarbeit_id);
if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL);
$result = $this->ProjektarbeitModel->delete(
['projektarbeit_id' => $projektarbeit_id]
);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result))
{
$this->outputJson($result);
}
return $this->terminateWithSuccess(current(getData($result)) ? : null);
}
/**
* Get all active projekt work types.
*/
public function getTypenProjektarbeit()
{
$result = $this->ProjekttypModel->loadWhere(['aktiv' => true]);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Gets companies by search string.
*/
public function getFirmen()
{
$searchString = $this->input->get('searchString');
if (!isset($searchString))
$this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL);
$result = $this->FirmaModel->searchFirmen($searchString, $aktiv = true);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Get Lehrveranstaltungen by params, incling lehreinheiten for a specific Studiensemester..
*/
public function getLehrveranstaltungen()
{
$student_uid = $this->input->get('student_uid');
$studiengang_kz = $this->input->get('studiengang_kz');
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
$additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id');
if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL);
// get Lvs
$lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id);
if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
$lvs = hasData($lvsResult) ? getData($lvsResult) : [];
foreach ($lvs as $lv)
{
// add Lehreinheiten for each Lv for the semester
$lehreinheiten = $this->LehreinheitModel->getLesForLv(
$lv->lehrveranstaltung_id, $studiensemester_kurzbz
);
foreach ($lehreinheiten as $lehreinheit)
{
if (!isEmptyArray($lehreinheit->lektoren))
{
$this->MitarbeiterModel->addSelect('kurzbz');
$this->MitarbeiterModel->db->where_in('tbl_mitarbeiter.mitarbeiter_uid', $lehreinheit->lektoren);
$maResult = $this->MitarbeiterModel->load();
if (isError($maResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
$lehreinheit->lektoren = array_column(getData($maResult), 'kurzbz');
}
}
$lv->lehreinheiten = $lehreinheiten;
}
return $this->terminateWithSuccess($lvs);
}
/**
* Get all noten.
*/
public function getNoten()
{
$this->NoteModel->addOrder('notenwert', 'ASC');
$this->NoteModel->addOrder('bezeichnung', 'ASC');
$result = $this->NoteModel->load();
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Get all Studiensemester, sorted.
*/
public function getStudiensemester()
{
$this->StudiensemesterModel->addOrder('start', 'DESC');
$result = $this->StudiensemesterModel->load();
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Validate Projektarbeit data.
* @param formData
* @return bool true if data valid
*/
private function _validate($formData)
{
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
]);
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']),
'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
]);
$this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn'])
]);
$this->form_validation->set_rules('ende', 'Ende', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Ende'])
]);
$this->form_validation->set_rules('gesperrtbis', 'Ende', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Gesperrt bis'])
]);
return $this->form_validation->run();
}
/**
* Extract Projektarbeit data from passed form data.
* @param formData
* @return array
*/
private function _getProjektarbeitArr($formData)
{
return [
'titel' => $formData['titel'],
'titel_english' => $formData['titel_english'] ?? null,
'themenbereich' => $formData['themenbereich'] ?? null,
'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'],
'firma_id' => $formData['firma_id'] ?? null,
'lehreinheit_id' => $formData['lehreinheit_id'],
'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null,
'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null,
'note' => $formData['note'] ?? null,
'final' => $formData['final'] ?? null,
'freigegeben' => $formData['freigegeben'] ?? null,
'anmerkung' => $formData['anmerkung'] ?? null,
'gesperrtbis' => isset($formData['gesperrtbis']) && !isEmptyString($formData['gesperrtbis']) ? $formData['gesperrtbis'] : null
];
}
/**
* Check if deletion of a Projektarbeit is possible.
* @param $projektarbeit_id
* @return object success if deletion possible, error otherwise.
*/
private function _validateDelete($projektarbeit_id)
{
$this->BetreuerModel->addSelect('1');
$result = $this->BetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
if (isError($result)) return $result;
if (hasData($result)) return error($this->p->t('projektarbeit', 'error_betreuerNichtGeloescht'));
$this->PaabgabeModel->addSelect('1');
$result = $this->PaabgabeModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
if (isError($result)) return $result;
if (hasData($result)) return error($this->p->t('projektarbeit', 'error_paabgabeNichtGeloescht'));
return success();
}
/**
* Checks permissions for a student.
* @param $student_uid
* @return bool true if authorized
*/
private function _hasBerechtigungForStudent($student_uid)
{
if (!$student_uid)
return false;
$this->load->model('crm/Student_model', 'StudentModel');
$this->StudentModel->addSelect('studiengang_kz');
$result = $this->StudentModel->load([$student_uid]);
if (isError($result) || !hasData($result))
return false;
$studiengang_kz = getData($result)[0]->studiengang_kz;
if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz))
return true;
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
return true;
return false;
}
}
@@ -0,0 +1,435 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
use \CI3_Events as Events;
class Projektbetreuer extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getProjektbetreuer' => ['admin:r', 'assistenz:r'],
'saveProjektbetreuer' => ['admin:rw', 'assistenz:rw'],
'deleteProjektbetreuer' => ['admin:rw', 'assistenz:rw'],
'getBetreuerarten' => ['admin:r', 'assistenz:r'],
'getNoten' => ['admin:r', 'assistenz:r'],
'getDefaultStundensaetze' => ['admin:r', 'assistenz:r'],
'getProjektbetreuerBySearchQuery' => ['admin:r', 'assistenz:r'],
'getPerson' => ['admin:r', 'assistenz:r'],
'validateProjektbetreuer' => ['admin:r', 'assistenz:r']
]);
// Load Libraries
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'person',
'projektarbeit'
]);
// Load models
$this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
$this->load->model('education/Betreuerart_model', 'BetreuerartModel');
$this->load->model('ressource/Stundensatz_model', 'StundensatzModel');
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$this->load->model('education/Note_model', 'NoteModel');
$this->load->model('person/Person_model', 'PersonModel');
// load libraries
$this->load->library('PermissionLib');
}
/**
* Gets Projektbetreuer data for a Projektarbeit.
*/
public function getProjektbetreuer()
{
$projektarbeit_id = $this->input->get('projektarbeit_id');
if (!isset($projektarbeit_id))
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
$qry = "
SELECT * FROM (
SELECT
projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden,
stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost,
CASE
WHEN EXISTS
(SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id)
THEN 'Mitarbeiter'
WHEN EXISTS
(SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id)
THEN 'Student'
ELSE 'Person'
END AS status
FROM
lehre.tbl_projektbetreuer
JOIN public.tbl_person pers USING (person_id)
WHERE
projektarbeit_id = ?
) betreuer
ORDER BY
CASE WHEN status = 'Mitarbeiter' THEN 0 WHEN status = 'Person' THEN 1 ELSE 2 END";
$result = $this->ProjektbetreuerModel->execReadOnlyQuery($qry, [$projektarbeit_id]);
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result)) $this->terminateWithSuccess([]);
$projektbetreuer = getData($result);
//~ foreach ($projektbetreuer as $projektarbeit)
//~ {
//~ $projektarbeit_id = $projektarbeit->projektarbeit_id;
//~ $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
//~ if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL);
//~ if (hasData($abgabeRes))
//~ {
//~ $paabgabe = getData($abgabeRes)[0];
//~ $projektarbeit->abgabedatum = $paabgabe->abgabedatum;
//~ }
//~ }
// add thesis download link (from external extension)
foreach ($projektbetreuer as $pb)
{
$downloadLink = null;
Events::trigger(
'projektbeurteilung_download_link',
$pb->projektarbeit_id,
$pb->betreuerart_kurzbz,
$pb->person_id,
function ($value) use (&$downloadLink) {
$downloadLink = $value;
}
);
$pb->beurteilungDownloadLink = $downloadLink;
}
$this->terminateWithSuccess($this->_addFullNameToBetreuer($projektbetreuer));
}
/**
* Saves (adds or updates) a single Projektbetreuer for a Projektarbeit.
*/
public function saveProjektbetreuer()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
$projektbetreuer = $this->input->post('projektbetreuer');
if ($this->_validate($projektbetreuer) == false) $this->terminateWithValidationErrors($this->form_validation->error_array());
// check if assessor has already been assigned
if (isset($projektbetreuer['person_id']))
{
$this->ProjektbetreuerModel->addSelect('1');
$betreuerRes = $this->ProjektbetreuerModel->loadWhere(
[
'person_id' => $projektbetreuer['person_id'],
'projektarbeit_id' => $projektbetreuer['projektarbeit_id'],
'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
]
);
if (hasData($betreuerRes)
&& (!isset($projektbetreuer['person_id_old']) || $projektbetreuer['person_id'] != $projektbetreuer['person_id_old'])) {
return $this->terminateWithError($this->p->t('projektarbeit', 'betreuerZugewiesen'), self::ERROR_TYPE_GENERAL);
}
}
$result = null;
$stunden = isset($projektbetreuer['stunden']) && !isEmptyString($projektbetreuer['stunden']) ? $projektbetreuer['stunden'] : null;
$stundensatz =
isset($projektbetreuer['stundensatz']) && !isEmptyString($projektbetreuer['stundensatz']) ? $projektbetreuer['stundensatz'] : null;
$betreuer = [
'projektarbeit_id' => $projektarbeit_id,
'person_id' => $projektbetreuer['person_id'],
'note' => $projektbetreuer['note'],
'stunden' => $stunden,
'stundensatz' => $stundensatz,
'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
];
if (isset($projektbetreuer['person_id_old']) && isset($projektbetreuer['betreuerart_kurzbz_old']))
{
$result = $this->ProjektbetreuerModel->update(
[
'projektarbeit_id' => $projektarbeit_id,
'person_id' => $projektbetreuer['person_id_old'],
'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz_old']
],
array_merge($betreuer, ['updateamum' => date('c'), 'updatevon' => getAuthUID()])
);
}
else
{
$result = $this->ProjektbetreuerModel->insert(
array_merge($betreuer, ['insertamum' => date('c'), 'insertvon' => getAuthUID()])
);
}
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Delete a Projektbetreuer assignment to a Projektarbeit.
*/
public function deleteProjektbetreuer()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
$person_id = $this->input->post('person_id');
$betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz');
if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
{
return $this->terminateWithError(
$this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL)
);
}
if (!isset($person_id) || !is_numeric($person_id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID'], self::ERROR_TYPE_GENERAL));
if (!isset($betreuerart_kurzbz))
{
return $this->terminateWithError(
$this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL)
);
}
// check permission
if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
$validate = $this->_validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz);
if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL);
// check if there is a Projektarbeitsbeurteilung - if yes, it is handled (possibly deleted) by external extension.
$beurteilungDeleteSuccess = true;
Events::trigger(
'projektarbeitsbeurteilung_delete',
$projektarbeit_id,
function ($value) use (&$beurteilungDeleteSuccess) {
$beurteilungDeleteSuccess = $value;
}
);
// if there is still a Beurteilung, Projektarbeit cannot be deleted - return with error
if (!$beurteilungDeleteSuccess) return $this->terminateWithError($this->p->t('projektarbeit', 'error_paarbeitHatBeurteilung'));
$result = $this->ProjektbetreuerModel->delete(
['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz]
);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result))
{
$this->outputJson($result);
}
return $this->terminateWithSuccess(getData($result));
}
/**
* Get all active Betreuerarten.
*/
public function getBetreuerarten()
{
$result = $this->BetreuerartModel->loadWhere(['aktiv' => true]);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Get all Noten.
*/
public function getNoten()
{
$result = $this->NoteModel->load();
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Get default Stundensätze for an employee in a semester.
*/
public function getDefaultStundensaetze()
{
$person_id = $this->input->get('person_id');
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
$result = $this->StundensatzModel->getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz);
return $this->terminateWithSuccess($result);
}
/**
* Get all Projektbetreuer by search string.
*/
public function getProjektbetreuerBySearchQuery()
{
$searchString = $this->input->get('searchString');
if (!isset($searchString))
$this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL);
$result = $this->PersonModel->searchPerson($searchString);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result)) $this->terminateWithSuccess([]);
$persons = $this->_addFullNameToBetreuer(getData($result));
// sort persons by type (employees first)
usort($persons, function ($a, $b) {
$statusRanks = ['Mitarbeiter' => 0, 'Person' => 1, 'Student' => 2];
return (isset($statusRanks[$a->status]) ? $statusRanks[$a->status] : count($statusRanks) + 1)
- (isset($statusRanks[$b->status]) ? $statusRanks[$b->status] : count($statusRanks) + 1);
});
return $this->terminateWithSuccess($persons);
}
/**
* Get person info by Id.
*/
public function getPerson()
{
$person_id = $this->input->get('person_id');
if (!isset($person_id))
$this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Person']), self::ERROR_TYPE_GENERAL);
$this->PersonModel->addSelect("CASE
WHEN EXISTS
(SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id)
THEN 'Mitarbeiter'
WHEN EXISTS
(SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id)
THEN 'Student'
ELSE 'Person'
END AS status");
$result = $this->PersonModel->addSelect('titelpre, titelpost, vorname, nachname, person_id');
$result = $this->PersonModel->load($person_id);
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result))[0] : []);
}
/**
* Validate list of Projektbetreuer.
*/
public function validateProjektbetreuer()
{
$projektbetreuerArr = $this->input->post('projektbetreuer');
if (!is_array($projektbetreuerArr)) $projektbetreuerArr = [$projektbetreuerArr];
foreach ($projektbetreuerArr as $pb)
{
if ($this->_validate($pb) == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
}
$this->terminateWithSuccess([]);
}
/**
* Validation funciton for checking Projektbetreuer input.
* @param $formData Betreuer data
* @return bool true when data is valid
*/
private function _validate($formData)
{
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('betreuerart_kurzbz', 'Betreuerart', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuerart')])
]);
$this->form_validation->set_rules('person_id', 'Person', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuer')])
]);
$this->form_validation->set_rules('stunden', 'Stunden', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stunden')])
]);
$this->form_validation->set_rules('stundensatz', 'Stundensatz', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stundensatz')])
]);
return $this->form_validation->run();
}
/**
* Check possibility of deletion of a Projektbetreuer.
* @param projektarbeit_id
* @param person_id
* @param betreuerart_kurzbz
* @return object success when delete possible, error otherwise
*/
private function _validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz)
{
// check if contract exists
$this->ProjektbetreuerModel->addSelect('vertrag_id');
$result = $this->ProjektbetreuerModel->loadWhere(
['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz]
);
if (isError($result)) return $result;
// if contract exists, no deletion is possible
if (hasData($result) && getData($result)[0]->vertrag_id != null) return error($this->p->t('projektarbeit', 'error_betreuerHatVertrag'));
return success();
}
/**
* Add full name to array with Betreuer.
* @param $betreuerArr
* @return array including Betreuer with their full names
*/
private function _addFullNameToBetreuer($betreuerArr)
{
foreach ($betreuerArr as $betreuer)
{
$betreuer->name = ($betreuer->titelpre ? $betreuer->titelpre . ' ' : '') .
$betreuer->nachname . ' ' . $betreuer->vorname . ($betreuer->titelpost ? ' ' . $betreuer->titelpre : '').
' (' . $betreuer->status . ')';
}
return $betreuerArr;
}
}
@@ -18,6 +18,8 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about addresses
@@ -111,7 +113,7 @@ class Pruefung extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'global', 'ui','lehre'
'global', 'ui', 'lehre', 'exam'
]);
}
@@ -172,174 +174,11 @@ class Pruefung extends FHCAPI_Controller
*
* @param lehrveranstaltung_id, student_uid, lehreinheit_id
*
* @return values on success
* retval 0: pruefung inserted
* reval 1: pruefung and zeugnisnote inserted
* retval 2: pruefung inserted, no insert Zeugnisnote
* (change after date of examination)
* retval 3: pruefung of type Termin2 inserted
* and pruefung of type Termin1 as well
* retval 5: prueufungen Termin 2 and 1 inserted
* and no insert Zeugnisnote (change after date of examination)
* @return void
*/
public function insertPruefung()
{
$authUID = getAuthUID();
$this->load->library('form_validation');
$this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]),
]);
$this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
]);
$this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
]);
$this->form_validation->set_rules(
'datum',
$this->p->t('global', 'datum'),
['is_valid_date']
);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
//calculate studiensemester_kurzbz this from lehreinheit (case newPruefung)
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
if (!$studiensemester_kurzbz)
{
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id'));
$lehreinheit = $this->getDataOrTerminateWithError($result);
$studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz;
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
}
$result = $this->PruefungModel->insert([
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $this->input->post('datum'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
$this->getDataOrTerminateWithError($result);
//check if existing zeugnisnote
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz));
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
//insert zeugnisnote, if not existing
$result = $this->ZeugnisnoteModel->insert(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
'benotungsdatum' => $this->input->post('datum'),
'insertamum' => date('c'),
'insertvon' => $authUID
));
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(1);
}
$return_code = 0;
//handling Termin1 if not existing
if($this->input->post('pruefungstyp_kurzbz') == "Termin2")
{
$resultP = $this->PruefungModel->loadWhere(array(
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'pruefungstyp_kurzbz' => 'Termin1'));
if (isError($resultP))
{
$this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL);
}
if(!hasData($resultP))
{
//check if existing Zeugnisnote
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id');
$resultP = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->input->post('student_uid'),
'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz));
if (isError($resultP))
{
$this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL);
}
if (!hasData($resultP))
{
$this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL);
}
$dataNote = current(getData($resultP));
$resultN = $this->PruefungModel->insert([
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $dataNote->benotungsdatum,
'pruefungstyp_kurzbz' => 'Termin1',
'note' => $dataNote->note,
'punkte' => $dataNote->punkte,
'anmerkung' => 'automatisiert aus Zeugnisnote erstellt',
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
if (isError($resultN)) {
$this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL);
}
$return_code = 3;
}
}
$note = current(getData($result));
$uebernahmedatum = new DateTime($note->uebernahmedatum);
$benotungsdatum = new DateTime($note->benotungsdatum);
$checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum
? $benotungsdatum
: $uebernahmedatum;
if ($checkDate >= $this->input->post('datum') && $note !== $note->note)
{
$this->terminateWithSuccess($return_code + 2);
}
$this->terminateWithSuccess($return_code + 2);
$this->insertOrUpdatePruefung();
}
/**
@@ -348,8 +187,6 @@ class Pruefung extends FHCAPI_Controller
* @param pruefung_id
*
* @return success or error
*
* no impact on lehre.tbl_zeugnisnote
*/
public function updatePruefung($pruefung_id)
{
@@ -359,48 +196,7 @@ class Pruefung extends FHCAPI_Controller
if (!$oldpruefung)
show_404(); // Pruefung that should be updated does not exist
$authUID = getAuthUID();
$this->load->library('form_validation');
$this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]),
]);
$this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
]);
$this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
]);
$this->form_validation->set_rules(
'datum',
$this->p->t('global', 'datum'),
['is_valid_date']
);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->PruefungModel->update(
[
'pruefung_id' => $pruefung_id
],
[ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'note' => $this->input->post('note'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'datum' => $this->input->post('datum'),
'anmerkung' => $this->input->post('anmerkung'),
'updatevon' => $authUID,
'updateamum' => date('c'),
]
);
$this->getDataOrTerminateWithError($result);
return $this->outputJsonSuccess(true);
$this->insertOrUpdatePruefung($pruefung_id);
}
/**
@@ -574,4 +370,198 @@ class Pruefung extends FHCAPI_Controller
return $this->terminateWithSuccess($data);
}
protected function insertOrUpdatePruefung($pruefung_id=null)
{
$authUID = getAuthUID();
$this->load->library('form_validation');
$this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
]);
$this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
]);
$this->form_validation->set_rules(
'datum',
$this->p->t('global', 'datum'),
['is_valid_date']
);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->PruefungModel->db->trans_start();
if ($this->input->post('pruefungstyp_kurzbz') == "Termin2")
{
//Wenn ein 2. Termin angelegt wird, und kein 1. Termin vorhanden ist,
//dann wird auch ein 1. Termin angelegt mit der derzeitigen Zeugnisnote
$resultP = $this->PruefungModel->loadWhere(array(
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'pruefungstyp_kurzbz' => 'Termin1'));
$termin1 = $this->getDataOrTerminateWithError($resultP);
if (!$termin1)
{
//check if existing Zeugnisnote
$this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id');
$this->ZeugnisnoteModel->db->where(
'lehre.tbl_zeugnisnote.studiensemester_kurzbz',
'lehre.tbl_lehreinheit.studiensemester_kurzbz',
false
);
$resultP = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->post('student_uid')
));
$zeugnisnoten = $this->getDataOrTerminateWithError($resultP);
if ($zeugnisnoten)
{
$zeugnisnote = current($zeugnisnoten);
$resultN = $this->PruefungModel->insert([
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $zeugnisnote->benotungsdatum,
'pruefungstyp_kurzbz' => 'Termin1',
'note' => $zeugnisnote->note,
'punkte' => $zeugnisnote->punkte,
'anmerkung' => 'automatisiert aus Zeugnisnote erstellt',
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
$this->getDataOrTerminateWithError($resultN);
}
//Wenn keine Zeugnisnote vorhanden ist, dann wird kein
//1.Termin angelegt
}
}
if(intval($pruefung_id) > 0)
{
$result = $this->PruefungModel->update(
[
'pruefung_id' => $pruefung_id
],
[ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'note' => $this->input->post('note'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'datum' => $this->input->post('datum'),
'anmerkung' => $this->input->post('anmerkung'),
'updatevon' => $authUID,
'updateamum' => date('c'),
]
);
}
else
{
$result = $this->PruefungModel->insert([
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $this->input->post('datum'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
'insertamum' => date('c'),
'insertvon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
]);
}
$this->getDataOrTerminateWithError($result);
//get studiensemester_kurzbz and lehreveranstaltung_id from lehreinheit
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id'));
$lehreinheiten = $this->getDataOrTerminateWithError($result);
if (!$lehreinheiten) {
$this->terminateWithValidationErrors([
'lehreinheit_id' => $this->p->t('ui', 'error_fieldNotFound', [
'field' => $this->p->t('lehre', 'lehreinheit')
])
]);
}
$lehreinheit = current($lehreinheiten);
$studiensemester_kurzbz = $lehreinheit->studiensemester_kurzbz;
$lehrveranstaltung_id = $lehreinheit->lehrveranstaltung_id;
//check if existing zeugnisnote
$result = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
$zeugnisnoten = $this->getDataOrTerminateWithError($result);
if (!$zeugnisnoten)
{
//insert zeugnisnote, if not existing
$result = $this->ZeugnisnoteModel->insert(array(
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
'benotungsdatum' => $this->input->post('datum'),
'insertamum' => date('c'),
'insertvon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
));
$this->getDataOrTerminateWithError($result);
$this->PruefungModel->db->trans_complete();
$this->terminateWithSuccess();
}
$note = current($zeugnisnoten);
$uebernahmedatum = new DateTime($note->uebernahmedatum);
$benotungsdatum = new DateTime($note->benotungsdatum);
$pruefungsdatum = new DateTime($this->input->post('datum'));
$checkDate = $note->uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum
? $benotungsdatum
: $uebernahmedatum;
if ($checkDate > $pruefungsdatum && $this->input->post('note') !== $note->note)
{
$this->PruefungModel->db->trans_complete();
$this->terminateWithSuccess($this->p->t('exam', 'hinweis_changeAfterExamDate'));
}
//update zeugnisnote, if existing and valid datum
$result = $this->ZeugnisnoteModel->update([
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz
], [
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
'benotungsdatum' => $this->input->post('datum'),
'updateamum' => date('c'),
'updatevon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
]);
$this->PruefungModel->db->trans_complete();
$this->terminateWithSuccess();
}
}
@@ -114,9 +114,8 @@ class Status extends FHCAPI_Controller
$this->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel');
$result = $this->BismeldestichtagModel->getLastReachedMeldestichtag();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
public function isLastStatus($prestudent_id)
@@ -296,7 +295,7 @@ class Status extends FHCAPI_Controller
}],
//Check if Rolle already exists
['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) {
if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]);
@@ -903,7 +902,7 @@ class Status extends FHCAPI_Controller
$this->form_validation->set_rules('_default', '', [
['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) {
if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]);
@@ -920,7 +919,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryTimesequence(
@@ -945,7 +944,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryLaststatus(
@@ -970,7 +969,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryUnterbrechersemester(
@@ -995,7 +994,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryAbbrechersemester(
@@ -1020,7 +1019,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryDiplomant(
@@ -1079,6 +1078,24 @@ class Status extends FHCAPI_Controller
$this->terminateWithSuccess(true);
}
protected function checkForCriticalChangesBis($oldstatus)
{
$changedFields = array();
$allowedFields = array('anmerkung', 'statusgrund_id');
$oldstatus_array = get_object_vars($oldstatus);
foreach($oldstatus_array as $key => $oldValue)
{
$newValue = $this->input->post($key);
if( $newValue !== $oldValue )
{
$changedFields[] = $key;
}
}
$criticalFieldsChanged = array_diff($changedFields, $allowedFields);
$hasCriticalChangesBis = count($criticalFieldsChanged) > 0 ? true : false;
return $hasCriticalChangesBis;
}
/**
* Updates a status entry
*
@@ -1103,6 +1120,7 @@ class Status extends FHCAPI_Controller
$oldstatus = current($oldstatus);
$hasCriticalChangesBis = $this->checkForCriticalChangesBis($oldstatus);
$isBerechtigtNoStudstatusCheck = $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung');
$isBerechtigtBasisPrestudentstatus = $this->permissionlib->isBerechtigt('basis/prestudentstatus');
@@ -1113,7 +1131,6 @@ class Status extends FHCAPI_Controller
$ausbildungssemester = $this->input->post('ausbildungssemester') ?: $oldstatus->ausbildungssemester;
$datum = $this->input->post('datum') ?: $oldstatus->datum;
//Form Validation
$this->load->library('form_validation');
@@ -1136,9 +1153,15 @@ class Status extends FHCAPI_Controller
$this->p->t('global', 'datum'),
[
'is_valid_date',
['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck) {
['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck, $hasCriticalChangesBis){
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
{
return true; // Skip if access right says so*/
}
if (!$hasCriticalChangesBis) {
return true; // Skip if no critical changes were made
}
if (!$value)
return true; // Error will be handled by the required statement above
@@ -1342,6 +1365,7 @@ class Status extends FHCAPI_Controller
'updateamum' => date('c'),
'updatevon' => $authUID
];
$nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe'];
foreach ([
'orgform_kurzbz',
'anmerkung',
@@ -1350,8 +1374,17 @@ class Status extends FHCAPI_Controller
'rt_stufe',
'statusgrund_id'
] as $key)
if ($this->input->post($key))
{
if (in_array($key, $nullableFields))
{
$updateData[$key] = ($this->input->post($key) === '') ? null : $this->input->post($key);
}
else if ($this->input->post($key))
{
$updateData[$key] = $this->input->post($key);
}
}
if ($this->input->post('bestaetigtam')) {
$updateData['bestaetigtam'] = $this->input->post('bestaetigtam');
@@ -36,7 +36,8 @@ class Student extends FHCAPI_Controller
parent::__construct([
'get' => ['admin:r', 'assistenz:r'],
'save' => ['admin:rw', 'assistenz:rw'],
'check' => ['admin:rw', 'assistenz:rw'],
'saveStudent' => ['admin:rw', 'assistenz:rw'],
'getPerson' => ['admin:rw', 'assistenz:rw'],
'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions
]);
@@ -55,7 +56,7 @@ class Student extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'lehre'
'ui', 'lehre', 'person'
]);
}
@@ -111,16 +112,28 @@ class Student extends FHCAPI_Controller
if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) {
$this->PrestudentModel->addSelect(
"(
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp='email'
AND person_id=p.person_id
AND zustellung
ORDER BY kontakt_id
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp='email'
AND person_id=p.person_id
AND zustellung
ORDER BY kontakt_id DESC
LIMIT 1
) AS email_privat",
false
);
$this->PrestudentModel->addSelect(
"(
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp='email_unverifiziert'
AND person_id=p.person_id
AND zustellung
ORDER BY kontakt_id DESC
LIMIT 1
) AS email_privat_unverified",
false
);
}
$this->PrestudentModel->addSelect(
"(
@@ -146,9 +159,9 @@ class Student extends FHCAPI_Controller
'LEFT');*/
$result = $this->PrestudentModel->loadWhere(['tbl_prestudent.prestudent_id' => $prestudent_id]);
$student = $this->getDataOrTerminateWithError($result);
if (!$student)
return show_404();
@@ -208,7 +221,7 @@ class Student extends FHCAPI_Controller
]);
$this->load->library('UDFLib');
$result = $this->udflib->getCiValidations($this->PersonModel, $this->input->post());
$udf_field_validations = $this->getDataOrTerminateWithError($result);
@@ -219,7 +232,7 @@ class Student extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
$student = $this->getDataOrTerminateWithError($result);
$uid = $student ? current($student)->student_uid : null;
@@ -232,7 +245,6 @@ class Student extends FHCAPI_Controller
$person_id = $person ? current($person)->person_id : null;
$array_allowed_props_lehrverband = ['verband', 'semester', 'gruppe'];
$update_lehrverband = array();
foreach ($array_allowed_props_lehrverband as $prop) {
@@ -292,7 +304,7 @@ class Student extends FHCAPI_Controller
}
$array_allowed_props_student = ['matrikelnr'];
if($this->isLaufendesSemester($studiensemester_kurzbz))
if($this->isLaufendesSemester($studiensemester_kurzbz))
{
$array_allowed_props_student = ['matrikelnr', 'verband', 'semester', 'gruppe'];
}
@@ -309,6 +321,10 @@ class Student extends FHCAPI_Controller
foreach ($array_allowed_props_benutzer as $prop) {
$val = $this->input->post($prop);
if ($val !== null) {
if($prop === 'alias' && $val === '')
{
$val = null;
}
$update_benutzer[$prop] = $val;
}
}
@@ -424,7 +440,32 @@ class Student extends FHCAPI_Controller
), ''));
}
public function check()
/**
* Saves data to a prestudent using their student_uid
*
* @param string $student_uid
* @param string $studiensemester_kurzbz
* @return void
*/
public function saveStudent($student_uid, $studiensemester_kurzbz)
{
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
show_404(); // No Student with that ID
$student = current($data);
$this->checkPermissionsForPrestudent($student->prestudent_id, ['admin:rw', 'assistenz:rw']);
return $this->save($student->prestudent_id, $studiensemester_kurzbz);
}
public function getPerson()
{
$this->load->library('form_validation');
@@ -442,21 +483,55 @@ class Student extends FHCAPI_Controller
$this->load->model('person/Person_model', 'PersonModel');
$this->PersonModel->addSelect(
'person_id, vorname, nachname, vornamen, wahlname, gebdatum, staatsbuergerschaft, geburtsnation, sprache, anrede,
titelpost, titelpre, gebort, gebzeit, homepage, geschlecht, matr_nr,
aktiv, unruly, tbl_geschlecht.bezeichnung_mehrsprachig AS geschlecht_bezeichnung'
);
$this->PersonModel->addJoin('public.tbl_geschlecht', 'geschlecht');
if ($gebdatum)
$this->PersonModel->db->where('gebdatum', (new DateTime($gebdatum))->format('Y-m-d'));
if ($vorname && $nachname) {
$this->PersonModel->db->or_group_start();
$this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape($nachname) . ')', false);
$this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape($vorname) . ')', false);
$this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape(trim($nachname)) . ')', false);
$this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape(trim($vorname)) . ')', false);
$this->PersonModel->db->group_end();
} elseif ($nachname) {
$this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape($nachname) . ')', false);
$this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape(trim($nachname)) . ')', false);
}
$result = $this->PersonModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->load->model('person/Adresse_model', 'AdresseModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
foreach ($data as $person)
{
// get adresses
$langIdx = $this->_getLanguageIndex() - 1;
$person->geschlecht_bezeichnung = isset($person->geschlecht_bezeichnung[$langIdx]) ? $person->geschlecht_bezeichnung[$langIdx] : '';
// get Adresse
$this->AdresseModel->addOrder('heimatadresse', 'DESC');
$this->AdresseModel->addOrder('zustelladresse', 'DESC');
$this->AdresseModel->addOrder('adresse_id', 'DESC');
$result = $this->AdresseModel->loadWhere(['person_id' => $person->person_id]);
$adressen = $this->getDataOrTerminateWithError($result);
$person->adressen = $adressen;
// get status
$result = $this->PrestudentstatusModel->getLastStatusPerson($person->person_id);
$status = $this->getDataOrTerminateWithError($result);
$person->status = $status;
}
$this->terminateWithSuccess($data);
}
@@ -465,69 +540,57 @@ class Student extends FHCAPI_Controller
if (!$this->input->post('person_id')) {
if (!isset($_POST['address']) || !is_array($_POST['address']))
$_POST['address'] = [];
$_POST['address']['func'] = 1;
}
if ($this->input->post('incoming')) {
$_POST['ausbildungssemester'] = 0;
}
$this->load->library('form_validation');
$this->_validate();
$this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [
'requiredIfNotPersonId' => $this->p->t('ui', 'error_required')
]);
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
'requiredIfNotPersonId' => $this->p->t('ui', 'error_required')
]);
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
]);
$this->form_validation->set_rules('address[func]', 'Address', 'required|integer|less_than[2]|greater_than[-2]');
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
]);
$this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
]);
$this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
]);
$this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
]);
$this->form_validation->set_rules('email', 'E-Mail', 'valid_email');
$this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'required');
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
$this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|integer|less_than[9]|greater_than[-1]');
// TODO(chris): validate studienplan with studiengang, semester and orgform?
// TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht?
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// TODO(chris): This should be in a library
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->db->trans_start();
$this->load->library('PrestudentLib');
$result = $this->addInteressent();
$errors = [];
$person_id = null;
$this->db->trans_complete();
$this->db->trans_begin();
if ($this->db->trans_status() === FALSE)
$this->terminateWithError('TODO(chris): TEXT', self::ERROR_TYPE_GENERAL);
$result = $this->_addPerson();
if (isError($result)) $errors[] = getError($result);
$this->terminateWithSuccess($result);
if (hasData($result))
{
$person_id = getData($result);
$result = $this->_addAdresse($person_id);
if (isError($result)) $errors[] = getError($result);
$result = $this->_addKontakt($person_id);
if (isError($result)) $errors[] = getError($result);
if (!$this->input->post('personOnly')) $result = $this->_addFirstPrestudentstatus($person_id);
if (isError($result)) $errors[] = getError($result);
}
if ($this->db->trans_status() === FALSE || !isEmptyArray($errors))
{
$this->db->trans_rollback();
$this->terminateWithError(isEmptyArray($errors) ? $this->p->t('stv', 'error_add_student') : $errors);
}
$this->db->trans_commit();
$this->terminateWithSuccess($person_id);
}
protected function addInteressent()
private function _addPerson()
{
// Person anlegen wenn nötig
$person_id = $this->input->post('person_id');
if (!$person_id) {
$this->load->model('person/Person_model', 'PersonModel');
$data = [
'nachname' => $this->input->post('nachname'),
'insertamum' => date('c'),
@@ -550,19 +613,25 @@ class Student extends FHCAPI_Controller
if ($this->input->post('geschlecht'))
$data['geschlecht'] = $this->input->post('geschlecht');
if ($this->input->post('gebdatum'))
$data['gebdatum'] = (new DateTime($this->input->post('datum_obj')))->format('Y-m-d');
$data['gebdatum'] = (new DateTime($this->input->post('gebdatum')))->format('Y-m-d');
if ($this->input->post('geburtsnation'))
$data['geburtsnation'] = $this->input->post('geburtsnation');
if ($this->input->post('staatsbuergerschaft'))
$data['staatsbuergerschaft'] = $this->input->post('staatsbuergerschaft');
$result = $this->PersonModel->insert($data);
$person_id = $this->getDataOrTerminateWithError($result);
return $this->PersonModel->insert($data);
}
// Addresse anlegen
$anlegen = $this->input->post('address[func]');
if ($anlegen) {
return success($person_id);
}
private function _addAdresse($person_id)
{
// Addresse anlegen?
$anlegen = $this->input->post('address[checked]');
if ($anlegen === true)
{
// Adresse laden
$this->load->model('person/Adresse_model', 'AdresseModel');
$data = [
@@ -574,50 +643,45 @@ class Student extends FHCAPI_Controller
'typ' => 'h',
'zustelladresse' => true,
];
if ($anlegen < 0) { // Überschreiben
$this->AdresseModel->addOrder('zustelladresse', 'DESC');
$this->AdresseModel->addOrder('sort');
$this->AdresseModel->addSelect('adresse_id');
$result = $this->AdresseModel->loadWhere([
'person_id' => $person_id
]);
$address = $this->getDataOrTerminateWithError($result);
if ($address) {
$address = current($address);
$data['updateamum'] = date('c');
$data['updatevon'] = getAuthUID();
if (isError($result)) return $result;
// wenn neue Adresse, heimatadresse setzen
if (!hasData($result)) $data['heimatadresse'] = true;
$result = $this->AdresseModel->update($address->adresse_id, $data);
$this->getDataOrTerminateWithError($result);
} else {
//Wenn keine Adrese vorhanden ist dann eine neue Anlegen
$anlegen = 1;
$data['heimatadresse'] = true;
}
}
if ($anlegen > 0) {
$data['person_id'] = $person_id;
$data['insertamum'] = date('c');
$data['insertvon'] = getAuthUID();
if (!isset($data['heimatadresse']))
$data['heimatadresse'] = !$this->input->post('person_id');
$result = $this->AdresseModel->insert($data);
$this->getDataOrTerminateWithError($result);
}
return $this->AdresseModel->insert($data);
}
return success(null);
}
private function _addKontakt($person_id)
{
// Kontaktdaten
$kontaktdaten = [];
foreach (['email', 'telefon', 'mobil'] as $k) {
foreach (['email', 'telefon', 'mobil'] as $k)
{
$v = $this->input->post($k);
if ($v)
$kontaktdaten[$k] = $v;
}
if (count($kontaktdaten)) {
if (count($kontaktdaten))
{
$this->load->model('person/Kontakt_model', 'KontaktModel');
foreach ($kontaktdaten as $typ => $kontakt) {
foreach ($kontaktdaten as $typ => $kontakt)
{
$data = [
'person_id' => $person_id,
'kontakttyp' => $typ,
@@ -627,83 +691,70 @@ class Student extends FHCAPI_Controller
'insertvon' => getAuthUID()
];
$result = $this->KontaktModel->insert($data);
$this->getDataOrTerminateWithError($result);
if (isError($result)) return $result;
}
}
return success(null);
}
private function _addFirstPrestudentstatus($person_id)
{
// Prestudent anlegen
$data = [
'aufmerksamdurch_kurzbz' => 'k.A.',
'person_id' => $person_id,
'studiengang_kz' => $this->input->post('studiengang_kz'),
'ausbildungcode' => $this->input->post('letzteausbildung'),
'anmerkung' => $this->input->post('anmerkungen'),
'reihungstestangetreten' => false,
'bismelden' => true
];
// Anmerkung with Ausbildungsart
$studiengang_kz = $this->input->post('studiengang_kz');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$ausbildungsart = $this->input->post('ausbildungsart');
$anmerkung = $this->input->post('anmerkungen');
$foerderrelevant = null;
if ($ausbildungsart)
$data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart;
$anmerkung .= ' Ausbildungsart:' . $ausbildungsart;
// Incomings und ausserordentliche sind bei Meldung nicht förderrelevant
$incoming = $this->input->post('incoming');
if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9')
$data['foerderrelevant'] = false;
// Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen
$this->PrestudentModel->addOrder('zgvmas_code');
$this->PrestudentModel->addOrder('zgv_code', 'DESC');
$this->PrestudentModel->addLimit(1);
$result = $this->PrestudentModel->loadWhere([
'person_id' => $person_id
]);
$prestudent = $this->getDataOrTerminateWithError($result);
if ($prestudent) {
$prestudent = current($prestudent);
if ($prestudent->zgv_code) {
$data['zgv_code'] = $prestudent->zgv_code;
$data['zgvort'] = $prestudent->zgvort;
$data['zgvdatum'] = $prestudent->zgvdatum;
if ($incoming || substr($studiengang_kz, 0, 1) == '9')
$foerderrelevant = false;
$data['zgvmas_code'] = $prestudent->zgvmas_code;
$data['zgvmaort'] = $prestudent->zgvmaort;
$data['zgvmadatum'] = $prestudent->zgvmadatum;
}
}
// Prestudent speichern
$result = $this->PrestudentModel->insert($data);
$prestudent_id = $this->getDataOrTerminateWithError($result);
$result = $this->prestudentlib->setPrestudent(
$person_id,
$studiengang_kz,
$this->input->post('letzteausbildung'),
$anmerkung,
$foerderrelevant
);
if (isError($result)) return $result;
if (!hasData($result)) return error('Error when adding prestudent');
// Prestudent Rolle Anlegen
$data = [
'prestudent_id' => $prestudent_id,
'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent',
'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'),
'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0,
'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null,
'studienplan_id' => $this->input->post('studienplan_id') ?: null,
'datum' => date('Y-m-d'),
'insertamum' => date('c'),
'insertvon' => getAuthUID()
];
$result = $this->PrestudentstatusModel->insert($data);
$this->getDataOrTerminateWithError($result);
$prestudent_id = getData($result);
if ($incoming) {
// TODO(chris): IMPLEMENT!
//Matrikelnummer und UID generieren
//Benutzerdatensatz anlegen
//Studentendatensatz anlegen
//StudentLehrverband anlegen
// wenn Incoming, Incoming Daten hinzufügen
if ($incoming)
{
$statusResult = $this->prestudentlib->setFirstIncoming(
$prestudent_id,
$studiengang_kz,
$studiensemester_kurzbz,
$this->input->post('orgform_kurzbz'),
$this->input->post('studienplan_id')
);
}
else
{
// Prestudent Rolle Anlegen
$statusResult = $this->prestudentlib->setFirstStatus(
$prestudent_id,
$this->PrestudentstatusModel::STATUS_INTERESSENT,
$studiensemester_kurzbz,
$this->input->post('ausbildungssemester'),
$this->input->post('orgform_kurzbz'),
$this->input->post('studienplan_id')
);
}
if (!hasData($statusResult)) return error('error when adding status');
if (isError($statusResult)) return $statusResult;
// TODO(chris): DEBUG
/*$result = $this->PrestudentModel->loadWhere([
'pestudent_id' => 1
]);
if (isError($result)) {
return $result;
}*/
return success(true);
return success($prestudent_id);
}
public function requiredIfNotPersonId($value)
@@ -715,13 +766,84 @@ class Student extends FHCAPI_Controller
public function requiredIfAddressFunc($value)
{
if (!$_POST['address']['func'])
if (!isset($_POST['address']['checked']) || !$_POST['address']['checked'])
return true;
return !!$value;
}
public function isValidDate($value)
public function requiredIfStudentFunc($value)
{
return isValidDate($value);
if (isset($_POST['personOnly']) && $_POST['personOnly'])
return true;
return !!$value;
}
public function requiredIfStudentAndNotIncomingFunc($value)
{
if ((isset($_POST['incoming']) && $_POST['incoming']) || $this->requiredIfStudentFunc($value))
return true;
return !!$value;
}
/**
* Validates input data. Terminates with validation errors, if invalid.
*/
private function _validate()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')])
]);
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')])
]);
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
]);
//$this->form_validation->set_rules('address[checked]', 'Address', 'required');
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')])
]);
$this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')])
]);
$this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')])
]);
$this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')])
]);
$this->form_validation->set_rules('email', 'E-Mail', 'valid_email');
$this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')])
]);
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')])
]);
$this->form_validation->set_rules(
'ausbildungssemester',
'Ausbildungssemester',
'callback_requiredIfStudentAndNotIncomingFunc|integer|less_than[9]|greater_than[-1]',
[
'requiredIfStudentAndNotIncomingFunc' =>
$this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')]),
]
);
// TODO(chris): validate studienplan with studiengang, semester and orgform?
// TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht?
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
private function _getLanguageIndex()
{
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->SpracheModel->addSelect('index');
$result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
$this->addMeta('lang', getUserLanguage());
return hasData($result) ? getData($result)[0]->index : 1;
}
}
@@ -44,14 +44,12 @@ class Students extends FHCAPI_Controller
}
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('PhrasesLib');
$this->loadPhrases(
array(
'lehre'
)
);
}
/**
@@ -75,7 +73,7 @@ class Students extends FHCAPI_Controller
* /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter) => getPrestudentsOrgform
* /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter)/(otherfilter) => getPrestudentsOrgform
*
* /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialguppe
* /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialgruppe
*
* /(studiensemester_kurzbz)/(studiengang_kz) => getStudents
* /(studiensemester_kurzbz)/(studiengang_kz)/(semester) => getStudents
@@ -101,39 +99,183 @@ class Students extends FHCAPI_Controller
}
/**
* @param string $studiensemester_kurzbz
*
* @return void
*/
public function getIncoming()
public function getIncoming($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
// TODO(chris): IMPLEMENT!
$this->terminateWithSuccess([]);
$this->addMeta('ci_params', [
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin(
"(
SELECT prestudent_id
FROM public.tbl_prestudentstatus
WHERE status_kurzbz = 'Incoming'
AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
) test",
"prestudent_id"
);
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN pls.ausbildungssemester::text
ELSE ''::text
END
) AS semester", false);
$this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
$this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* @param string $studiensemester_kurzbz
*
* @return void
*/
public function getOutgoing()
public function getOutgoing($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
// TODO(chris): IMPLEMENT!
$this->terminateWithSuccess([]);
$this->addMeta('ci_params', [
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_bisio bis
JOIN public.tbl_student USING (student_uid)
JOIN public.tbl_studiensemester stdsem ON (
(bis.von >= stdsem.start AND bis.von <= stdsem.ende)
OR
(bis.bis >= stdsem.start AND bis.bis <= stdsem.ende)
OR
(bis.von <= stdsem.start AND bis.bis >= stdsem.ende)
)
WHERE NOT EXISTS (
SELECT 1
FROM public.tbl_prestudentstatus
WHERE status_kurzbz = 'Incoming'
AND prestudent_id = tbl_student.prestudent_id
) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
GROUP BY prestudent_id
) test",
"prestudent_id"
);
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN pls.ausbildungssemester::text
ELSE ''::text
END
) AS semester", false);
$this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
$this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* @param string $studiensemester_kurzbz
*
* @return void
*/
public function getGemeinsamestudien()
public function getGemeinsamestudien($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
// TODO(chris): IMPLEMENT!
$this->terminateWithSuccess([]);
$this->addMeta('ci_params', [
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_mobilitaet
WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
) bis",
"prestudent_id"
);
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN pls.ausbildungssemester::text
ELSE ''::text
END
) AS semester", false);
$this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
$this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getPrestudents($studiengang_kz,
$studiensemester_kurzbz = null, $filter = null
)
{
public function getPrestudents(
$studiengang_kz,
$studiensemester_kurzbz = null,
$filter = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
@@ -144,10 +286,12 @@ class Students extends FHCAPI_Controller
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter);
}
public function getPrestudentsOrgform($studiengang_kz, $orgform_kurzbz,
$studiensemester_kurzbz = null, $filter = null
)
{
public function getPrestudentsOrgform(
$studiengang_kz,
$orgform_kurzbz,
$studiensemester_kurzbz = null,
$filter = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
@@ -227,7 +371,7 @@ class Students extends FHCAPI_Controller
$stg = $this->getDataOrTerminateWithError($result);
if (!$stg)
$this->terminateWithValidationErrors(['' => 'Studiengang does not exist']); // TODO(chris): phrase
$this->terminateWithSuccess([]);
$stg = current($stg);
$where['ps.status_kurzbz'] = 'Interessent';
@@ -296,7 +440,10 @@ class Students extends FHCAPI_Controller
break;
default:
if (!$studiensemester_kurzbz) {
// TODO(chris): this does not work with $orgform_kurzbz != null
/** NOTE(chris):
* show all prestudents in this stg who don't have a status
* $orgform_kurzbz does not change the results since orgform is stored in the status table
*/
$where['ps.status_kurzbz'] = null;
} else {
$this->PrestudentModel->db->where_in('ps.status_kurzbz', [
@@ -310,42 +457,18 @@ class Students extends FHCAPI_Controller
break;
}
/*
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
$this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.prestudent_id=tbl_prestudent.prestudent_id
AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
$this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_prestudentstatus ps', '
ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
AND ps.prestudent_id=tbl_prestudent.prestudent_id
AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("
CASE WHEN ps.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN ps.ausbildungssemester::text
ELSE ''::text END AS semester", false);
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN ps.ausbildungssemester::text
ELSE ''::text
END AS semester", false);
$this->PrestudentModel->addSelect("'' AS verband");
$this->PrestudentModel->addSelect("'' AS gruppe");
$this->addSelectPrioRel();
//add status per semester
$this->PrestudentModel->addSelect(
"(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
LIMIT 1
) AS statusofsemester"
);
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->loadWhere($where);
@@ -355,10 +478,13 @@ class Students extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
public function getStudents($studiensemester_kurzbz,
$studiengang_kz, $semester = null, $verband = null, $gruppe = null
)
{
public function getStudents(
$studiensemester_kurzbz,
$studiengang_kz,
$semester = null,
$verband = null,
$gruppe = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -371,10 +497,14 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null);
}
public function getStudentsOrgform($studiensemester_kurzbz,
$studiengang_kz, $orgform_kurzbz, $semester = null, $verband = null, $gruppe = null
)
{
public function getStudentsOrgform(
$studiensemester_kurzbz,
$studiengang_kz,
$orgform_kurzbz,
$semester = null,
$verband = null,
$gruppe = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -388,10 +518,12 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
}
public function getStudentsSpezialgruppe($studiensemester_kurzbz,
$studiengang_kz, $semester, $gruppe_kurzbz,
$orgform_kurzbz = null)
{
public function getStudentsSpezialgruppe(
$studiensemester_kurzbz,
$studiengang_kz,
$semester,
$gruppe_kurzbz
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -403,10 +535,13 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null);
}
public function getStudentsOrgformSpezialgruppe($studiensemester_kurzbz,
$orgform_kurzbz, $studiengang_kz, $semester, $gruppe_kurzbz
)
{
public function getStudentsOrgformSpezialgruppe(
$studiensemester_kurzbz,
$orgform_kurzbz,
$studiengang_kz,
$semester,
$gruppe_kurzbz
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -430,8 +565,15 @@ class Students extends FHCAPI_Controller
*
* @return void
*/
protected function fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null)
{
protected function fetchStudents(
$studiensemester_kurzbz,
$studiengang_kz,
$semester = null,
$verband = null,
$gruppe = null,
$gruppe_kurzbz = null,
$orgform_kurzbz = null
) {
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
@@ -440,21 +582,6 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
/*
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id');
$this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.prestudent_id=tbl_prestudent.prestudent_id
AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
$this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->PrestudentModel->addJoin(
'public.tbl_studentlehrverband v',
'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz)
);*/
$this->prepareQuery($studiensemester_kurzbz, '');
$this->PrestudentModel->addSelect('v.semester');
@@ -462,18 +589,6 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('v.gruppe');
$this->PrestudentModel->addSelect("'' AS priorisierung_relativ");
//add status per semester
$this->PrestudentModel->addSelect(
"(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
LIMIT 1
) AS statusofsemester"
);
$where = [];
@@ -506,7 +621,6 @@ class Students extends FHCAPI_Controller
false
);
}
}
$this->addFilter($studiensemester_kurzbz);
@@ -540,39 +654,18 @@ class Students extends FHCAPI_Controller
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
/*
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.prestudent_id=tbl_prestudent.prestudent_id
AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
$this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
$this->PrestudentModel->addJoin(
'public.tbl_studentlehrverband v',
'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz),
'LEFT'
);*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false);
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
//add status per semester
$this->PrestudentModel->addSelect(
"(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
LIMIT 1
) AS statusofsemester"
);
$this->PrestudentModel->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN pls.ausbildungssemester::text
ELSE ''::text
END
) AS semester", false);
$this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
$this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
$this->addSelectPrioRel();
@@ -609,40 +702,12 @@ class Students extends FHCAPI_Controller
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
/*
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id');
$this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.prestudent_id=tbl_prestudent.prestudent_id
AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
$this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->PrestudentModel->addJoin(
'public.tbl_studentlehrverband v',
'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz),
'LEFT'
);*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect('v.semester');
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
//add status per semester
$this->PrestudentModel->addSelect(
"(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
LIMIT 1
) AS statusofsemester"
);
$this->addSelectPrioRel();
@@ -681,21 +746,59 @@ class Students extends FHCAPI_Controller
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
/*
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id');
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->PrestudentModel->addJoin(
'public.tbl_studentlehrverband v',
'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz),
'LEFT'
);*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect('v.semester');
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->loadWhere([
'p.person_id' => $person_id
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* @param string $studiensemester_kurzbz
*
* @return void
*/
public function search($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
$this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
$this->load->library('form_validation');
$this->form_validation->set_rules('searchstr', 'searchstr', 'required');
$this->form_validation->set_rules('types[]', 'types', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->searchlib->search($this->input->post('searchstr'), $this->input->post('types'));
$data = $this->getDataOrTerminateWithError($result);
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false);
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
//add status per semester
$this->PrestudentModel->addSelect(
"(
@@ -712,10 +815,31 @@ class Students extends FHCAPI_Controller
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->loadWhere([
'p.person_id' => $person_id
]);
$prestudent_ids = [];
$student_uids = [];
$this->addMeta('data', $data);
foreach ($data as $row) {
$dataset = json_decode($row->data);
if ($row->type == 'prestudent') {
$prestudent_ids[] = $dataset->prestudent_id;
} elseif ($row->type == 'student') {
$student_uids[] = $dataset->uid;
}
}
if ($prestudent_ids && $student_uids) {
$this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
$this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids);
} elseif ($prestudent_ids) {
$this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
} elseif ($student_uids) {
$this->PrestudentModel->db->where_in('s.student_uid', $student_uids);
} else {
$this->terminateWithSuccess([]);
}
$result = $this->PrestudentModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
@@ -771,6 +895,18 @@ class Students extends FHCAPI_Controller
// verband
// gruppe
//add status per semester
$this->PrestudentModel->addSelect(
"(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
LIMIT 1
) AS statusofsemester"
);
$this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
$this->PrestudentModel->addSelect('tbl_prestudent.studiengang_kz');
$this->PrestudentModel->addSelect('stg.bezeichnung AS stg_bezeichnung');
@@ -806,13 +942,6 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('mentor');
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
/*$this->PrestudentModel->addSelect('tbl_prestudent.reihungstest_id');
$this->PrestudentModel->addSelect('tbl_prestudent.anmeldungreihungstest');
$this->PrestudentModel->addSelect('tbl_prestudent.gsstudientyp_kurzbz');
$this->PrestudentModel->addSelect('tbl_prestudent.priorisierung');
$this->PrestudentModel->addSelect('p.zugangscode');
$this->PrestudentModel->addSelect('p.bpk');*/
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
$this->PrestudentModel->addOrder('nachname');
@@ -827,13 +956,13 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect("(
SELECT count(*)
FROM (
SELECT *, public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) AS laststatus
FROM PUBLIC.tbl_prestudent pss
JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id)
SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus
FROM public.tbl_prestudent pss
JOIN public.tbl_prestudentstatus USING (prestudent_id)
WHERE person_id = p.person_id
AND studiensemester_kurzbz = (
SELECT studiensemester_kurzbz
FROM PUBLIC.tbl_prestudentstatus
FROM public.tbl_prestudentstatus
WHERE prestudent_id = tbl_prestudent.prestudent_id
AND status_kurzbz = 'Interessent'
LIMIT 1
@@ -842,7 +971,7 @@ class Students extends FHCAPI_Controller
) prest
WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent')
AND priorisierung <= tbl_prestudent.priorisierung
) || ' (' || tbl_prestudent.priorisierung || ')' AS priorisierung_relativ", false);
) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false);
}
/**
@@ -854,40 +983,20 @@ class Students extends FHCAPI_Controller
*/
protected function addFilter($studiensemester_kurzbz)
{
$filter = json_decode($this->input->get('filter'), true);
$filter = $this->input->post('filter');
if (!is_array($filter))
{
$this->addMeta('addfilter', 'invalid filter: ' . $this->input->get('filter'));
$this->addMeta('addfilter', 'invalid filter: ' . json_encode($this->input->post('filter')));
return;
}
if (isset($filter['konto_count_0'])) {
$bt = $this->PrestudentModel->escape($filter['konto_count_0']);
$stdsem = $this->PrestudentModel->escape($studiensemester_kurzbz);
$this->PrestudentModel->db->where('(
SELECT count(*)
FROM public.tbl_konto
WHERE person_id=tbl_prestudent.person_id
AND buchungstyp_kurzbz=' . $bt . '
AND studiensemester_kurzbz=' . $stdsem . '
) =', 0);
$this->PrestudentModel->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming');
}
if (isset($filter['konto_missing_counter'])) {
$bt = $this->PrestudentModel->escape($filter['konto_missing_counter']);
$stg = '';
if ($this->variablelib->getVar('kontofilterstg') == 'true')
$stg = ' AND studiengang_kz=tbl_prestudent.studiengang_kz';
$bt = $bt == 'alle' ? '' : ' AND buchungstyp_kurzbz=' . $bt;
$this->PrestudentModel->db->where('(
SELECT sum(betrag)
FROM public.tbl_konto
WHERE person_id=tbl_prestudent.person_id' .
$bt .
$stg . '
) !=', 0);
foreach ($filter as $item) {
if (isset($item['usestdsem']) && $item['usestdsem'])
$item['studiensemester_kurzbz'] = $studiensemester_kurzbz;
if (!$this->PrestudentModel->addFilter($item)) {
$this->addMeta('addfilter', 'invalid filter: ' . json_encode($item));
return;
}
}
}
}
@@ -165,7 +165,17 @@ class Verband extends FHCAPI_Controller
$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("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);
@@ -173,6 +183,7 @@ class Verband extends FHCAPI_Controller
$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);
@@ -188,6 +199,7 @@ class Verband extends FHCAPI_Controller
array_unshift($list, [
'name' => 'PreStudent',
'link' => $link . 'prestudent',
'no_sem_reload' => true,
'stg_kz' => (int)$studiengang_kz,
'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz)
]);
@@ -203,6 +215,7 @@ class Verband extends FHCAPI_Controller
$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');
@@ -216,7 +229,6 @@ class Verband extends FHCAPI_Controller
$list = array_merge($list, $result);
}
}
}
$this->terminateWithSuccess($list);
}
@@ -272,6 +284,7 @@ class Verband extends FHCAPI_Controller
$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);
@@ -320,6 +333,8 @@ class Verband extends FHCAPI_Controller
$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);
@@ -0,0 +1,104 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Vertrag extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getVertrag' => ['admin:r', 'assistenz:r'],
'cancelVertrag' => ['admin:r', 'assistenz:r']
]);
// Load Libraries
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'person',
'projektarbeit'
]);
// Load models
$this->load->model('accounting/Vertrag_model', 'VertragModel');
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
// load libraries
$this->load->library('PermissionLib');
}
public function getVertrag()
{
$vertrag_id = $this->input->get('vertrag_id');
if (!isset($vertrag_id) || !is_numeric($vertrag_id))
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Vertrag ID']), self::ERROR_TYPE_GENERAL);
$result = $this->VertragModel->getVertragById($vertrag_id);
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
if (!hasData($result)) $this->terminateWithSuccess([]);
$vertrag = getData($result)[0];
$this->terminateWithSuccess($vertrag);
}
public function cancelVertrag()
{
$vertrag_id = $this->input->post('vertrag_id');
$person_id = $this->input->post('person_id');
if (!isset($vertrag_id) || !is_numeric($vertrag_id))
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Vertrag ID']), self::ERROR_TYPE_GENERAL);
if (!isset($person_id) || !is_numeric($person_id))
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
// * first find lehrveranstaltung_id of the contracts lehrveranstaltung
$this->VertragModel->addSelect('lehrveranstaltung_id');
$this->VertragModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id', 'LEFT');
$result = $this->VertragModel->loadWhere(['vertrag_id' => $vertrag_id]);
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result)) $this->terminateWithSuccess([]);
$lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
$allOe = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung_id);
if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
$allOe = hasData($allOe) ? getData($allOe) : [];
$this->addMeta('oe', $allOe);
// * then check if the user has permissions to cancel the corresponding lv-organisational units
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
!$this->permissionlib->isBerechtigtMultipleOe('lehre/lehrauftrag_bestellen', $allOe, 'suid'))
{
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'lehrauftrag_bestellen:rw']]);
}
$uidResult = $this->BenutzerModel->getFromPersonId($person_id);
if (isError($uidResult)) $this->terminateWithError(getError($uidResult), self::ERROR_TYPE_GENERAL);
if (!hasData($uidResult)) $this->terminateWithError("no user found", self::ERROR_TYPE_GENERAL);
$mitarbeiter_uid = getData($uidResult)[0]->uid;
$result = $this->VertragModel->cancelVertrag($vertrag_id, $mitarbeiter_uid);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -51,13 +51,17 @@ class Vorlagen extends FHCAPI_Controller
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
$data = $this->getDataOrTerminateWithError($result);
$oe_kurzbz = current($data);
if (hasData($result))
{
$data = getData($result);
$result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$oe_kurzbz = array_column($data, 'oe_kurzbz');
$result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
$this->terminateWithSuccess(array());
$this->terminateWithSuccess($data);
}
}
@@ -233,10 +233,10 @@ class Person extends API_Controller
//Quersumme bilden
for ($i = 0; $i < 10; $i++)
{
$erg += $gewichtung[$i] * $tmpSvnr{$i};
$erg += $gewichtung[$i] * $tmpSvnr[$i];
}
if ($tmpSvnr{3} != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11
if ($tmpSvnr[3] != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11
{
return error('SVNR ist ungueltig');
}
@@ -244,7 +244,7 @@ class Person extends API_Controller
if (mb_strlen($person['svnr']) == 12)
{
$last = substr($person['svnr'], 10, 12);
if ($last{0} != 'v' || !is_numeric($last{1}))
if ($last[0] != 'v' || !is_numeric($last[1]))
{
return error('SVNR ist ungueltig');
}
+88 -4
View File
@@ -200,13 +200,14 @@ class AntragJob extends JOB_Controller
}
/**
* Send reminder to Assistant for Wiedereinstieg Unterbrecher
* Send reminder to Assistant and to Student for Wiedereinstieg Unterbrecher
*
*/
public function sendReminderWiedereinstieg()
{
$now = new DateTime();
$modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier');
if (!$modifier)
return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt');
@@ -230,6 +231,7 @@ class AntragJob extends JOB_Controller
$antraege = getData($result) ?: [];
$count = 0;
$countReminderStudent = 0;
foreach ($antraege as $antrag)
{
$res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
@@ -257,10 +259,92 @@ class AntragJob extends JOB_Controller
$data['UID'] = $student->student_uid;
}
// NOTE(chris): Sancho mail
if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg'))
//Data für Email Student
$result = $this->PrestudentModel->load($antrag->prestudent_id);
$dataPrestudent = current(getData($result));
$person_id = $dataPrestudent->person_id;
$this->KontaktModel->addSelect('kontakt');
$result = $this->KontaktModel->loadWhere([
'person_id'=> $person_id,
'zustellung' => true,
'kontakttyp' => 'email'
]);
$email_student_privat = null;
$dataKontakt = getData($result);
if ($dataKontakt) {
$stud_private_zustell_emails = array_map(function($kontakt) {
return $kontakt->kontakt;
}, $dataKontakt);
$email_student_privat = implode(', ', $stud_private_zustell_emails);
}
$email_student_FH = $this->StudentModel->getEmailFH($this->StudentModel->getUID($antrag->prestudent_id));
//studiensemester
$result = $this->StudiensemesterModel->getByDate($datum->format('Y-m-d'));
if (hasData($result)) {
$dataSem = current(getData($result));
}
$studiensemester = $dataSem->studiensemester_kurzbz;
$studsemShort = substr($studiensemester, 0, 2);
if($studsemShort == "SS")
{
$data['studSemShort_Eng'] = "summer semester";
$data['meldenBis'] = "15.1.";
$data['meldenBis_Eng'] = "January 15";
}
elseif ($studsemShort == "WS") {
$data['studSemShort_Eng'] = "winter semester";
$data['meldenBis'] = "1.8.";
$data['meldenBis_Eng'] = "August 1";
}
else
{
$studsemShort = "SS/WS";
$data['studSemShort_Eng'] = "summer/winter semester";
$data['meldenBis'] = "15.1. (bei Einstieg ins SS) / 1.8. (bei Einstieg ins WS)";
$data['meldenBis_Eng'] = "January 15 (for sommer semester enrollment) / August 1 (for winter semester enrollment)";
}
$data['studSemShort'] = $studsemShort;
// NOTE(chris): Sancho mail Assistant
$sancho_assistant_sent = sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg');
if($sancho_assistant_sent)
{
$count++;
}
else
{
$this->logError('Error: failed to send Assistant Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id);
}
//Mail to Student
$sancho_student_sent = sendSanchoMail(
'Sancho_Mail_Antrag_U_Remind_Stud',
$data,
$email_student_FH,
'Reminder: Unterbrechung Wiedereinstieg',
'',
'',
'',
$email_student_privat);
if($sancho_student_sent)
{
$countReminderStudent++;
}
else
{
$this->logError('Error: failed to send Student Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id);
}
if($sancho_assistant_sent && $sancho_student_sent)
{
$this->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag->studierendenantrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT,
@@ -268,7 +352,7 @@ class AntragJob extends JOB_Controller
]);
}
}
$this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg');
$this->logInfo($count . ' Reminder an Assistenz und ' . $countReminderStudent . ' Reminder an Student gesendet - Ende Job sendReminderWiedereinstieg');
}
/**
@@ -22,6 +22,7 @@ class InfoCenter extends Auth_Controller
const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert';
const ABGEWIESEN_PAGE = 'abgewiesen';
const AUFGENOMMEN_PAGE = 'aufgenommen';
const ONBOARDING_PAGE = 'onboarding';
const SHOW_DETAILS_PAGE = 'showDetails';
const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails';
const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung';
@@ -116,6 +117,7 @@ class InfoCenter extends Auth_Controller
'index' => 'infocenter:r',
'freigegeben' => 'infocenter:r',
'abgewiesen' => 'infocenter:r',
'onboarding' => 'infocenter:r',
'aufgenommen' => 'infocenter:r',
'reihungstestAbsolviert' => 'infocenter:r',
'showDetails' => 'infocenter:r',
@@ -230,6 +232,13 @@ class InfoCenter extends Auth_Controller
$this->load->view('system/infocenter/infocenterAbgewiesen.php');
}
public function onboarding()
{
$this->_setNavigationMenu(self::ONBOARDING_PAGE); // define the navigation menu for this page
$this->load->view('system/infocenter/onboarding.php');
}
/**
* Aufgenommene page of the InfoCenter tool
@@ -1553,6 +1562,7 @@ class InfoCenter extends Auth_Controller
$reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE);
$onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE);
$currentFilterId = $this->input->get(self::FILTER_ID);
if (isset($currentFilterId))
@@ -1561,6 +1571,7 @@ class InfoCenter extends Auth_Controller
$reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$onboardingLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
}
$this->navigationlib->setSessionMenu(
@@ -1624,6 +1635,18 @@ class InfoCenter extends Auth_Controller
'', // target
40 // sort
),
'ohnePrestudent' => $this->navigationlib->oneLevel(
'Electronic Onboarding', // description
$onboardingLink, // link
null, // children
'users', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
50 // sort
),
)
);
}
@@ -1650,6 +1673,8 @@ class InfoCenter extends Auth_Controller
$link = site_url(self::ZGV_UEBERPRUEFUNG_URI);
if ($origin_page === self::ABGEWIESEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
if ($origin_page === self::ONBOARDING_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE);
if ($origin_page === self::AUFGENOMMEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE);
@@ -1691,6 +1716,7 @@ class InfoCenter extends Auth_Controller
$freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE);
$absolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE);
$prevFilterId = $this->input->get(self::PREV_FILTER_ID);
if (isset($prevFilterId))
{
@@ -1767,6 +1793,24 @@ class InfoCenter extends Auth_Controller
)
);
}
if($page == self::ONBOARDING_PAGE)
{
$this->navigationlib->setSessionElementMenu(
'onboarding',
$this->navigationlib->oneLevel(
'Electronic Onboarding', // description
$onboardingLink, // link
null, // children
'users', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
50 // sort
)
);
}
}
/**
+22 -9
View File
@@ -70,20 +70,22 @@ abstract class Auth_Controller extends FHC_Controller
/**
* Checks for Permissions depending if the given person is a
* Mitarbeiter and/or Student
* If neither Student nor Mitarbeiter, default permissions are checked
* and exits/outputs an error if they are not met.
*
* @param integer $person_id
* @param array $permMa Perms if the person is a Mitarbeiter
* @param array $permStud Perms if the person is a Student
* @param array $permDefault Perms if the person is neither a Student nor a Mitarbeiter
*
* @return void
*/
protected function checkPermissionsForPerson($person_id, $permMa, $permStud)
protected function checkPermissionsForPerson($person_id, $permMa, $permStud, $permDefault = null)
{
$res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud);
$res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud, $permDefault);
if ($res) {
$perm = array_keys(array_flip(array_merge($res|1 ? $permMa : [], $res|2 ? $permStud : [])));
$perm = array_keys(array_flip(array_merge($res&1 ? $permMa : [], $res&2 ? $permStud : [], $res&4 ? $permDefault : [])));
$this->_outputAuthError([$this->router->method => $perm]);
}
}
@@ -108,16 +110,19 @@ abstract class Auth_Controller extends FHC_Controller
* Checks for Permissions depending if the given person is a
* Mitarbeiter and/or Student
* and returns the result.
*
* If neither Student nor Mitarbeiter, default permissions are checked
*
* @param integer $person_id
* @param array $permMa Perms if the person is a Mitarbeiter
* @param array $permStud Perms if the person is a Student
*
* @param array $permDefault Perms if the person is neither a Student nor a Mitarbeiter
* @return integer 0 if permission is granted
*/
protected function hasPermissionsForPerson($person_id, $permMa, $permStud)
protected function hasPermissionsForPerson($person_id, $permMa, $permStud, $permDefault)
{
$res = 3;
$res = 8;
$isMitarbeiter = false;
$isStudent = false;
$this->load->model('person/Person_model', 'PersonModel');
$this->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid');
@@ -125,7 +130,8 @@ abstract class Auth_Controller extends FHC_Controller
if (hasData($result)) {
if ($this->permissionlib->isEntitled(['a' => $permMa], 'a'))
return 0;
$res = 1;
$isMitarbeiter = true;
$res += 1;
}
$this->PersonModel->addJoin('public.tbl_prestudent', 'person_id');
$result = $this->PersonModel->load($person_id);
@@ -140,8 +146,15 @@ abstract class Auth_Controller extends FHC_Controller
return 0;
}
}
$isStudent = true;
$res += 2;
}
if (isset($permDefault) && !$isMitarbeiter && !$isStudent)
{
if ($this->permissionlib->isEntitled(['a' => $permDefault], 'a'))
return 0;
$res += 4;
}
return $res;
}
+70
View File
@@ -515,3 +515,73 @@ function has_permissions_for_stg($studiengang_kz, $permissions = '')
return false;
}
/**
* check if an entry exists in the database
*/
function is_in_db($key, $model = '')
{
if (!$model)
return false;
$field = strstr($model, ":");
if ($field) {
$model = strstr($model, ":", true);
$field = substr($field, 1);
}
$CI =& get_instance();
$CI->load->model($model, $model);
if ($field) {
$result = $CI->$model->loadWhere([
$field => $key
]);
} else {
$result = $CI->$model->load($key);
}
return (isSuccess($result) && hasData($result));
}
/**
* is building an array for Dropdown Entry in Print Dropdown
* @param $id id for the Document to add to the Document Array
* @param $name title of the dropdownEntry
* @param $parameterUrl url of parameters xml, xsl, format etc as needed
* WITHOUT BASEURL eg. "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf"
* @param $uid default parameter, if null only parameterurl will be added
* additional needed parameter: put in the parameterUrl
* @param $alternativeBaseUrl: if baseUrl not pdfExport.php, put here alternative without ? char, eg. "zutrittskarte.php"
*
* @return Array
*/
function buildDropdownEntryPrintArray($id, $name, $parameterurl, $uid=null, $order=null, $alternativeBaseUrl=null)
{
//DEFAULT BASEURL
$baseurl = "pdfExport.php?";
$uidString = $uid ? "&uid=" . $uid : "";
if($alternativeBaseUrl)
{
return [
"id" => $id,
"type" => "documenturl",
"name" => $name,
"url" => $alternativeBaseUrl . "?" . $parameterurl . $uidString,
"order" => $order
];
}
else
return [
"id" => $id,
"type" => "documenturl",
"name" => $name,
"url" => $baseurl . $parameterurl . "&uid=" . $uid,
"order" => $order
];
}
@@ -246,3 +246,10 @@ function generateSkipLink($skipID)
$toPrint.='" class="fhcSkipLink" aria-label="Skip to main content"></a>';
echo $toPrint;
}
function absoluteJsImportUrl($relurl)
{
$ci =& get_instance();
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
return $url;
}
@@ -41,3 +41,4 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
$lang['form_validation_has_write_permissions'] = 'You have no rights to edit {field} field.';
$lang['form_validation_is_valid_date'] = 'The date format is invalid or out of range.';
$lang['form_validation_has_permissions_for_stg'] = 'You have no rights for stg {field}.';
$lang['form_validation_is_in_db'] = '{field} does not exist.';
+10 -2
View File
@@ -17,6 +17,7 @@ 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->library('PhrasesLib', array('lehre'));
}
public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
@@ -35,7 +36,7 @@ class LektorLib
if (isError($already_assigned)) return $already_assigned;
if (hasData($already_assigned)) return error('Lektor already assigned');
if (hasData($already_assigned)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
if (isError($studiensemester_result)) return $studiensemester_result;
@@ -88,6 +89,7 @@ class LektorLib
$lehreinheit = getData($lehreinheit_result)[0];
//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)
{
@@ -98,7 +100,13 @@ class LektorLib
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (hasData($verplant))
return error('Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist!');
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));
if (hasData($lehreinheit_data))
return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
}
$warning = '';
if (isset($new_data['semesterstunden']))
+236 -5
View File
@@ -35,6 +35,90 @@ class PrestudentLib
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
/**
* Sets initial prestudent entry, no status yet.
* @return object success or error
*/
public function setPrestudent(
$person_id,
$studiengang_kz,
$ausbildungscode,
$anmerkung,
$foerderrelevant
)
{
// Prestudent anlegen
$data = [
'aufmerksamdurch_kurzbz' => 'k.A.',
'person_id' => $person_id,
'studiengang_kz' => $studiengang_kz,
'ausbildungcode' => $ausbildungscode,
'anmerkung' => $anmerkung,
'reihungstestangetreten' => false,
'bismelden' => true,
'foerderrelevant' => $foerderrelevant,
'insertamum' => date('c'),
'insertvon' => getAuthUID()
];
// Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen
$this->_ci->PrestudentModel->addSelect('public.tbl_prestudent.*, public.tbl_person.vorname, public.tbl_person.nachname');
$this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id');
$this->_ci->PrestudentModel->addOrder('zgvmas_code');
$this->_ci->PrestudentModel->addOrder('zgv_code', 'DESC');
$this->_ci->PrestudentModel->addLimit(1);
$result = $this->_ci->PrestudentModel->loadWhere([
'person_id' => $person_id,
'zgv_code IS NOT NULL' => null
]);
if (isError($result)) return $result;
if (hasData($result)) {
$prestudent = getData($result)[0];
if ($prestudent->zgv_code) {
$data['zgv_code'] = $prestudent->zgv_code;
$data['zgvort'] = $prestudent->zgvort;
$data['zgvdatum'] = $prestudent->zgvdatum;
$data['zgvmas_code'] = $prestudent->zgvmas_code;
$data['zgvmaort'] = $prestudent->zgvmaort;
$data['zgvmadatum'] = $prestudent->zgvmadatum;
}
}
// Prestudent speichern
return $this->_ci->PrestudentModel->insert($data);
}
/**
* Sets first status of a prestudent.!
* @return object success or error
*/
public function setFirstStatus(
$prestudent_id,
$status_kurzbz,
$studiensemester_kurzbz,
$ausbildungssemester = null,
$orgform_kurzbz = null,
$studienplan_id = null
)
{
// Prestudent Rolle Anlegen
$data = [
'prestudent_id' => $prestudent_id,
'status_kurzbz' => $status_kurzbz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'ausbildungssemester' => $ausbildungssemester ?: 0,
'orgform_kurzbz' => $orgform_kurzbz ?: null,
'studienplan_id' => $studienplan_id ?: null,
'datum' => date('Y-m-d'),
'insertamum' => date('c'),
'insertvon' => getAuthUID()
];
return $this->_ci->PrestudentstatusModel->insert($data);
}
public function setAbbrecher(
$prestudent_id,
$studiensemester_kurzbz,
@@ -603,9 +687,6 @@ class PrestudentLib
$now = date('c');
$today = date('Y-m-d');
$jahr = mb_substr($studiensemester_kurzbz, 4, 2);
// Genererate Personenkennzeichen
$personenkennzeichen = $this->_ci->StudentModel->generateMatrikelnummer2(
$student_data->studiengang_kz,
@@ -615,8 +696,9 @@ class PrestudentLib
if (isError($personenkennzeichen))
return $personenkennzeichen;
$personenkennzeichen = getData($personenkennzeichen);
$jahr = mb_substr($personenkennzeichen, 0, 2);
// Generate UID
$uid = $this->_ci->StudentModel->generateUID(
$student_data->kurzbz,
@@ -889,6 +971,155 @@ class PrestudentLib
);
}
/**
* Creates an incoming, saves necessary data for an incoming.
* @param $prestudent_id existing prestudent, for which incoming entry is created
* @param $studiengang_kz Studiengang assigned to incoming
* @param $studiensemester_kurzbz start semester for incoming
* @return object success if incoming successfully saved, or error
*/
public function setFirstIncoming($prestudent_id, $studiengang_kz, $studiensemester_kurzbz, $orgform_kurzbz, $studienplan_id)
{
// Verband and Ausbildungssemester for incoming
$authUID = getAuthUID();
$incomingVerband = 'I';
$incomingAusbildungssemester = '0';
// get prestudent
$this->_ci->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
$this->_ci->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz');
$result = $this->_ci->PrestudentModel->load($prestudent_id);
if (isError($result)) return $result;
if (!hasData($result)) return error('No prestudent');
$student_data = getData($result)[0];
$result = $this->setFirstStatus(
$prestudent_id,
$this->_ci->PrestudentstatusModel::STATUS_INCOMING,
$studiensemester_kurzbz,
$incomingAusbildungssemester,
$orgform_kurzbz,
$studienplan_id
);
if (isError($result)) return $result;
if (!hasData($result)) return error('Error when adding prestudentstatus');
// generate Personenkennzeichen
$result = $this->_ci->StudentModel->generateMatrikelnummer2($studiengang_kz, $studiensemester_kurzbz);
if (isError($result)) return $result;
if (!hasData($result)) return error('No personenkennzeichen could be generated');
$personenkennzeichen = getData($result);
$jahr = mb_substr($personenkennzeichen, 0, 2);
$stg = mb_substr($personenkennzeichen, 3, 4);
$nachname_clean = mb_strtolower(sanitizeProblemChars($student_data->nachname));
$vorname_clean = mb_strtolower(sanitizeProblemChars($student_data->vorname));
$nachname_clean = str_replace(' ','_', $nachname_clean);
$vorname_clean = str_replace(' ','_', $vorname_clean);
// get Studiengang data
$result = $this->_ci->StudiengangModel->load(ltrim($stg, '0'));
if (isError($result)) return $result;
if (!hasData($result)) return error('No Studiengang');
$stgObj = getData($result)[0];
// gernerate uid
$result = $this->_ci->StudentModel->generateUID($stgObj->kurzbz, $jahr, $stgObj->typ, $personenkennzeichen, $vorname_clean, $nachname_clean);
if (isError($result)) return $result;
if (!hasData($result)) return error("UID could not be generated");
$uid = getData($result);
//Benutzerdatensatz anlegen
$benutzer = [
'uid' => $uid,
'person_id' => $student_data->person_id,
'aktiv' => true,
'aktivierungscode' => $this->_ci->BenutzerModel->generateActivationkey()
];
// Generate Alias
$alias = '';
if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true)
{
$result = $this->_ci->BenutzerModel->generateAliasFromName($student_data->vorname, $student_data->nachname);
if (isError($result))
return $result;
$alias = getData($result);
}
$benutzer['alias'] = $alias;
$benutzer['insertamum'] = date('Y-m-d H:i:s');
$benutzer['insertvon'] = $authUID;
$result = $this->_ci->BenutzerModel->insert($benutzer);
if (isError($result)) return $result;
// Studentendatensatz anlegen
$student = [
'student_uid' => $uid,
'matrikelnr' => $personenkennzeichen,
'prestudent_id' => $prestudent_id,
'studiengang_kz' => $studiengang_kz,
'semester' => $incomingAusbildungssemester,
'verband' => $incomingVerband,
'gruppe' => ' '
];
$result = $this->_ci->LehrverbandModel->loadWhere([
'studiengang_kz' => $student['studiengang_kz'],
'semester' => $student['semester'],
'verband' => $student['verband'],
'gruppe' => $student['gruppe']
]);
if (isError($result)) return $result;
if (!hasData($result))
{
// Add Lehrverband if it does not exist
$result = $this->_ci->LehrverbandModel->insert([
'studiengang_kz' => $student_data->studiengang_kz,
'semester' => $student['semester'],
'verband' => $student['verband'],
'gruppe' => $student['gruppe'],
'bezeichnung' => 'Incoming',
'aktiv' => true
]);
if (isError($result)) return $result;
}
// add student
$student['insertamum'] = date('Y-m-d H:i:s');
$student['insertvon'] = $authUID;
$result = $this->_ci->StudentModel->insert($student);
if (isError($result)) return $result;
// Add Studentlehrverband
$result = $this->_ci->StudentlehrverbandModel->insert([
'student_uid' => $uid,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $student_data->studiengang_kz,
'semester' => $incomingAusbildungssemester,
'verband' => $incomingVerband,
'gruppe' => ' ',
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => $authUID
]);
if (isError($result))
return $result;
return success($prestudent_id);
}
protected function setBasic($authUID, $now, $status_kurzbz, $prestudent_id, $studiensemester_kurzbz, $ausbildungssemester, $statusgrund_id = null)
{
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id);
@@ -402,6 +402,26 @@ class Vertrag_model extends DB_Model
return $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid, 'lehreinheit_id' => $lehreinheit_id));
}
public function getVertragById($vertrag_id)
{
$this->addSelect(
'tbl_vertrag.vertrag_id, vertragstyp_kurzbz, vertragsstunden, vertragsstunden_studiensemester_kurzbz, status.vertragsstatus_kurzbz,
status.bezeichnung AS vertragsstatus, tbl_vertrag.betrag, lema.semesterstunden, lema.stundensatz'
);
$this->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_vertrag.vertrag_id = lema.vertrag_id', 'LEFT');
$this->addJoin('
(
SELECT DISTINCT ON(vst.vertrag_id) vst.vertrag_id,
bezeichnung,
tbl_vertragsstatus.vertragsstatus_kurzbz
FROM lehre.tbl_vertrag_vertragsstatus vst
JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
ORDER BY vst.vertrag_id, datum DESC
) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT');
return $this->loadWhere(['tbl_vertrag.vertrag_id' => $vertrag_id]);
}
public function cancelVertrag($vertrag_id, $mitarbeiter_uid)
{
$vertrag = $this->load($vertrag_id);
+116
View File
@@ -1,5 +1,7 @@
<?php
use CI3_Events as Events;
class Prestudent_model extends DB_Model
{
/**
@@ -782,4 +784,118 @@ class Prestudent_model extends DB_Model
return $this->execQuery($query, array($person_id));
}
/**
* Adds a filter to the query builder
*
* @param array $filter
* @return boolean
*/
public function addFilter($filter)
{
if (!isset($filter['type']))
return false;
switch ($filter['type']) {
case 'konto':
$bt = '';
$stdsem = '';
$comp = '!=';
if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all')
$bt = ' AND buchungstyp_kurzbz=' . $this->escape($filter['buchungstyp_kurzbz']);
if (isset($filter['studiensemester_kurzbz']))
$stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']);
if (isset($filter['missing']) && $filter['missing']) {
$comp = '=';
$this->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming');
}
$this->db->where('(
SELECT count(*)
FROM public.tbl_konto
WHERE person_id=tbl_prestudent.person_id
' . $bt . '
' . $stdsem . '
) ' . $comp, 0);
break;
case 'konto_counter':
$bt = '';
$samestg = '';
$past = '';
if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all')
$bt = ' AND buchungstyp_kurzbz = ' . $this->escape($filter['buchungstyp_kurzbz']);
if (isset($filter['samestg']) && $filter['samestg'])
$samestg = ' AND studiengang_kz = tbl_prestudent.studiengang_kz';
if (isset($filter['past']) && $filter['past'])
$past = ' AND buchungsdatum < NOW()';
$this->db->where('(
SELECT sum(betrag)
FROM public.tbl_konto
WHERE person_id = tbl_prestudent.person_id
' . $bt . '
' . $samestg . '
' . $past . '
) !=', 0);
break;
case 'zgv':
$this->db
->group_start()
->group_start()
->where('zgv_code IS NOT NULL')
->where('zgvdatum IS NULL')
->group_end()
->or_group_start()
->where('zgvmas_code IS NOT NULL')
->where('zgvmadatum IS NULL')
->group_end()
->or_group_start()
->where('zgvdoktor_code IS NOT NULL')
->where('zgvdoktordatum IS NULL')
->group_end()
->group_end();
break;
case 'documents':
$this->db->where('(
SELECT count(*)
FROM public.tbl_dokumentstudiengang
WHERE dokument_kurzbz NOT IN (
SELECT dokument_kurzbz
FROM tbl_dokumentprestudent
WHERE prestudent_id=tbl_prestudent.prestudent_id
)
AND studiengang_kz=tbl_prestudent.studiengang_kz
) !=', 0);
break;
case 'statusgrund':
if (!isset($filter['statusgrund_id']))
return false;
if (isset($filter['studiensemester_kurzbz']))
$stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']);
$this->db->where('(
SELECT count(*)
FROM public.tbl_prestudentstatus
WHERE prestudent_id = tbl_prestudent.prestudent_id
AND statusgrund_id = ' . $this->escape($filter['statusgrund_id']) . '
' . $stdsem . '
) !=', 0);
break;
}
Events::trigger('prestudent_add_filter', $filter);
return true;
}
}
@@ -290,7 +290,11 @@ class Prestudentstatus_model extends DB_Model
*/
public function getLastStatusPerson($person_id, $studiensemester_kurzbz = null)
{
$query = 'SELECT *
$query = 'SELECT p.*, ps.*, s.*,
stg.kurzbz AS studiengang_kurzbz, stg.kurzbzlang AS studiengang_kurzbzlang,
UPPER(typ::varchar(1) || kurzbz) AS studiengang_kuerzel,
stg.typ AS studiengang_typ, stg.bezeichnung AS studiengang_bezeichnung, stg.english AS studiengang_bezeichnung_english,
stg.orgform_kurzbz AS studiengang_orgform
FROM public.tbl_prestudent p
JOIN (
SELECT DISTINCT ON(prestudent_id) *
@@ -298,7 +302,8 @@ class Prestudentstatus_model extends DB_Model
WHERE prestudent_id IN (SELECT prestudent_id FROM public.tbl_prestudent WHERE person_id = ?)
ORDER BY prestudent_id, datum desc, insertamum desc
) ps USING(prestudent_id)
JOIN public.tbl_status USING(status_kurzbz)';
JOIN public.tbl_status s USING(status_kurzbz)
JOIN public.tbl_studiengang stg USING (studiengang_kz)';
$parametersArray = array($person_id);
+2 -2
View File
@@ -27,7 +27,7 @@ class Student_model extends DB_Model
$this->addSelect('1');
$result = $this->loadWhere(array('student_uid' => $uid));
if(hasData($result))
{
@@ -169,7 +169,7 @@ class Student_model extends DB_Model
$max = 0;
if ($matrikelnrres && hasData($matrikelnrres)) {
$max = mb_substr($matrikelnrres->retval[0]->matrikelnr, 7);
$max = mb_substr(trim(getData($matrikelnrres)[0]->matrikelnr), -3);
if (!is_numeric($max)) {
$max = (int)$max;
}
@@ -651,7 +651,13 @@ EOSQL;
ELSE NULL
END
END,
' '
' '
ORDER BY
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz),
COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), ''),
COALESCE(TRIM(tbl_lehreinheitgruppe.verband), ''),
COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), ''),
COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')
) AS gruppen
FROM lehre.tbl_lehreinheitgruppe
LEFT JOIN public.tbl_studiengang USING (studiengang_kz)
@@ -374,7 +374,7 @@ class Lehreinheitgruppe_model extends DB_Model
return success('Group assigned successfully to Lehreinheit');
}
else
return error('Group already assigned');
return error($this->p->t('lehre', 'grpbereitszugeteilt'));
}
public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id)
@@ -401,7 +401,7 @@ class Lehreinheitgruppe_model extends DB_Model
$stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (hasData($stundenplan_result))
return error('Gruppe already verplant');
return error($this->p->t('lehre', 'grpbereitsverplant'));
$delete_result = $this->delete($lehreinheitgruppe_id);
@@ -316,8 +316,8 @@ class Lehrveranstaltung_model extends DB_Model
(SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_student.prestudent_id ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status,
tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student,
tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid,
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung,
tbl_student.prestudent_id
FROM
campus.vw_student_lehrveranstaltung
JOIN public.tbl_benutzer USING(uid)
@@ -386,6 +386,37 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz));
}
/**
* Get LV-Leitung of given Lehrveranstaltung ID and Studiensemester.
*
* @param $lehrveranstaltung_id
* @param $studiensemester
* @return array|stdClass|null
*/
public function getLvLeitung($lehrveranstaltung_id, $studiensemester)
{
$params = [$lehrveranstaltung_id, $studiensemester];
$qry = "
SELECT
vorname, nachname, mitarbeiter_uid, lehrfunktion_kurzbz
FROM
lehre.tbl_lehreinheit
JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id)
JOIN public.tbl_benutzer b ON b.uid = lema.mitarbeiter_uid
JOIN public.tbl_person p using (person_id)
WHERE
tbl_lehreinheit.lehrveranstaltung_id= ?
AND tbl_lehreinheit.studiensemester_kurzbz = ?
AND lehrfunktion_kurzbz = 'LV-Leitung'
ORDER BY
lema.insertamum DESC
LIMIT 1
";
return $this->execQuery($qry, $params);
}
/**
* Gets all Leiter of Lehrveranstaltungsorganisationseinheit
* @param $lehrveranstaltung_id
@@ -1255,4 +1286,61 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execReadOnlyQuery($qry, $params);
}
/**
* Gets Lehrveranstaltungen for a student, as needed for a Projektarbeit.
* @param student_uid
* @param studiengang_kz optional, all Lvs of this Studiengang will be included
* @param additional_lehrveranstaltung_id optional, this lv will be added to result
* @return object success or error
*/
public function getLvsForProjektarbeit($student_uid, $studiengang_kz = null, $additional_lehrveranstaltung_id = null)
{
$params = array($student_uid, $student_uid);
$qry = "
SELECT *
FROM
lehre.tbl_lehrveranstaltung
WHERE
(
lehrveranstaltung_id IN (
SELECT
lehrveranstaltung_id
FROM
campus.vw_student_lehrveranstaltung
WHERE
uid=?
UNION
SELECT
lehrveranstaltung_id
FROM
lehre.tbl_zeugnisnote
WHERE
student_uid=?
)";
if (isset($studiengang_kz))
{
$params[] = $studiengang_kz;
$qry .= " OR (studiengang_kz = ? AND semester IS NOT NULL)";
}
if (isset($additional_lehrveranstaltung_id))
{
$params[] = $additional_lehrveranstaltung_id;
$qry .= " OR lehrveranstaltung_id = ?";
}
$qry .= "
)
AND projektarbeit = TRUE
ORDER BY
semester, bezeichnung";
return $this->execQuery($qry, $params);
}
}
@@ -24,16 +24,28 @@ class Projektarbeit_model extends DB_Model
public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null)
{
$qry = "SELECT
tbl_projektarbeit.* , tbl_projekttyp.bezeichnung
pa.*, tbl_projekttyp.bezeichnung,
tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id,
tbl_firma.name AS firma_name,
(
SELECT
STRING_AGG(trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')), ', ')
FROM
lehre.tbl_projektbetreuer
JOIN public.tbl_person USING (person_id)
WHERE
projektarbeit_id = pa.projektarbeit_id
AND student_uid = pa.student_uid
GROUP BY projektarbeit_id
) AS projektbetreuer
FROM
lehre.tbl_projektarbeit
JOIN
lehre.tbl_projekttyp USING (projekttyp_kurzbz), lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung
lehre.tbl_projektarbeit pa
JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
LEFT JOIN public.tbl_firma USING (firma_id)
WHERE
tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND
tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND
tbl_projektarbeit.student_uid = ?";
pa.student_uid = ?";
$params = array($student_uid);
@@ -52,16 +64,16 @@ class Projektarbeit_model extends DB_Model
if (isset($projekttyp))
{
if (is_array($projekttyp))
$qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz IN ?';
$qry .= ' AND pa.projekttyp_kurzbz IN ?';
else
$qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz=?';
$qry .= ' AND pa.projekttyp_kurzbz=?';
$params[] = $projekttyp;
}
if (isset($final))
{
$qry .= ' AND tbl_projektarbeit.final=?';
$qry .= ' AND pa.final=?';
$params[] = $final;
}
@@ -261,4 +273,30 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
/**
*
* @param
* @return object success or error
*/
public function hasBerechtigungForProjektarbeit($projektarbeit_id)
{
if (!$projektarbeit_id || !is_numeric($projektarbeit_id))
return false;
$this->ProjektarbeitModel->addSelect('studiengang_kz');
$this->ProjektarbeitModel->addJoin('public.tbl_student', 'student_uid');
$result = $this->ProjektarbeitModel->load($projektarbeit_id);
if (isError($result) || !hasData($result))
return false;
$studiengang_kz = getData($result)[0]->studiengang_kz;
if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz))
return true;
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
return true;
return false;
}
}
@@ -10,6 +10,7 @@ class Projektbetreuer_model extends DB_Model
parent::__construct();
$this->dbTable = 'lehre.tbl_projektbetreuer';
$this->pk = array('betreuerart_kurzbz', 'projektarbeit_id', 'person_id');
$this->hasSequence = false;
}
/**
@@ -801,4 +801,73 @@ class Studiengang_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz));
}
/**
* Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen.
* Helpful to easily get Studiengänge the user is entitled for.
*
* @param $studiengang_kz_arr
* @param $studiensemester_kurzbz
* @return array|stdClass|null Returns one row per Studiengang. Not considering the Orgforms.
*/
public function getByStgs($studiengang_kz_arr, $studiensemester_kurzbz)
{
if (is_numeric($studiengang_kz_arr))
{
$studiengang_kz_arr = [$studiengang_kz_arr];
}
$qry = '
SELECT
DISTINCT stg.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel
FROM
public.tbl_studiengang stg
JOIN lehre.tbl_studienordnung sto USING(studiengang_kz)
JOIN lehre.tbl_studienplan stpl USING(studienordnung_id)
JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id)
WHERE
stg.studiengang_kz IN ?
AND stplsem.studiensemester_kurzbz = ?
ORDER BY
stg.kurzbzlang
';
return $this->execQuery($qry, [$studiengang_kz_arr, $studiensemester_kurzbz]);
}
/**
* Get OrgForms of given Studiengang and Studiensemester.
*
* @param $studiengang_kz
* @param $studiensemester_kurzbz
* @return array|stdClass|null
*/
public function getOrgformsByStg($studiengang_kz, $studiensemester_kurzbz)
{
$qry = '
SELECT
stpl.orgform_kurzbz
FROM
public.tbl_studiengang stg
JOIN lehre.tbl_studienordnung sto USING(studiengang_kz)
JOIN lehre.tbl_studienplan stpl USING(studienordnung_id)
JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id)
WHERE
stg.studiengang_kz = ?
AND stg.aktiv = TRUE
AND stplsem.studiensemester_kurzbz = ?
GROUP BY
stpl.orgform_kurzbz
ORDER BY
CASE stpl.orgform_kurzbz
WHEN \'VZ\' THEN 1
WHEN \'BB\' THEN 2
WHEN \'DUA\' THEN 3
ELSE 4
END,
stpl.orgform_kurzbz;
';
return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]);
}
}
@@ -157,7 +157,6 @@ class Studienplan_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($lv_id));
}
public function getStudienplaeneForPerson($person_id)
{
$this->addDistinct();
@@ -207,7 +207,6 @@ class Notiz_model extends DB_Model
";
return $this->execQuery($qry, array($type, $id));
}
+14 -5
View File
@@ -151,12 +151,21 @@ class Person_model extends DB_Model
*/
public function searchPerson($filter)
{
$this->addSelect('vorname, nachname, gebdatum, person_id');
$this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost');
$this->addSelect("CASE
WHEN EXISTS
(SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id)
THEN 'Mitarbeiter'
WHEN EXISTS
(SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id)
THEN 'Student'
ELSE 'Person'
END AS status");
$result = $this->loadWhere(
'lower(nachname) like '.$this->db->escape('%'.$filter.'%')."
'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')."
OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')."
OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.$filter.'%')."
OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.$filter.'%')
OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')."
OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')
);
return $result;
@@ -411,4 +420,4 @@ class Person_model extends DB_Model
return success($result);
}
}
}
}
@@ -135,7 +135,8 @@ class Profil_update_model extends DB_Model
attachment_id,
UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang,
COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform,
NULL as oezuordnung
NULL as oezuordnung,
tbl_student.semester
FROM public.tbl_profil_update
JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status
JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid
+14 -7
View File
@@ -12,17 +12,24 @@ class Firma_model extends DB_Model
$this->pk = 'firma_id';
}
public function searchFirmen($filter)
public function searchFirmen($filter, $aktiv = null)
{
$params = [];
$filter = strtoLower($filter);
$qry = "
SELECT
SELECT
f.name, f.firma_id
FROM
public.tbl_firma f
WHERE
lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
FROM
public.tbl_firma f
WHERE
lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
return $this->execQuery($qry);
if (isset($aktiv) && is_bool($aktiv))
{
$params[] = $aktiv;
$qry .= " AND aktiv = ?";
}
return $this->execQuery($qry, $params);
}
}
@@ -353,12 +353,14 @@ class Mitarbeiter_model extends DB_Model
{
$filter = strtoLower($filter);
$returnwert = "p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre";
if ($mode == "mitAkadGrad")
$returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
elseif ($mode == "ohneMaUid")
$returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
$returnwert .= ", CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
else
$returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$qry = "
SELECT " . $returnwert . "
@@ -373,7 +375,11 @@ class Mitarbeiter_model extends DB_Model
OR
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
(ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'";
(ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
lower(vorname || ' ' || nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')."
ORDER BY
p.nachname, p.vorname, b.uid, p.person_id";
return $this->execQuery($qry);
}
@@ -535,4 +535,53 @@ class Stundenplan_model extends DB_Model
return $this->execQuery($query, [$uid, $uid]);
}
/**
* Get Stundenplantermine for given Lehreinheit.
*
* @param $lehreinheit_id
* @return array|stdClass|null
*/
public function getTermineByLe($lehreinheit_id)
{
$qry = '
SELECT DISTINCT
datum
FROM
lehre.vw_stundenplan
WHERE
lehreinheit_id = ?
ORDER BY
datum ASC
';
return $this->execQuery($qry, [$lehreinheit_id]);
}
/**
* Get Stundenplantermine for given Lehrveranstaltung of given Studiensemester.
*
* @param $lehrveranstaltung_id
* @param $studiensemester_kurzbz
* @return array|stdClass|null
*/
public function getTermineByLv($lehrveranstaltung_id, $studiensemester_kurzbz)
{
$qry = '
SELECT DISTINCT
datum
FROM
lehre.vw_stundenplan
WHERE
lehreinheit_id IN (
SELECT lehreinheit_id
FROM lehre.tbl_lehreinheit
WHERE lehrveranstaltung_id = ?
AND studiensemester_kurzbz = ?
)
ORDER BY datum ASC
';
return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]);
}
}
@@ -2,7 +2,7 @@
class Stundensatz_model extends DB_Model
{
/**
* Constructor
*/
@@ -43,6 +43,107 @@ class Stundensatz_model extends DB_Model
return $this->execQuery($qry, $params);
}
public function getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz)
{
$this->load->config('stv');
$defaultStundensatz = $this->config->item('tabs')['projektarbeit']['defaultProjektbetreuerStundensatz'];
$stundensatz = '';
if(isset($person_id) && isset($studiensemester_kurzbz))
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addSelect('start, ende');
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
if (hasData($result))
{
$studiensemester = getData($result)[0];
if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ)
{
// load Mitarbeiter
$params = [$person_id];
$qry = "
SELECT
mitarbeiter_uid, fixangestellt
FROM
public.tbl_mitarbeiter
JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid)
WHERE
person_id=?
ORDER BY
tbl_mitarbeiter.insertamum DESC NULLS LAST
LIMIT 1";
$result = $this->execQuery($qry, $params);
if (hasData($result))
{
$ma = getData($result)[0];
$this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
$echterdv_result = $this->DienstverhaeltnisModel->existsDienstverhaeltnis(
$ma->mitarbeiter_uid,
$studiensemester->start,
$studiensemester->ende,
'echterdv'
);
if (hasData($echterdv_result))
{
$stundensatz = null;
}
else
{
$stundensatzRes = $this->getStundensatzByDatum(
$ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'
);
if (hasData($stundensatzRes))
$stundensatz = getData($stundensatzRes)[0]->stundensatz;
else
$stundensatz = '0.00';
}
}
else
{
$stundensatz = '0.00';
}
}
else
{
$params = [$person_id, $studiensemester->ende, $studiensemester->start];
$qry = "SELECT ss.stundensatz
FROM hr.tbl_stundensatz ss
JOIN public.tbl_mitarbeiter ON ss.uid = tbl_mitarbeiter.mitarbeiter_uid
JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid)
WHERE person_id=?
AND stundensatztyp = 'lehre'
AND gueltig_von <= ?
AND (gueltig_bis >= ? OR gueltig_bis IS NULL)
ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1";
$result = $this->execQuery($qry, $params);
if (hasData($result))
{
$stundensatz = getData($result)[0]->stundensatz;
}
else
{
$stundensatz = $defaultStundensatz;
}
}
}
}
return $stundensatz;
}
public function getDefaultStundensatz($mitarbeiter_uid, $beginn, $ende = null, $typ = null)
{
$stundensatz_result = $this->getStundensatzByDatum($mitarbeiter_uid, $beginn, $ende, $typ);
@@ -58,4 +159,4 @@ class Stundensatz_model extends DB_Model
}
return $default_stundensatz;
}
}
}
@@ -254,22 +254,16 @@ EOSQL;
return $dvs;
}
public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende = null, $vertragsart_kurzbz = null)
public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende, $vertragsart_kurzbz)
{
$this->addOrder('von', 'DESC');
$this->db->where('mitarbeiter_uid', $mitarbeiter_uid);
if (!is_null($vertragsart_kurzbz))
$this->db->where('vertragsart_kurzbz', $this->escape($vertragsart_kurzbz));
$this->db->where('vertragsart_kurzbz', $vertragsart_kurzbz);
$this->db->where('von <=', $ende);
if (!is_null($ende))
{
$this->db->group_start();
$this->db->where('bis >=', $start);
$this->db->or_where('bis IS NULL', null, false);
$this->db->group_end();
}
$this->db->group_start();
$this->db->where('bis >=', $start);
$this->db->or_where('bis IS NULL', null, false);
$this->db->group_end();
$this->addLimit(1);
return $this->load();
+4
View File
@@ -40,6 +40,10 @@ $configArray = [
cis-root="<?= CIS_ROOT; ?>"
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
:config="<?= htmlspecialchars(json_encode($configArray)); ?>"
<?php if($ids !== null && $typeid !== null) { ?>
:id ="<?= htmlspecialchars(json_encode($ids)); ?>"
type-id ="<?= htmlspecialchars($typeid); ?>"
<?php } ?>
>
</router-view>
</div>
+4 -1
View File
@@ -22,7 +22,8 @@
'public/css/components/function.css'
],
'customJSs' => [
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js'
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js',
'vendor/moment/luxonjs/luxon.min.js'
#'vendor/npm-asset/primevue/tree/tree.min.js',
#'vendor/npm-asset/primevue/toast/toast.min.js'
],
@@ -53,6 +54,8 @@ $configArray = [
active-addons="<?= defined('ACTIVE_ADDONS') ? ACTIVE_ADDONS : ''; ?>"
stv-root="<?= site_url('Studentenverwaltung'); ?>"
cis-root="<?= CIS_ROOT; ?>"
avatar-url="<?= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
logout-url="<?= site_url('Cis/Auth/logout'); ?>"
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
:config="<?= htmlspecialchars(json_encode($configArray)); ?>"
>
@@ -0,0 +1,47 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Info Center',
'jquery3' => true,
'jqueryui1' => true,
'jquerycheckboxes1' => true,
'bootstrap3' => true,
'fontawesome4' => true,
'sbadmintemplate3' => true,
'tablesorter2' => true,
'ajaxlib' => true,
'filterwidget' => true,
'navigationwidget' => true,
'dialoglib' => true,
'phrases' => array(
'person' => array('vorname', 'nachname'),
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
)
);
?>
<div id="wrapper">
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
Electronic Onboarding
</h3>
</div>
</div>
<div>
<?php $this->load->view('system/infocenter/onboardingData.php'); ?>
</div>
</div>
</div>
</div>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,116 @@
<?php
$APP = '\'infocenter\'';
$KENNZEICHEN = '\'eobRegistrierungsId\'';
$query = '
SELECT
p.person_id AS "PersonId",
p.vorname AS "Vorname",
p.nachname AS "Nachname",
pl.zeitpunkt AS "LockDate",
pl.lockuser AS "LockUser",
rueck.datum_bis AS "HoldDate",
rueck.bezeichnung AS "Rueckstellgrund"
FROM public.tbl_person p
JOIN tbl_kennzeichen ON p.person_id = tbl_kennzeichen.person_id AND kennzeichentyp_kurzbz = '. $KENNZEICHEN .'
LEFT JOIN (
SELECT tpl.person_id,
tpl.zeitpunkt,
sp.nachname AS lockuser
FROM system.tbl_person_lock tpl
JOIN public.tbl_benutzer sb USING (uid)
JOIN public.tbl_person sp ON sb.person_id = sp.person_id
WHERE tpl.app = '.$APP.'
) pl ON p.person_id = pl.person_id
LEFT JOIN (
SELECT
tbl_rueckstellung.person_id,
tbl_rueckstellung.datum_bis,
tbl_rueckstellung.status_kurzbz,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
FROM public.tbl_rueckstellung
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id
WHERE tbl_rueckstellung.rueckstellung_id =
(
SELECT srueck.rueckstellung_id
FROM public.tbl_rueckstellung srueck
WHERE srueck.person_id = tbl_rueckstellung.person_id
AND datum_bis >= NOW()
ORDER BY srueck.datum_bis DESC LIMIT 1
)
) rueck ON rueck.person_id = p.person_id
WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)';
$filterWidgetArray = array(
'query' => $query,
'app' => InfoCenter::APP,
'datasetName' => 'onboarding',
'filter_id' => $this->input->get('filter_id'),
'requiredPermissions' => 'infocenter',
'datasetRepresentation' => 'tablesorter',
'checkboxes' => 'PersonId',
'additionalColumns' => array('Details'),
'columnsAliases' => array(
'PersonId',
ucfirst($this->p->t('person', 'vorname')) ,
ucfirst($this->p->t('person', 'nachname')),
ucfirst($this->p->t('global', 'sperrdatum')),
ucfirst($this->p->t('global', 'gesperrtVon')),
ucfirst($this->p->t('infocenter', 'rueckstelldatum')),
ucfirst($this->p->t('infocenter', 'rueckstellgrund')),
),
'formatRow' => function($datasetRaw) {
/* NOTE: Dont use $this here for PHP Version compatibility */
$datasetRaw->{'Details'} = sprintf(
'<a href="%s?person_id=%s&origin_page=%s&fhc_controller_id=%s&prev_filter_id=%s">Details</a>',
site_url('system/infocenter/InfoCenter/showDetails'),
$datasetRaw->{'PersonId'},
'onboarding',
(isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''),
(isset($_GET['filter_id']) ? $_GET['filter_id'] : '')
);
if ($datasetRaw->{'LockDate'} == null)
{
$datasetRaw->{'LockDate'} = '-';
}
if ($datasetRaw->{'LockUser'} == null)
{
$datasetRaw->{'LockUser'} = '-';
}
if ($datasetRaw->{'HoldDate'} == null)
{
$datasetRaw->{'HoldDate'} = '-';
}
else
{
$datasetRaw->{'HoldDate'} = date_format(date_create($datasetRaw->{'HoldDate'}), 'Y-m-d H:i');
}
if ($datasetRaw->{'Rueckstellgrund'} === null)
{
$datasetRaw->{'Rueckstellgrund'} = '-';
}
return $datasetRaw;
},
'markRow' => function($datasetRaw) {
if ($datasetRaw->LockDate != null)
{
return FilterWidget::DEFAULT_MARK_ROW_CLASS;
}
}
);
echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray);
?>
@@ -106,6 +106,7 @@
<tbody>
<?php
$lastMailAdress = '';
$lastUnverifiedMailAdress = '';
foreach ($stammdaten->kontakte as $kontakt): ?>
<tr>
<?php if ($kontakt->kontakttyp === 'email'): ?>
@@ -119,14 +120,16 @@
<?php echo '<span class="kontakt '.$kontakt->kontakttyp.'" data-id="'. $kontakt->kontakt_id .'" data-value="' . $kontakt->kontakt .'">';?>
<?php if ($kontakt->kontakttyp === 'email'): ?>
<a href="mailto:<?php echo $kontakt->kontakt; ?>" target="_top">
<?php $lastMailAdress = $kontakt->kontakt;
<?php $lastMailAdress = $kontakt->kontakt; ?>
<?php elseif ($kontakt->kontakttyp === 'email_unverifiziert'): ?>
<?php $lastUnverifiedMailAdress = $kontakt->kontakt;
endif;
echo $kontakt->kontakt;
if ($kontakt->kontakttyp === 'email'):
if ($kontakt->kontakttyp === 'email'):
?>
</a>
<?php endif; ?>
<?php echo '</span>'?>
<?php endif; ?>
<?php echo '</span>'?>
</td>
<td><?php echo $kontakt->anmerkung; ?></td>
</tr>
@@ -140,9 +143,9 @@
<?php if (isset($adresse)): ?>
<div class="row adresse col-sm-12" data-id="<?php echo $adresse->adresse_id ?>">
<div class="float-left" data-value="<?php echo $adresse->strasse ?>" data-type="strasse"><?php echo $adresse->strasse ?></div>
<div class="float-left" data-value="<?php echo $adresse->plz ?>" data-type="plz"><?php echo $adresse->plz ?></div>
<div class="float-left" data-value="<?php echo $adresse->ort ?>" data-type="ort"><?php echo $adresse->ort ?></div>
<?php if (isset($adresse->nationkurztext)): ?>
@@ -182,7 +185,8 @@
</div>
<?php if (isset($stammdaten->zugangscode)): ?>
<div class="col-xs-6 text-right">
<a href="<?php echo CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.html_escape($stammdaten->zugangscode).'&emailAdresse='.$lastMailAdress.'&keepEmailUnverified=true' ?>"
<a href="<?php echo CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.html_escape($stammdaten->zugangscode)
.'&emailAdresse='.(isEmptyString($lastMailAdress)?$lastUnverifiedMailAdress:$lastMailAdress).'&keepEmailUnverified=true' ?>"
target='_blank'><i class="glyphicon glyphicon-new-window"></i>&nbsp;<?php echo $this->p->t('infocenter','zugangBewerbung') ?></a>
</div>
<?php endif; ?>
+2 -9
View File
@@ -107,16 +107,10 @@ if(isset($_GET['getAnmeldung']))
$abgeschlossen = false;
$semesterlock = false;
$regelerfuellt = true;
if ($kompatible_lv)
{
$lvregelExists = $lvregel->exists($kompatible_lv);
if($lvregelExists)
{
if($lvregel->isAbgeschlossen($uid, $kompatible_lv))
$abgeschlossen=true;
else
$abgeschlossen=false;
}
if(!$lvregel->checkSemester($kompatible_lv, $semester))
{
@@ -135,7 +129,7 @@ if(isset($_GET['getAnmeldung']))
}
}
if (!(($lvregelExists && !$abgeschlossen) || $semesterlock || !$regelerfuellt))
if (!$semesterlock && $regelerfuellt)
{
$anzahl++;
// LV wird angeboten und Anmeldefenster ist offen
@@ -152,7 +146,6 @@ if(isset($_GET['getAnmeldung']))
echo '<br><input type="radio" disabled="true" value="'.$lvid.'" name="lv" /><span class="ok">'.$lv->bezeichnung.'</span><img src="../../../skin/images/information.png" title="'.$p->t('studienplan/bereitsAngemeldet').'"/>';
}
}
}
/* else
{
+15
View File
@@ -0,0 +1,15 @@
(function () {
function sendMessage() {
let frame = window.frames['content'];
if (frame)
frame.postMessage({ type: "proctoringReady" });
}
window.addEventListener("message", function (e)
{
if (e.data.indexOf("proctoringReady_") === 0)
{
sendMessage();
}
});
})();
+30
View File
@@ -0,0 +1,30 @@
.proctoring-blocker
{
position: fixed;
inset: 0;
z-index: 99999;
backdrop-filter: blur(6px);
pointer-events: all;
user-select: none;
}
.proctoring-blocker.hidden
{
display: none !important;
}
.proctoring-text
{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #fff;
font-size: 16px;
font-family: sans-serif;
}
.proctoring-blur-fallback
{
filter: blur(6px);
}
+7 -1
View File
@@ -45,7 +45,7 @@ if (!$db = new basis_db())
$PHP_SELF=$_SERVER["PHP_SELF"];
// Start session
session_start();
require_once './session_init.php';
// If language is changed by language select menu, reset language variables
if (isset($_GET['sprache_user']) && !empty($_GET['sprache_user']))
@@ -182,6 +182,12 @@ echo '
if(!isset($_SESSION['pruefling_id']))
die($p->t('testtool/bitteZuerstAnmelden'));
if (!empty($_SESSION['externe_ueberwachung']) && isset($_SESSION['externe_ueberwachung_verified'])): ?>
<link href="frage.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="frage_externe_ueberwachung.js"></script>
<div id="proctoringBlocker" class="proctoring-blocker hidden"></div>
<?php endif;
$pruefling = new pruefling();
$pruefling->load($_SESSION['pruefling_id']);
@@ -0,0 +1,53 @@
(function () {
let ok = false;
let blocker;
function showBlocker() {
blocker = document.getElementById("proctoringBlocker");
if (!blocker)
{
blocker = document.createElement("div");
blocker.id = "proctoringBlocker";
blocker.className = "proctoring-blocker";
blocker.innerHTML = '<div class="proctoring-text">Loading...</div>';
document.body.appendChild(blocker);
}
document.documentElement.classList.add("proctoring-blur-fallback");
}
function block() {
showBlocker();
blocker.classList.remove("hidden");
}
function unblock() {
document.documentElement.classList.remove("proctoring-blur-fallback");
if (!blocker) return;
blocker.classList.add("hidden");
}
const blockTimer = setTimeout(function () {
if (!ok)
block();
}, 1500);
window.addEventListener("message", function (e) {
const data = e.data || {};
if (data.type === "proctoringReady")
{
ok = true;
clearTimeout(blockTimer);
unblock();
}
});
setTimeout(function () {
if (!ok) {
top.location.href = "resetconnection.php";
}
}, 3000);
})();
+64
View File
@@ -1,16 +1,79 @@
<?php
$contentpage = 'login.php';
require_once './session_init.php';
if(isset($_GET['prestudent']) && is_numeric($_GET['prestudent']))
{
$contentpage = 'login.php?prestudent='.$_GET['prestudent'];
}
if ((isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true) &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === false)
{
header("Location: resetconnection.php");
exit;
}
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>TestTool - FH Technikum Wien</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../skin/style.css.php" rel="stylesheet" type="text/css">
<?php
if (!empty($_SESSION['externe_ueberwachung'])) : ?>
<script type="text/javascript" src="externeueberwachung.js"></script>
<script>
function loadInContent(url)
{
if (url.includes('logout=true'))
{
return doLogout(url);
}
let frame = document.getElementById('content_testtool');
if (frame)
{
frame.src = url;
}
}
function doLogout(url)
{
fetch(url)
let topbarFrame = window.frames['topbar'];
let menuFrame = window.frames['menu'];
let contentFrame = window.frames['content'];
if (contentFrame)
contentFrame.location.href = 'logout.html';
if (menuFrame)
menuFrame.location.href = menuFrame.location.pathname;
if (topbarFrame)
topbarFrame.location.href = topbarFrame.location.pathname;
return false;
}
function changeSprache(content_params, sprache)
{
let topbarFrame = window.frames['topbar'];
let menuFrame = window.frames['menu'];
let contentFrame = window.frames['content'];
if (topbarFrame)
topbarFrame.location.href = topbarFrame.location.pathname + '?sprache_user=' + sprache;
if (menuFrame)
menuFrame.location.href = menuFrame.location.pathname + '?sprache_user=' + sprache;
if (contentFrame)
contentFrame.location.href = contentFrame.location.pathname + '?' + content_params;
}
</script>
<?php endif; ?>
</head>
<frameset rows="13%,*" cols="*" frameborder="NO" border="0" framespacing="0">
@@ -26,3 +89,4 @@ if(isset($_GET['prestudent']) && is_numeric($_GET['prestudent']))
</noframes>
</frameset>
</html>
+23 -12
View File
@@ -40,8 +40,7 @@ if (!$db = new basis_db())
die('Fehler beim Oeffnen der Datenbankverbindung');
// Start session
session_start();
require_once './session_init.php';
// Logout (triggered by logout button in menu.php)
if (isset($_GET['logout']) && $_GET['logout'] == true)
{
@@ -173,6 +172,12 @@ if (isset($_REQUEST['prestudent']))
else
$reload_menu = true;
}
if ($rt->externe_ueberwachung && defined('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED') && TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED)
{
$_SESSION['externe_ueberwachung'] = true;
$_SESSION['externe_ueberwachung_verified'] = false;
}
}
$pruefling = new pruefling();
@@ -339,6 +344,8 @@ if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) ||
(isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])))
{
$pruefling = new pruefling();
@@ -447,14 +454,6 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id']))
{
e.preventDefault();
});
// If Browser is any other than Mozilla Firefox and the test includes any MathML,
// show message to use Mozilla Firefox
var ua = navigator.userAgent;
if ((ua.indexOf("Firefox") > -1) == false)
{
$("#alertmsgdiv").html("<div class='alert alert-danger'>BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!<br>(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.<br><br>PLEASE USE MOZILLA FIREFOX BROWSER!<br>(Otherwise some exam items will not be displayed correctly</div>");
//alert('BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!\n(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.\n\nPLEASE USE MOZILLA FIREFOX BROWSER!\n(Ohterwise some exam items will not be displayed correctly.)');
}
});
</script>
<?php
@@ -468,7 +467,13 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id']))
<?php
if (isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
if ((isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true) &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === false)
{
echo "<script> top.location.href = 'resetconnection.php';</script>";
exit;
}
else if (isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === false)
{
echo '
@@ -726,7 +731,7 @@ else // LOGIN Site (vor Login)
echo '<script>
function changeconfirmation()
{
document.getElementById("confirmationSubmit").disabled = !document.getElementById("confirmationCheckbox").checked;
document.getElementById("confirmationSubmit").disabled = !document.getElementById("confirmationCheckbox").checked || !document.getElementById("dsgvoconfirm").checked || !document.getElementById("procotoringconfirm").checked;
}
</script>';
echo '<div class="row text-center">
@@ -736,6 +741,12 @@ else // LOGIN Site (vor Login)
<input id="confirmationCheckbox" type="checkbox" name="confirmation" onclick="changeconfirmation()" />
'.$p->t('testtool/confirmationText').'
<br><br>
<input id="dsgvoconfirm" type="checkbox" name="confirmation" onclick="changeconfirmation()" />
'.$p->t('testtool/dsgvoConfirmText').'
<br><br>
<input id="procotoringconfirm" type="checkbox" name="confirmation" onclick="changeconfirmation()" />
'.$p->t('testtool/procotoringConfirmText').'
<br><br>
<button id="confirmationSubmit" type="submit" class="btn btn-primary" disabled/>
'.$p->t('testtool/start').'
</button>
+31 -29
View File
@@ -34,7 +34,7 @@ if (!$db = new basis_db())
die('Fehler beim Oeffnen der Datenbankverbindung');
// Start session
session_start();
require_once './session_init.php';
// If language is changed by language select menu, reset language and session variables
if(isset($_GET['sprache_user']) && !empty($_GET['sprache_user']))
@@ -61,8 +61,12 @@ $p = new phrasen($sprache_user);
<?php
$gebiet_hasMathML = false; // true, wenn irgendein Gebiet eine/n Frage/Vorschlag im MathML-Format enthält
$invalid_gebiete = false;
if (isset($_SESSION['pruefling_id']))
if ((isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true) &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === false)
{
exit;
}
else if (isset($_SESSION['pruefling_id']))
{
//content_id fuer Einfuehrung auslesen
$qry = "SELECT content_id FROM testtool.tbl_ablauf_vorgaben WHERE studiengang_kz=".$db->db_add_param($_SESSION['studiengang_kz'])." LIMIT 1";
@@ -73,7 +77,7 @@ if (isset($_SESSION['pruefling_id']))
// Link zur Startseite
echo '<tr><td class="ItemTesttool" style="margin-left: 20px;" nowrap>
<a class="ItemTesttool navButton" href="login.php" target="content">'.$p->t('testtool/startseite').'</a>
<a class="ItemTesttool navButton" href="login.php" onclick="return loadContent(this.href);">'.$p->t('testtool/startseite').'</a>
</td></tr>';
// Link zur Einleitung
@@ -83,7 +87,7 @@ if (isset($_SESSION['pruefling_id']))
{
echo '
<tr id="tr-einleitung"><td class="ItemTesttool" style="margin-left: 20px;" nowrap>
<a class="ItemTesttool navButton" href="../../cms/content.php?content_id='.$content_id->content_id.'&sprache='.$sprache_user.'" target="content">'.$p->t('testtool/einleitung').'</a>
<a class="ItemTesttool navButton" href="../../cms/content.php?content_id='.$content_id->content_id.'&sprache='.$sprache_user.'" onclick="return loadContent(this.href);">'.$p->t('testtool/einleitung').'</a>
</td></tr>
';
}
@@ -379,10 +383,13 @@ if (isset($_SESSION['pruefling_id']))
}
}
echo '<tr>
<!--<td width="10" class="ItemTesttoolLeft" nowrap>&nbsp;</td>-->
<td class="'.$class.'">
<a class="'.$class.'" href="frage.php?gebiet_id='.$row->gebiet_id.'" onclick="document.location.reload()" target="content" style="'.$style.'">'.$gebietbezeichnung.'</a>
<a class="'.$class.'" href="frage.php?gebiet_id='.$row->gebiet_id.'" onclick="return loadContent(this.href);" style="'.$style.'">'.$gebietbezeichnung.'</a>
</td>
<!--<td width="10" class="ItemTesttoolRight" nowrap>&nbsp;</td>-->
</tr>';
@@ -401,7 +408,7 @@ if (isset($_SESSION['pruefling_id']))
// Link zum Logout
echo '<tr><td class="ItemTesttool" style="margin-left: 20px;" nowrap>
<a class="ItemTesttool navButton" href="login.php?logout=true" target="content">Logout</a>
<a class="ItemTesttool navButton" href="login.php?logout=true" onclick="return loadContent(this.href);">Logout</a>
</td></tr>';
echo '</td></tr></table>';
@@ -425,28 +432,6 @@ else
e.preventDefault();
});
});
// Get users Browser
var ua = navigator.userAgent;
// If Browser is any other than Mozilla Firefox and the test includes any MathML,
// show message to use Mozilla Firefox
if ((ua.indexOf("Firefox") > -1) == false)
{
let hasMathML = "<?php echo (isset($gebiet_hasMathML)?$gebiet_hasMathML:''); ?>";
let userLang = "<?php echo $sprache_user; ?>";
if (hasMathML == true)
{
if (userLang == 'German')
{
alert('BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!\n(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.)');
}
else if(userLang == 'English')
{
alert('PLEASE USE MOZILLA FIREFOX BROWSER!\n(Ohterwise some exam items will not be displayed correctly.)');
}
}
}
// Error massage if check_gebiet function returns false
$(function() {
var invalid_gebiete = "<?php echo (isset($invalid_gebiete)?$invalid_gebiete:''); ?>";
@@ -461,5 +446,22 @@ else
'</td></tr>');
}
});
function loadContent(url)
{
if (parent && typeof parent.loadInContent === 'function')
{
parent.loadInContent(url);
return false;
}
let frame = parent?.frames?.["content"];
if (frame)
{
frame.location.href = url;
return false;
}
}
</script>
</html>
+18
View File
@@ -0,0 +1,18 @@
<?php
require_once './session_init.php';
require_once('../../config/cis.config.inc.php');
require_once('../../config/global.config.inc.php');
require_once '../../include/externe_ueberwachung.class.php';
if (!$db = new basis_db())
die('Fehler beim Oeffnen der Datenbankverbindung');
if ((defined('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED') && TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED) && isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true)
{
$ueberwachung = new externeUeberwachung();
$url = $ueberwachung->start($_SESSION['prestudent_id'], $_SESSION['reihungstestID'], $_SESSION['sprache']);
$urlSafe = htmlspecialchars($url, ENT_QUOTES);
header("Location: $urlSafe");
$_SESSION['externe_ueberwachung_verified'] = true;
}
+11
View File
@@ -0,0 +1,11 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_set_cookie_params(
0,
'/; samesite=None',
'',
true,
true
);
session_start();
}
+11 -3
View File
@@ -67,9 +67,17 @@ function changeSprache(sprache)
content_params.set('sprache_user', sprache); // add or replace sprache_user
// Pass GET-param sprache_user to topbar.php, menu.php and content (login.php or frage.php) and refresh the frames.
location.href = location.pathname + '?sprache_user=' + sprache; // refreshes topbar.php
parent.menu.location.href = parent.menu.location.pathname + '?sprache_user=' + sprache; // refreshes menu.php
parent.content.location.href = parent.content.location.pathname + '?' + content_params; // refreshes login.php or frage.php
if (parent && typeof parent.changeSprache === 'function')
{
parent.changeSprache(content_params, sprache);
return false;
}
else
{
location.href = location.pathname + '?sprache_user=' + sprache; // refreshes topbar.php
parent.menu.location.href = parent.menu.location.pathname + '?sprache_user=' + sprache; // refreshes menu.php
parent.content.location.href = parent.content.location.pathname + '?' + content_params; // refreshes login.php or frage.php
}
}
$(document).on("keydown", function (e) {
+1
View File
@@ -456,6 +456,7 @@
"fortawesome/font-awesome4": "4.7.*",
"fortawesome/font-awesome6": "6.1.*",
"fzaninotto/faker": "1.*",
"firebase/php-jwt": "^6.0",
"highcharts/highcharts-dist": "^7.1.2",
Generated
+58 -1
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "1de37a74ba51a66057eb2712b21340c8",
"content-hash": "f4f0af4586f46f97d8b6092c1ac0fb3a",
"packages": [
{
"name": "afarkas/html5shiv",
@@ -882,6 +882,63 @@
},
"type": "library"
},
{
"name": "firebase/php-jwt",
"version": "v6.0.0",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
"reference": "0541cba75ab108ef901985e68055a92646c73534"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/0541cba75ab108ef901985e68055a92646c73534",
"reference": "0541cba75ab108ef901985e68055a92646c73534",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": ">=4.8 <=9"
},
"suggest": {
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
},
"type": "library",
"autoload": {
"psr-4": {
"Firebase\\JWT\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Neuman Vong",
"email": "neuman+pear@twilio.com",
"role": "Developer"
},
{
"name": "Anant Narayanan",
"email": "anant@php.net",
"role": "Developer"
}
],
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
"homepage": "https://github.com/firebase/php-jwt",
"keywords": [
"jwt",
"php"
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
"source": "https://github.com/firebase/php-jwt/tree/v6.0.0"
},
"time": "2022-01-24T15:18:34+00:00"
},
{
"name": "fortawesome/font-awesome4",
"version": "4.7.0",
+12
View File
@@ -301,4 +301,16 @@ define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,111]);
// Weiterleiten zu CIS neu (wenn Rechte vorhanden)
define('CIS_REDIRECT_TO_CIS4', false);
//Externe Ueberwachung
define('EXTERNE_UEBERWACHUNG_PROTOCOL_URL', 'https://example.com');
define('EXTERNE_UEBERWACHUNG_SECRET_KEY', null);
define('EXTERNE_UEBERWACHUNG_INTEGRATION_NAME', 'example');
define('EXTERNE_UEBERWACHUNG_SESSION_URL', 'https://example.com');
define('EXTERNE_UEBERWACHUNG_TRIAL_TEST', false);
define('EXTERNE_UEBERWACHUNG_EXAM_PARAMS', []);
define('EXTERNE_UEBERWACHUNG_EXAM_RULES', []);
define('EXTERNE_UEBERWACHUNG_EXAM_SCORE', []);
?>
+11
View File
@@ -28,11 +28,15 @@ define('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN',false);
define('CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN', true);
define('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN', true);
define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN', true);
define('CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN', true);
// Wenn gesetzt, werden die Digitale Anwesenheit-Icons nur fuer diese Studiengaenge angezeigt, sonst für alle
// define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_STG', serialize(array('257')));
// define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_LVA', serialize(array('39455','39481','39480','41906','41905','41904','39459','39512','39454','39482','42230','42231','39458','41921','41922','39457','42896')));
// Wenn gesetzt, werden die LV-Evaluierung-Icons nur für diese Studiengaenge angezeigt, sonst alle
define('CIS_EVALUIERUNG_ANZEIGEN_STG', serialize((array('335', '585', '914', '298')))); // BIW, MAI, BUB, MIO
// Im CIS Menue Links bei Modulen anzeigen wenn Lehrauftrag
define('CIS_LEHRVERANSTALTUNG_MODULE_LINK',true);
@@ -360,4 +364,11 @@ define('SANCHO_MAIL_HEADER_IMG', 'sancho_header_DEFAULT.jpg');
// footer image for eigene Mails
define('SANCHO_MAIL_FOOTER_IMG', 'sancho_footer_DEFAULT.jpg');
// Gibt an, ob in der StudVW der Status vorgerueckt werden kann
define('STATUS_VORRUECKEN_ANZEIGEN', true);
//externe Ueberwachung im Testtool erlauben
define('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED', false);
?>
+5
View File
@@ -62,6 +62,11 @@ if(!$rechte->isBerechtigt('student/noten',$studiengang_kz, 's'))
$semester = isset($_GET['semester'])?$_GET['semester']:'';
$typ = isset($_GET['typ'])?$_GET['typ']:'';
if(isset($_GET['studiensemester']) && preg_match('/[WS]S[0-9]{4}/', $_GET['studiensemester']))
{
$semester_aktuell = $_GET['studiensemester'];
}
if($semester=='')
die('Bitte ein Semester auswaehlen');
@@ -64,6 +64,11 @@ if (!$rechte->isBerechtigt('student/noten', $studiengang_kz, 's'))
$semester = isset($_GET['semester']) ? $_GET['semester'] : '';
$typ = isset($_GET['typ']) ? $_GET['typ'] : '';
if(isset($_GET['studiensemester']) && preg_match('/[WS]S[0-9]{4}/', $_GET['studiensemester']))
{
$semester_aktuell = $_GET['studiensemester'];
}
if ($semester == '')
die('Bitte ein Semester auswaehlen');
+6 -6
View File
@@ -178,7 +178,7 @@ class File_CSV
return $field;
}
if ($quote && $field{0} == $quote && $field{strlen($field)-1} == $quote) {
if ($quote && $field[0] == $quote && $field[strlen($field) - 1] == $quote) {
return substr($field, 1, -1);
}
return $field;
@@ -230,7 +230,7 @@ class File_CSV
} elseif ($c == "\n" || $c == "\r") {
$sub = ($prev == "\r") ? 2 : 1;
if ((strlen($buff) >= $sub) &&
($buff{strlen($buff) - $sub} == $quote))
($buff[strlen($buff) - $sub] == $quote))
{
$in_quote = false;
}
@@ -312,9 +312,9 @@ class File_CSV
$last =& $fields[count($fields) - 1];
// Fallback to read the line with readQuoted when guess
// that the simple explode won't work right
if (($last{strlen($last) - 1} == "\n"
&& $last{0} == $conf['quote']
&& $last{strlen(rtrim($last)) - 1} != $conf['quote'])
if (($last[strlen($last) - 1] == "\n"
&& $last[0] == $conf['quote']
&& $last[strlen(rtrim($last)) - 1] != $conf['quote'])
||
(count($fields) != $conf['fields'])
// XXX perhaps there is a separator inside a quoted field
@@ -511,4 +511,4 @@ class File_CSV
return true;
}
}
?>
?>
+5 -5
View File
@@ -96,7 +96,7 @@ class File_Util
{
if (File_Util::isAbsolute($path)) {
if (FILE_WIN32) {
return substr($path, $path{3} == '\\' ? 4 : 3);
return substr($path, $path[3] == '\\' ? 4 : 3);
}
return ltrim($path, '/');
}
@@ -182,7 +182,7 @@ class File_Util
if (FILE_WIN32) {
return preg_match('/^[a-zA-Z]:(\\\|\/)/', $path);
}
return ($path{0} == '/') || ($path{0} == '~');
return ($path[0] == '/') || ($path[0] == '~');
}
/**
@@ -244,11 +244,11 @@ class File_Util
} else {
$cwd = getcwd();
$drive = substr($cwd, 0, 2);
if ($path{0} !== $separator{0}) {
if ($path[0] !== $separator[0]) {
$path = substr($cwd, 3) . $separator . $path;
}
}
} elseif ($path{0} !== $separator) {
} elseif ($path[0] !== $separator) {
$path = getcwd() . $separator . $path;
}
@@ -323,7 +323,7 @@ class File_Util
$entries = array();
for ($dir = dir($path); false !== $entry = $dir->read(); ) {
if ($list & FILE_LIST_DOTS || $entry{0} !== '.') {
if ($list & FILE_LIST_DOTS || $entry[0] !== '.') {
$isRef = ($entry === '.' || $entry === '..');
$isDir = $isRef || is_dir($path .'/'. $entry);
if ( ((!$isDir && $list & FILE_LIST_FILES) ||
+216
View File
@@ -0,0 +1,216 @@
<?php
require_once(dirname(__FILE__).'/basis_db.class.php');
require_once(dirname(__FILE__).'/prestudent.class.php');
require_once(dirname(__FILE__).'/person.class.php');
require_once(dirname(__FILE__).'/reihungstest.class.php');
require_once(dirname(__FILE__).'/../vendor/autoload.php');
use Firebase\JWT\JWT;
class externeUeberwachung extends basis_db
{
public function __construct()
{
parent::__construct();
}
public function getStatusByPrestudent($prestudent_id)
{
$session_id = $this->getSessionByPrestudent($prestudent_id);
return $this->getSessionStatus($session_id);
}
public function start($prestudent_id, $reihungstest_id, $sprache)
{
$session_id = $this->getSessionByPrestudent($prestudent_id);
if (!$session_id)
{
$session_id = $this->createSession($prestudent_id);
}
else
{
$status = $this->getSessionStatus($session_id);
if (in_array($status, array('late_to_start', 'finished')))
{
$session_id = $this->createSession($prestudent_id);
}
}
$payload = $this->getPayload($session_id, $prestudent_id, $reihungstest_id, $sprache);
return $this->getStartUrl($payload);
}
private function createSession($prestudent_id)
{
if (is_null($prestudent_id))
{
$this->errormsg = 'Falsche Parameterübergabe';
return false;
}
$uuid = $this->genereateUUID();
$qry = "INSERT INTO testtool.tbl_externe_ueberwachung (prestudent_id, session_id)
VALUES (".
$this->db_add_param($prestudent_id).",".
$this->db_add_param($uuid).")";
if($this->db_query($qry))
{
return $uuid;
}
else
{
$this->errormsg = 'Fehler beim Speichern der Antwort';
return false;
}
}
public function getSessionByPrestudent($prestudent_id)
{
if (is_null($prestudent_id))
{
$this->errormsg = 'Falsche Parameterübergabe';
return false;
}
$qry = "SELECT session_id
FROM testtool.tbl_externe_ueberwachung
WHERE prestudent_id = ".$this->db_add_param($prestudent_id, FHC_INTEGER) . "
ORDER BY insertamum DESC
LIMIT 1";
if($result = $this->db_query($qry))
{
if ($row = $this->db_fetch_object($result))
{
return $row->session_id;
}
else
{
$this->errormsg = 'Daten konnten nicht geladen werden';
return false;
}
}
else
{
$this->errormsg = 'Fehler bei einer Abfrage';
return false;
}
}
public function getSessionStatus($session_id)
{
$payload = $this->getSessionPayload($session_id);
$jwt = $this->createToken($payload);
$url = $this->getSessionUrl($session_id);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: JWT {$jwt}",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
return isset($data['status']) ? $data['status'] : false;
}
private function getSessionPayload($session_id)
{
return [
"session_id" => $session_id,
"iat" => time(),
"exp" => time() + 120,
];
}
private function getPayload($session_id, $prestudent_id, $reihungstest_id, $sprache)
{
$prestudent = new prestudent($prestudent_id);
$person = new Person($prestudent->person_id);
$reihungstest = new Reihungstest($reihungstest_id);
$datetime = new DateTime();
$today = $datetime->format('Y-m-d');
$payload = [
"userId" => $prestudent_id,
"lastName" => $person->nachname,
"firstName" => $person->vorname,
"language" => $sprache === 'German' ? 'de' : 'en',
"accountName" => "technikum_wien",
"accountId" => "technikum_wien",
"examId" => $reihungstest_id . '_' . $today,
"examName" => !is_null(trim($reihungstest->anmerkung)) ? ($reihungstest->anmerkung . '_' . $today) : ($reihungstest_id . '_' . $today),
"duration" => 1440,
"schedule" => false,
"trial" => EXTERNE_UEBERWACHUNG_TRIAL_TEST,
"proctoring" => "offline",
"startDate" => $reihungstest->datum . 'T00:00:00Z',
"endDate" => $reihungstest->datum . 'T23:59:59Z',
"sessionId" => $session_id,
"sessionUrl" => EXTERNE_UEBERWACHUNG_SESSION_URL
];
if (defined('EXTERNE_UEBERWACHUNG_EXAM_PARAMS'))
{
$payload = array_merge($payload, EXTERNE_UEBERWACHUNG_EXAM_PARAMS);
}
if (defined('EXTERNE_UEBERWACHUNG_EXAM_RULES'))
{
$payload['rules'] = EXTERNE_UEBERWACHUNG_EXAM_RULES;
}
if (defined('EXTERNE_UEBERWACHUNG_EXAM_SCORE'))
{
$payload['scoreConfig'] = EXTERNE_UEBERWACHUNG_EXAM_SCORE;
}
return $payload;
}
private function getSessionUrl($session_id)
{
return EXTERNE_UEBERWACHUNG_PROTOCOL_URL . "/api/v2/integration/simple/". EXTERNE_UEBERWACHUNG_INTEGRATION_NAME . "/sessions/". urlencode($session_id) ."/status/";
}
private function getStartUrl($payload)
{
$token = $this->createToken($payload);
$query = http_build_query(['token' => $token]);
return EXTERNE_UEBERWACHUNG_PROTOCOL_URL . '/integration/simple/'. EXTERNE_UEBERWACHUNG_INTEGRATION_NAME .'/start?' . $query;
}
private function createToken($payload)
{
return JWT::encode($payload, EXTERNE_UEBERWACHUNG_SECRET_KEY, 'HS256');
}
private function genereateUUID()
{
$data = openssl_random_pseudo_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
}
?>
+1 -1
View File
@@ -240,7 +240,7 @@ class filter extends basis_db
{
//$value->value = preg_replace('/(.*?)selected=.selected./', '$1', $value->value);
//$value->value = preg_replace('/(.*?)\s*[selected=?selected?]/', '$1', $value->value);
//$value->value = preg_replace('/(.*?)\s*selected="selected"\s*/', '${1}', $value->value);
//$value->value = preg_replace('/(.*?)\s*selected="selected"\s*/', '$[1]', $value->value);
//$value->value = preg_replace('/^\s*selected=.*?selected.*?\s*/', ' ', $value->value);
//$value->value = str_replace('selected=', '', $value->value);
+25 -3
View File
@@ -70,6 +70,7 @@ class lehrveranstaltung extends basis_db
public $farbe;
public $lehrauftrag=true;
public $lehrveranstaltung_template_id; // integer
public $evaluierung=true; // boolean
public $studienplan_lehrveranstaltung_id;
@@ -170,6 +171,7 @@ class lehrveranstaltung extends basis_db
$this->benotung = $this->db_parse_bool($row->benotung);
$this->lvinfo = $this->db_parse_bool($row->lvinfo);
$this->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$this->evaluierung = $this->db_parse_bool($row->evaluierung);
// FIXME: LV-Bezeichnung richtig mehrsprachig machen
// Zwischenzeitlich 'Italian' zum bezeichnung_arr dazugegeben
@@ -244,6 +246,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -394,6 +397,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['Italian'] = $row->bezeichnung;
@@ -524,6 +528,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -607,6 +612,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -779,7 +785,7 @@ class lehrveranstaltung extends basis_db
insertvon, planfaktor, planlektoren, planpersonalkosten, plankostenprolektor, updateamum, updatevon, sort,
zeugnis, projektarbeit, sprache, koordinator, bezeichnung_english, orgform_kurzbz, incoming, lehrtyp_kurzbz, oe_kurzbz,
raumtyp_kurzbz, anzahlsemester, semesterwochen, lvnr, semester_alternativ, farbe, lehrveranstaltung_template_id,sws,lvs,alvs,lvps,las,benotung,lvinfo,
lehrauftrag, lehrmodus_kurzbz) VALUES ('.
lehrauftrag, lehrmodus_kurzbz, evaluierung) VALUES ('.
$this->db_add_param($this->studiengang_kz). ', '.
$this->db_add_param($this->bezeichnung). ', '.
$this->db_add_param($this->kurzbz). ', '.
@@ -824,7 +830,8 @@ class lehrveranstaltung extends basis_db
$this->db_add_param($this->benotung, FHC_BOOLEAN).','.
$this->db_add_param($this->lvinfo, FHC_BOOLEAN).','.
$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).','.
$this->db_add_param($this->lehrmodus_kurzbz)
$this->db_add_param($this->lehrmodus_kurzbz).','.
$this->db_add_param($this->evaluierung, FHC_BOOLEAN)
.');';
}
else
@@ -880,7 +887,8 @@ class lehrveranstaltung extends basis_db
'las = '.$this->db_add_param($this->las).', '.
'benotung = '.$this->db_add_param($this->benotung, FHC_BOOLEAN).', '.
'lvinfo = '.$this->db_add_param($this->lvinfo, FHC_BOOLEAN).', '.
'lehrauftrag = '.$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).' '.
'lehrauftrag = '.$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).', '.
'evaluierung = '.$this->db_add_param($this->evaluierung, FHC_BOOLEAN).' '.
'WHERE lehrveranstaltung_id = ' . $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER, false) . ';';
}
@@ -991,6 +999,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -1086,6 +1095,7 @@ class lehrveranstaltung extends basis_db
$l->benotung = $this->db_parse_bool($row->benotung);
$l->lvinfo = $this->db_parse_bool($row->lvinfo);
$l->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$l->evaluierung = $this->db_parse_bool($row->evaluierung);
$l->bezeichnung_arr['German'] = $row->bezeichnung;
$l->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -1170,6 +1180,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -1271,6 +1282,7 @@ class lehrveranstaltung extends basis_db
$obj->benotung = $this->db_parse_bool($row->benotung);
$obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$obj->bezeichnung_arr['German'] = $row->bezeichnung;
$obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -1396,6 +1408,7 @@ class lehrveranstaltung extends basis_db
$obj->lvinfo =$this->db_parse_bool( $lv->lvinfo);
$obj->zeugnis = $this->db_parse_bool($lv->zeugnis);
$obj->lehrauftrag = $this->db_parse_bool($lv->lehrauftrag);
$obj->evaluierung = $this->db_parse_bool($lv->evaluierung);
$values[] = $obj;
@@ -1422,6 +1435,7 @@ class lehrveranstaltung extends basis_db
$obj->lvinfo =$this->db_parse_bool( $this->lvinfo);
$obj->zeugnis = $this->db_parse_bool($this->zeugnis);
$obj->lehrauftrag = $this->db_parse_bool($this->lehrauftrag);
$obj->evaluierung = $this->db_parse_bool($this->evaluierung);
$values[] = $obj;
}
@@ -1476,6 +1490,7 @@ class lehrveranstaltung extends basis_db
$obj->export = $lv->export;
$obj->genehmigung = $lv->genehmigung;
$obj->lehrauftrag = $lv->lehrauftrag;
$obj->evaluierung = $lv->evaluierung;
$obj->lehre = $lv->lehre;
$obj->children = array();
if(count($lv->childs) > 0)
@@ -1507,6 +1522,7 @@ class lehrveranstaltung extends basis_db
$obj->zeugnis = $this->db_parse_bool($this->zeugnis);
$obj->curriculum = $this->db_parse_bool($this->curriculum);
$obj->lehrauftrag = $this->lehrauftrag;
$obj->evaluierung = $this->db_parse_bool($this->evaluierung);
$values[] = $obj;
}
@@ -1613,6 +1629,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -1700,6 +1717,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -1873,6 +1891,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -2003,6 +2022,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->studiengang_kurzbzlang = $row->studiengang_kurzbzlang;
@@ -2131,6 +2151,7 @@ class lehrveranstaltung extends basis_db
$lv_obj->benotung = $this->db_parse_bool($row->benotung);
$lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$lv_obj->bezeichnung_arr['German'] = $row->bezeichnung;
$lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
@@ -2402,6 +2423,7 @@ class lehrveranstaltung extends basis_db
$obj->benotung = $this->db_parse_bool($row->benotung);
$obj->lvinfo = $this->db_parse_bool($row->lvinfo);
$obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag);
$obj->evaluierung = $this->db_parse_bool($row->evaluierung);
$obj->bezeichnung_arr['German'] = $row->bezeichnung;
$obj->bezeichnung_arr['English'] = $row->bezeichnung_english;
+7 -3
View File
@@ -63,6 +63,7 @@ class reihungstest extends basis_db
public $zugangs_ueberpruefung = false; //boolean
public $zugangscode; //smallint
public $externe_ueberwachung = false; //boolean
/**
@@ -119,6 +120,7 @@ class reihungstest extends basis_db
$this->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz;
$this->zugangs_ueberpruefung = $this->db_parse_bool($row->zugangs_ueberpruefung);
$this->zugangscode = $row->zugangscode;
$this->externe_ueberwachung = $this->db_parse_bool($row->externe_ueberwachung);
return true;
}
@@ -234,7 +236,7 @@ class reihungstest extends basis_db
$qry = 'BEGIN; INSERT INTO public.tbl_reihungstest (studiengang_kz, ort_kurzbz, anmerkung, datum, uhrzeit,
insertamum, insertvon, updateamum, updatevon, max_teilnehmer, oeffentlich, freigeschaltet,
studiensemester_kurzbz, stufe, anmeldefrist, aufnahmegruppe_kurzbz, zugangs_ueberpruefung, zugangscode) VALUES('.
studiensemester_kurzbz, stufe, anmeldefrist, aufnahmegruppe_kurzbz, zugangs_ueberpruefung, zugangscode, externe_ueberwachung) VALUES('.
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
$this->db_add_param($this->ort_kurzbz).', '.
$this->db_add_param($this->anmerkung).', '.
@@ -250,7 +252,8 @@ class reihungstest extends basis_db
$this->db_add_param($this->anmeldefrist).','.
$this->db_add_param($this->aufnahmegruppe_kurzbz). ',' .
$this->db_add_param($this->zugangs_ueberpruefung, FHC_BOOLEAN).','.
$this->db_add_param($this->zugangscode) . ');';
$this->db_add_param($this->zugangscode) . ','.
$this->db_add_param($this->externe_ueberwachung, FHC_BOOLEAN) . ');';
}
else
{
@@ -270,7 +273,8 @@ class reihungstest extends basis_db
'anmeldefrist='.$this->db_add_param($this->anmeldefrist).', '.
'aufnahmegruppe_kurzbz='.$this->db_add_param($this->aufnahmegruppe_kurzbz).', '.
'zugangs_ueberpruefung='.$this->db_add_param($this->zugangs_ueberpruefung, FHC_BOOLEAN).', '.
'zugangscode='.$this->db_add_param($this->zugangscode).' '.
'zugangscode='.$this->db_add_param($this->zugangscode).', '.
'externe_ueberwachung='.$this->db_add_param($this->externe_ueberwachung, FHC_BOOLEAN).' '.
'WHERE reihungstest_id='.$this->db_add_param($this->reihungstest_id, FHC_INTEGER, false).';';
}
+1 -1
View File
@@ -1532,7 +1532,7 @@ class WavFile
} else {
// replace
for ($i = 0; $i < $sampleBytes; ++$i) {
$this->_samples{$offset + $i} = $sampleBinary{$i};
$this->_samples[$offset + $i] = $sampleBinary[$i];
}
}
+1 -1
View File
@@ -1435,7 +1435,7 @@ class Securimage
$length = strlen($code['display']);
for($i = 0; $i < $length; ++$i) {
$letter = $code['display']{$i};
$letter = $code['display'][$i];
$letters[] = $letter;
}
}
+21
View File
@@ -500,6 +500,27 @@ if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTU
);
}
// LV-Evaluierung NEU
if(defined('CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN')
&& CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN
&& $angemeldet
&& (!defined('CIS_EVALUIERUNG_ANZEIGEN_STG') || in_array($lv->studiengang_kz, unserialize(CIS_EVALUIERUNG_ANZEIGEN_STG)))
&& ($rechte->isBerechtigt('extension/lvevaluierung_init')))
{
$text='(Pilotphase)';
$link= APP_ROOT. 'index.ci.php/extensions/FHC-Core-Evaluierung/Initiierung?lehrveranstaltung_id='. urlencode($lv->lehrveranstaltung_id).'&studiensemester_kurzbz='.urlencode($angezeigtes_stsem);
$menu[]=array
(
'id'=>'extension_lvevaluierung_menu_initiierung',
'position'=>'140',
'name'=>$p->t('lvevaluierung/lvevaluierung'). ' - '. strtoupper($p->t('global/neu')),
'icon'=>'../../../skin/images/button_lvevaluierung.png',
'link'=> $link,
'text'=>$text
);
}
//************* Menuepunkte anzeigen ****************
+2
View File
@@ -53,6 +53,8 @@ $this->phrasen['testtool/fuerFolgendeStgAngemeldet']='Für folgende Studiengäng
$this->phrasen['testtool/invalideGebiete']='Ein oder mehrere Fragengebiet/e inkorrekt!<br>Bitte melden Sie dies der Betreuungsperson.';
$this->phrasen['testtool/confirmationText']='<b>Ich bestätige, den Online-Reihungstest persönlich, selbständig, ohne Hilfe einer zusätzlichen Person und ohne Hilfsmittel zu absolvieren.<br>
I confirm that I will complete the online placement test personally, independently, without the help of an additional person and without any aids.</b>';
$this->phrasen['testtool/dsgvoConfirmText']='<b>Ich habe die <a href ="'. APP_ROOT. 'cms/dms.php?id=373121" target="_blank">Datenschutzerklärung</a> gelesen.</b>';
$this->phrasen['testtool/procotoringConfirmText']='<b>Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu.</b>';
$this->phrasen['testtool/loginNoetig']='Bitte beachten Sie, dass der Reihungstest erst <b>unmittelbar</b> vor Ihrem <b>Reihungstesttermin</b> von uns aktiviert wird.<br>
Please note that the test will be activated by us <b>immediately</b> before your <b>placement test date</b>.';
$this->phrasen['testtool/start']='Reihungstest jetzt starten';
+2 -1
View File
@@ -407,6 +407,7 @@ html {
background-color: var(--fhc-background);
border-color: var(--fhc-border);
padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px);
min-width: 0; /* fix flex-grow with tabulator exceeding width */
}
#cis-main .fa-arrow-up-right-from-square {
@@ -854,4 +855,4 @@ html {
#cis-main .modal-footer {
background-color: var(--fhc-secondary);
}
}

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