Compare commits

...

668 Commits

Author SHA1 Message Date
Johann Hoffmann 7fe5a685f1 first attempt at semantically tagging DOM elements for automated testing in stv. cypress is able to navigate from verband tree -> student list -> student details -> tabs and assert various states. WIP writing the test itself more robust and developing more testcases; 2026-03-26 17:45:02 +01:00
Johann Hoffmann b05cd88f14 WIP defining sensible cy-data attributes and robust tests selecting on them 2026-03-24 14:34:43 +01:00
Harald Bamberger 9e6c15a10d Merge branch 'bug-76010/StudVW_Archivieren_Ausbildungsvertrag_Aufgenommene' 2026-03-19 15:41:44 +01:00
ma0068 7603f8f12b Bugfix: use null instead of empty string, provide kuerzel 2026-03-18 14:32:09 +01:00
Andreas Österreicher 96745525f1 Merge branch 'feature-71530/Error_beim_Archivieren_von_Diplomasupplement_STUDVW_Neu' 2026-03-16 11:28:56 +01:00
Andreas Österreicher 8d6e04ea77 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-03-16 11:09:52 +01:00
Andreas Österreicher d9e5acb52c Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-03-16 11:08:44 +01:00
Johann Hoffmann 6ec32b0ca3 update tabulator persistence id 2026-03-16 11:05:48 +01:00
Johann Hoffmann 4778bb82c3 assistenz action buttons lefthand alignment & lower minwidth 2026-03-16 10:56:51 +01:00
Andreas Österreicher e20ff52f5b Merge branch 'feature-75417/pep_finetuning' 2026-03-16 09:08:10 +01:00
Andreas Österreicher df05af98d2 FHB - Markierung von Outgoing ohne Endedatum 2026-03-16 09:01:33 +01:00
Harald Bamberger 0764a597af do not allow foto editing in contract management 2026-03-12 15:18:26 +01:00
Harald Bamberger 8c36fe585a filter component add missing this 2026-03-12 15:09:46 +01:00
Johann Hoffmann 5ef1dccfc9 added missing phrase c4noZuordnungBetreuerStudent 2026-03-12 14:58:35 +01:00
Harald Bamberger d4b81da437 fix filter component also consider tabulator 6 selectableRows option to determine if tabulator has selector 2026-03-12 14:34:42 +01:00
Harald Bamberger b91efb6189 stv notizperson fix permission check to be able to add notes to prestudents that do not have an uid 2026-03-12 13:56:03 +01:00
Johann Hoffmann 6d28b8986d Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektbetreuer.js
2026-03-12 09:47:54 +01:00
kindlm 40757322e7 Spalte "FGM" (Förder-Guthaben-Monate) bei Prestudentstatus einblendbar 2026-03-11 17:52:31 +01:00
Johann Hoffmann b43f1ec920 AbgabetoolAssistenz download latest uploaded file action button; UX changes Projektarbeit Tab Stv; fix stv form input bug after invalidation for selects; 2026-03-11 17:00:56 +01:00
Harald Bamberger 6cd4aebe8d stv projektarbeit projektbetreuer use correct ref 2026-03-11 14:54:06 +01:00
Andreas Österreicher 2b527bccd2 Merge branch 'feature-75873/Noteneingabe-Punkte' 2026-03-11 13:42:17 +01:00
Andreas Österreicher 41271711ec Merge branch 'bugfix-55630/Falsche-Nachpruefungsdaten-auf-Notenliste-bei-Wiederholern' into feature-75873/Noteneingabe-Punkte 2026-03-11 13:26:46 +01:00
Harald Bamberger 6287b6aef8 Merge branch 'feature-68296/Vue_Router_via_Extensions_erweitern_ma0080' 2026-03-11 13:19:02 +01:00
Harald Bamberger 3e9d960781 Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-03-11 12:52:18 +01:00
Harald Bamberger 5ce0232890 fix bug in archiv tab 2026-03-11 11:50:09 +01:00
Harald Bamberger cf4ec12c00 Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-03-10 17:08:03 +01:00
Andreas Österreicher d35eca919f Merge branch 'hotfix-69228/DOCSBOX' 2026-03-10 13:53:58 +01:00
Harald Bamberger 61d133b2fd Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-03-10 12:14:35 +01:00
Andreas Österreicher 7cd438d188 Wenn Punkteeingabe aktiviert ist werden auch Punkte in der Excel Notenliste exportiert damit es beim Import von Spezialnoten (zb 18) nicht zu Problemen kommt 2026-03-10 11:47:24 +01:00
Harald Bamberger a733d9a861 Merge branch 'vv_und_studvw_2026_02_rc4_ma0080' 2026-03-10 11:37:34 +01:00
Harald Bamberger 33252de895 use ma0646 tabulator scroll fix on students/prestudents list 2026-03-10 11:11:40 +01:00
Harald Bamberger fb388346bf Merge branch 'master' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-10 08:41:56 +01:00
Harald Bamberger 32a2e7708f remove bg color in stv and lvvw Tabs, detailsheader ajust foto buttons 2026-03-09 12:10:22 +01:00
Harald Bamberger c40fdb2c4f getMessagesForTable laststatus only for filteredmessages 2026-03-05 11:35:57 +01:00
Harald Bamberger 47b5eecb9b Merge branch 'master' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-04 18:57:13 +01:00
Harald Bamberger b7fd7e4298 Merge branch 'vv_und_studvw_2026_02_rc4' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-04 17:53:53 +01:00
Harald Bamberger 1af334989e Merge branch 'feature-71601/drag_drop_aus_tabulator_heraus_ohne_vorheriges_selektieren' into vv_und_studvw_2026_02_rc4 2026-03-04 17:53:19 +01:00
Harald Bamberger 4f541495ad Merge branch 'feature-71610/verbandsbaum_togglen_ohne_select' into vv_und_studvw_2026_02_rc4 2026-03-04 17:25:32 +01:00
Harald Bamberger 35d83942c0 use primevue tabs in LVVerwaltung 2026-03-04 16:03:51 +01:00
Harald Bamberger 1810bd40bd fix bug introduced in commit 043b1bcf11 send intern also using private email addresses 2026-03-04 09:39:58 +01:00
Harald Bamberger 5347cb1d63 add config STV_TAGS_ENABLED and use it to enable or disable tags in StudVw 2026-03-03 17:15:23 +01:00
Harald Bamberger 77731ed559 Merge branch 'feature-68767/FHC4_Studierendenverwaltung_Details_4spaltig_ma0080' into vv_und_studvw_2026_02_rc4_ma0080 2026-03-03 13:46:29 +01:00
Harald Bamberger 0283c6ca43 bg-color in details, padding-y tabs, messages align table and preview area 2026-03-03 12:24:34 +01:00
Andreas Österreicher 8abb38123a Merge branch 'feature-70440/Change_var_dump_to_error_log_to_show_the_referring_script' 2026-03-03 11:41:16 +01:00
Andreas Österreicher d1928d4151 Merge branch 'bug-56209/is_valid_date_vs_isValidDate' 2026-03-03 11:29:29 +01:00
Andreas Österreicher bcd8f11f35 Fixed Merge Problem 2026-03-03 11:26:18 +01:00
Andreas Österreicher 5949527ee2 Merge branch 'master' into bug-56209/is_valid_date_vs_isValidDate 2026-03-03 11:07:18 +01:00
Johann Hoffmann 56a6aa993e getMitarbeiterProjektarbeiten safeguard in case a person without any assigned betreuungen opens the page for some reason to avoid nasty confusing sql error messages from querying with empty parameters 2026-03-03 10:52:12 +01:00
Andreas Österreicher ea19ba099e Merge branch 'bug-70950/Coodle_ICS_Organizer_falsch' 2026-03-03 10:44:55 +01:00
Johann Hoffmann db75cd2f62 also skip email loop/relevant abgaben loop when every occurance is filtered out to avoid empty notification emails; 2026-03-03 10:42:47 +01:00
Harald Bamberger 28f4a38752 refactor helper function extendableApps to singleton helper class ExtendableAppsHelper and use it in FHC-Header and FHC-Footer, revert previous changes to other CI views 2026-02-27 16:50:50 +01:00
Andreas Österreicher 8495c74a7d Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-27 10:48:35 +01:00
Harald Bamberger 43a37021a5 ensure extend_app js files from extensions are loaded directly before the apps js file 2026-02-27 09:24:47 +01:00
Johann Hoffmann abeb411742 betreuer email button config 2026-02-26 18:00:14 +01:00
Johann Hoffmann aa2334afe7 sammelmail button betreuer page; fix notenOpt retrieval in setDetailComponent for Betreuer when reopening detailView; $emit("paUpdated") after savingTermin/deletingTermin to update projektarbeit in overview table aswell; 2026-02-26 17:58:48 +01:00
Harald Bamberger 667a00d64b Merge branch 'master' into feature-68296/Vue_Router_via_Extensions_erweitern_ma0080 2026-02-26 16:05:32 +01:00
Harald Bamberger 4deed45f29 prepend extend_app js to customJSModules array, use FhcApps in Dashboard/Fhc App 2026-02-26 15:53:41 +01:00
Harald Bamberger 1ae072390e revert changes to add fhcApps property, not using path based syntax, to CI views include array 2026-02-26 15:27:52 +01:00
Andreas Österreicher 9eb2cb847d Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-26 15:06:42 +01:00
Harald Bamberger 26fca87c75 refactor VueJs App magic into a helper function 2026-02-26 14:56:33 +01:00
ma0048 f3986688f2 selfoverview:
nur aktive kategorien anzeigen
uebersetzungen hinzugefuegt
2026-02-26 12:50:37 +01:00
Johann Hoffmann 859cb39a9d EmailJobs log & skip cases where no benutzer_uid email and no private email is available 2026-02-26 11:36:06 +01:00
Johann Hoffmann 4e2c3f7741 show qgate benotungsstatus of saved note, not currently selected note 2026-02-26 11:18:27 +01:00
Johann Hoffmann 325c84e6fe phrasen consistency "Short description of the submitted file" -> "Short description of the submitted document" + "Type of document submitted" 2026-02-25 13:31:00 +01:00
Johann Hoffmann 379880aef8 filter paabgabe uploads from newOrChanged job, since uploading a file still writes updateamum/updatevon fields -> compare student_uid with updatevon; when logging new paabgabe termine insert the whole paabgabe object into the logs, not just the result id; 2026-02-25 13:10:30 +01:00
Johann Hoffmann 16186bbee8 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-02-25 11:09:50 +01:00
Harald Bamberger ee0fa9f7d4 studvw reduce height of elements e.g:
- tabulator header filter
 - tabulator rows
 - form input and select
 - primevue autocomplete
 - primevue tabs
2026-02-24 17:23:50 +01:00
Harald Bamberger 7680a5c773 add bpk to api output if authuser has permission 2026-02-24 17:19:49 +01:00
Johann Hoffmann 1e827fffee additional erstbetreuer/zweitbetreuer name parts fetch & columns default invisible, columns next/prev termin header filter & custom sort func, list header filter for qgate 1/2 status assistenz & mitarbeiter, change all "Assessor" and "Assesor" phrasen to "Reviewer" 2026-02-24 15:58:44 +01:00
Harald Bamberger 0468b2b523 Merge branch 'master' into feature-68767/FHC4_Studierendenverwaltung_Details_4spaltig 2026-02-23 16:56:07 +01:00
Paolo d6108d816e Merge branch 'master' into hotfix-69228/DOCSBOX 2026-02-23 14:28:54 +01:00
Paolo f274b74ab1 Merge branch 'master' into feature-70440/Change_var_dump_to_error_log_to_show_the_referring_script 2026-02-23 14:25:40 +01:00
Paolo 029c51c2b2 Merge branch 'master' into bug-70950/Coodle_ICS_Organizer_falsch 2026-02-23 13:36:17 +01:00
Paolo 356a5fb51b Merge branch 'master' into bug-56209/is_valid_date_vs_isValidDate 2026-02-23 13:03:06 +01:00
Andreas Österreicher 9b114c5fb1 Merge branch 'feature-71344/LVEvaluierungZeitfenster' 2026-02-23 09:51:47 +01:00
Harald Bamberger 00fae2fa15 Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-23 09:28:54 +01:00
Johann Hoffmann 6c8eb9ac38 abgabetool dbupdate script check&insert new tbl_vorlage entry "PAANoSigAssSM" 2026-02-20 13:56:11 +01:00
Andreas Österreicher 2228b4d683 Sancho Header LV-Evaluierung 2026-02-20 13:29:01 +01:00
Johann Hoffmann 5558f6fc17 Signatur Sammelmail Job an Assistenz 2026-02-20 12:20:26 +01:00
kindlm 32fc029bd3 Merge remote-tracking branch 'origin/master' 2026-02-20 11:20:19 +01:00
kindlm f4e0516d89 Prüfung ob jede Fragen mindestens 2 Vorschläge hat auf Warning geändert
- Kleines Padding vor "Blättern"-Text
2026-02-20 11:20:09 +01:00
Harald Bamberger d98b7fd67a fix duplicates in lvplan for special groups 2026-02-19 18:34:27 +01:00
Johann Hoffmann 4b1a9fe892 avoid loading paabgaben a 2nd time for mitarbeiter; extracted getDateStyleClass from components; 2026-02-19 17:33:41 +01:00
ma0068 118dcbd252 remove testoutput 2026-02-19 15:45:34 +01:00
ma0068 d279f955a0 add emit-event for resetFilter 2026-02-19 15:12:38 +01:00
ma0068 1e8ec83965 add tileUid to StudentHeader, show Tiles only for selection of 1 student, just allow single selection of Mitarbeiter in MitarbeiterHeader 2026-02-19 11:57:28 +01:00
Harald Bamberger f2d49e02a7 Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-19 09:49:44 +01:00
Harald Bamberger 7169cb68a2 fix bug when sending multi messages introduced by loading time optimisation 2026-02-19 09:20:10 +01:00
Harald Bamberger f8da0b0915 Merge branch 'feature-69551/Einmeldeformular_als_VueJS_Component_fuer_LV-Evaluierung' 2026-02-19 07:46:15 +01:00
Alexei Karpenko f068b56083 PlausiIssueProducer: removed debugging output and die 2026-02-18 22:30:29 +01:00
Alexei Karpenko fa7a125727 Studierendenverwaltung archivieren: error message when no studentlehrverband found 2026-02-18 21:18:57 +01:00
Johann Hoffmann 4724008c2d betreuer page update table after adding serientermin qgate1/2 status prev/next; preserve scrollX/Y in betreuer/assistenz page 2026-02-18 14:32:57 +01:00
ma0068 34cd5d1a80 Filter List: only emit to updateURL if there is final dropdown result or change 2026-02-18 13:17:37 +01:00
Johann Hoffmann 6f28696556 getDateStyleClass evaluation also with precise luxon calculation on all pages; qgate12 status col, next/prev termin col on betreuer page; table persistence on mitarbeiter page; same rowheight on betreuer table as in assistenz to achieve similar UX; 2026-02-18 13:00:19 +01:00
Andreas Österreicher 6ec4737b22 Merge branch 'bug-71685/bewerbungstool_login_zugangscode' 2026-02-18 12:47:02 +01:00
Johann Hoffmann 328affa35c actually set deadline calculation to IANA timezone 'Europe/Vienna', so the code still works once Berlin moves to another timezone away from Austria. You never know. 2026-02-18 11:53:24 +01:00
ma0068 4b875bf019 also show filterActiveModule for HeaderFilters, change colour to red 2026-02-18 11:27:14 +01:00
Johann Hoffmann 90c845899f explicitely set deadline to end of day to achieve the desired "valid until 23:59" logic, instead of just moving the deadline by one day; endupload deadline is now optional by defining it as a "nachreichen möglich" aka non fixtermin; 2026-02-18 11:15:59 +01:00
Andreas Österreicher bb273d10bd Merge branch 'bug-71662/Bug_cancelVertrag_Berechtigungspruefung' 2026-02-18 10:50:59 +01:00
Johann Hoffmann a6daa7bf0c all abgabetool datepickers use date format via format="dd.MM.yyyy" instead of :format="formatDate" to enable text-input + autoapply; backend deadline datetime check for endupload; 2026-02-17 17:32:11 +01:00
ma0068 f0597e99e5 VV: update persistanceId 2026-02-17 16:51:56 +01:00
ma0048 1d8c4b7159 bug behoben, login wieder nur mit zugangscode moeglich 2026-02-17 16:49:09 +01:00
ma0068 f860fd3dc7 Studvw: update persistance_id for all tabs 2026-02-17 16:46:22 +01:00
Johann Hoffmann ee7254a964 assistenz preserve table state (selection, scroll) when adding serientermin; update isPastDate() function to luxon timezone safe logic; 2026-02-17 16:22:26 +01:00
ma0068 5ffd22c1f7 refactor last tabs from updateDefinition to setHeader variante 2026-02-17 16:11:43 +01:00
Alexei Karpenko c58674d133 Projektarbeiten cancelVertrag permission check bugfix (added array_column to get oes) 2026-02-17 15:15:30 +01:00
Harald Bamberger 006393704c Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-17 12:17:15 +01:00
Harald Bamberger 4825c75b5d revert changes made in commit b1a1cdf235 2026-02-17 12:11:37 +01:00
Harald Bamberger d82c186643 Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-17 11:23:18 +01:00
ma0048 2f51f18447 studierende in die gruppe ziehen ohne vorheriges selektieren 2026-02-17 11:16:44 +01:00
ma0048 5b34a226bd verbandsbaum nur toggeln und nicht automatisch selektieren 2026-02-17 11:09:54 +01:00
ma0068 1c69f3f654 VV: refactor Modal, change height of Table Unassigned Contracts 2026-02-17 10:31:45 +01:00
Harald Bamberger f6fd5ab678 Merge branch 'feature-71645/StudVw_MessageTab_Ladezeit' 2026-02-17 10:29:10 +01:00
Harald Bamberger 3d1aef617f add phrase error.opproject_does_not_exists in category kvp 2026-02-17 08:13:07 +01:00
Harald Bamberger e12b7e1ed5 add indexes for person_id to table msg_message and msg_recipient, ensure tabulator data request is made before requests of create msg components 2026-02-17 08:06:30 +01:00
ma0068 d9d3b1a245 VV: show Details und Status only if one Vertrag is selected 2026-02-17 07:58:03 +01:00
ma0068 ce27964df9 Detailheader VV and StudV: show - if no value for Tile 2026-02-16 16:46:46 +01:00
Harald Bamberger 0496eb7cc9 use union instead of or to avoid parallel seq scan 2026-02-16 15:56:40 +01:00
ma0068 556683574c Ignore typing inside editable elements for handling of keyboards event in function onKeydown 2026-02-16 15:44:01 +01:00
Harald Bamberger 962cbf4e78 join person table for sender and recipient instead of using subselect 2026-02-16 15:16:49 +01:00
Harald Bamberger 5415180b2c fetch count and paginated data in one query 2026-02-16 14:18:59 +01:00
ma0068 9d789d9a97 Tab Messages: remove unused computed statusText 2026-02-16 10:37:15 +01:00
ma0068 3d061df1d7 merge master into feature-68767/FHC4_Studierendenverwaltung_Details_4spaltig 2026-02-16 10:05:45 +01:00
Andreas Österreicher 827b6148a7 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-16 08:47:30 +01:00
Johann Hoffmann 3831f3c1d7 consistent use of :optionDisabled="getOptionDisabled" for paabgabetyp dropdowns in assistenz view 2026-02-16 03:41:30 +01:00
Johann Hoffmann 60294dd8f2 paBenotet evaluation fix 2026-02-16 03:22:39 +01:00
Andreas Österreicher 9d5adc1ed2 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-13 13:58:30 +01:00
Johann Hoffmann 632866c8c4 reset newTermin object when switching projektarbeit so they are assigned to the correct student 2026-02-13 13:45:12 +01:00
Andreas Österreicher 7f029ec8b5 Merge branch 'einspielen_12_02_2026' 2026-02-13 11:20:22 +01:00
ma0048 d9d15c1ed3 neue tag farben 2026-02-13 11:10:16 +01:00
Harald Bamberger a9b343646e Merge branch 'master' into vv_und_studvw_2026_02_rc4 2026-02-13 10:49:09 +01:00
ma0068 fd35d20955 refactor VV: change handling of selections, allow only strg for multiselect in vetraegen and for adding unassignedVertraege 2026-02-13 09:24:36 +01:00
Paolo 34b00f8dd6 cis/public/coodle.php now produces the correct ORGANIZER:MAILTO: 2026-02-12 21:44:12 +01:00
Johann Hoffmann 043b1bcf11 extracted email split method from stv/kontakt component to helperfile; adjusted that method to take subject param & make phrasen/alert call via parameter reference; 2026-02-12 17:38:00 +01:00
Johann Hoffmann 5c1e967d5e dont reset z-index on opening tiered menu (email button) by setting its autoZIndex property to false 2026-02-12 16:05:02 +01:00
Harald Bamberger 664b0a81bb use vilesci base url in combinePeople component 2026-02-12 15:52:11 +01:00
ma0068 aec0e5227f get selection after reload of added or updated contract, remove selection, stati and details after delete 2026-02-12 15:09:51 +01:00
Harald Bamberger fa807f37ae gehaltsbestandteil chart data: spezialfall neuer Gehaltsbestandteil und sofort valorisiert 2026-02-12 14:47:07 +01:00
Harald Bamberger 8f62d0d351 use correct category for phrase notiz_edit 2026-02-12 13:20:54 +01:00
Harald Bamberger e016deb042 add more space between download and delete button 2026-02-12 13:14:23 +01:00
Harald Bamberger ed170645df use plsql function public.get_rolle_prestudent instead of local sql 2026-02-12 11:27:50 +01:00
Andreas Österreicher 3a441228b8 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-12 11:07:36 +01:00
Andreas Österreicher 0a97e5781e Nicht beurteilt aus Default Config entfernt 2026-02-12 11:02:16 +01:00
ma0048 3465e299f7 tag - helper and formatter 2026-02-12 08:16:31 +01:00
Andreas Österreicher 136d6f9f28 Fix von BFI übernommen 2026-02-11 16:08:15 +01:00
Johann Hoffmann 67838eb630 load projektarbeit.note correctly for mitarbeiter; evaluate projektarbeit termin editability correctly and define a notenarray which does NOT count (currently "Nicht beurteilt" & "Noch nicht eingetragen"). such rules apply for betreuer, assistenz is allowed to do whatever they want since we never defined an actual business process anywhere and people do whatever they want anyways 2026-02-11 13:39:23 +01:00
Johann Hoffmann 609e226057 place email buttons inside a tiered menu (dropdown for some) to save space in the ui; 2026-02-10 14:25:45 +01:00
kindlm ffaff361b7 Merge remote-tracking branch 'origin/master' 2026-02-10 11:51:24 +01:00
kindlm d17206fe40 Admin-Seite: Padding bei Vorschau; Login Bugfix Fallback STG-Name 2026-02-10 11:51:02 +01:00
Andreas Österreicher 34e8b2e36d Merge branch 'feature-69180/AnwUID4CSV' 2026-02-10 11:14:39 +01:00
Andreas Österreicher fbea5a9306 Merge branch 'master' into feature-69180/AnwUID4CSV 2026-02-10 11:02:20 +01:00
Johann Hoffmann 6da19585ff optional sammelmail buttons assistenz abgabetool 2026-02-09 13:45:01 +01:00
ma0068 e13a7069dc Studverwaltung: refactor from Tabulator5 to 6, reformat some date entries 2026-02-06 13:18:09 +01:00
Andreas Österreicher f4ae8dd8e1 Korrektur zur Ermittlung der (legacy) Anwesenheit von BFI übernommen 2026-02-06 13:10:31 +01:00
ma0068 1cd332115b Changes Vertragsverwaltung
- refactor from Tabulator 5 to Tabulator 6
- not reloading contract list after changes of Status or Detail to keep row selection
- Start reselection of current row
2026-02-06 10:38:29 +01:00
ma0068 0bf9d8fa8a Adaptions Detailheader: center Title and Values for Tiles, change size for mitarbeiterDetailHeader 2026-02-05 14:50:20 +01:00
ma0068 464f04b254 merge studvw_2026_02_rc4 in vv_und_studvw_2026_02_rc4 2026-02-05 11:57:03 +01:00
ma0068 2a63b99816 handle emit redirectToLeitung in parent 2026-02-05 11:50:43 +01:00
ma0068 2aca2cd6ab Custom Filter: change colour to green for filter symbol 2026-02-05 09:55:07 +01:00
ma0068 ee619004bd refactor tabulatorevents to avoid updateDefinitions (Tabs Betriebsmittel, Funktionen, Messages, Notizen, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Dokumente, Kontakt, Lehrveranstaltungstermine, Mobility, Prestudent, Pruefungen) 2026-02-05 09:41:15 +01:00
Johann Hoffmann 1eda652fba remove old code 2026-02-04 17:34:21 +01:00
Johann Hoffmann cc302ed5a1 lazyload signatur status for assistenz view to avoid worst case loading times due to 50 x 30mb signatur server payload 2026-02-04 17:32:17 +01:00
Andreas Österreicher f2308a32c8 Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-04 11:37:57 +01:00
Johann Hoffmann c8cb484299 add missing email template public.tbl_vorlage inserts to checksystem script; checked template naming convention for higher case 2026-02-04 11:34:36 +01:00
ma0068 fc0fdc7909 Merge branch 'studvw_2026-02_rc4' of github.com:FH-Complete/FHC-Core into studvw_2026-02_rc4 2026-02-04 11:34:19 +01:00
ma0068 3053289146 Filter: change type filter Active, change position filter item, default values All Buchungstypen 2026-02-04 11:33:54 +01:00
Andreas Österreicher 7c67e65c9b Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-04 11:11:59 +01:00
Johann Hoffmann a4dcf9e935 use phrase c4betrart + pa.betrart_kurzbz for betreuer/zweitbetreuer: text 2026-02-04 11:04:55 +01:00
Andreas Österreicher 6f99f493ea Merge branch 'feature-61164/AbgabetoolQualityGates' 2026-02-04 10:46:10 +01:00
Andreas Österreicher 023c2a10be Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-02-04 10:21:17 +01:00
Harald Bamberger f6b13c0bdf Merge branch 'master' into studvw_2026-02_rc4 2026-02-03 17:16:42 +01:00
Harald Bamberger a7cd6c35f1 Merge branch 'feature-71399/Javscript_Caching_Problem_fhc-build-version_in_URL_und_mod_rewrite' 2026-02-03 16:29:05 +01:00
ma0068 e0082db7c9 Tab Aufnahmetermine: add context self to computed properties and adapt name of 2 variables, Tab Lehrveranstaltungstermine: add space 2026-02-03 16:16:18 +01:00
Harald Bamberger 87ff7acef0 use absoluteJsImportUrl helper instead of APP_ROOT constant to build js components file path 2026-02-03 14:27:02 +01:00
ma0068 936858948b merge bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed into origin/studvw_2026-02_rc4 2026-02-03 14:15:58 +01:00
ma0068 18c949eed4 refactor tabulator options and events into computed section: Tabs Betriebsmittel, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Kontakt, Prestudent, Status, bugfix Lehrveranstaltungstermine: sorter for Lektor as string 2026-02-03 13:57:30 +01:00
Harald Bamberger d192489c6f use correct filename in comment 2026-02-03 13:52:04 +01:00
Harald Bamberger 7028fe0ac8 Merge branch 'master' into feature-71399/Javscript_Caching_Problem_fhc-build-version_in_URL_und_mod_rewrite 2026-02-03 13:49:48 +01:00
Harald Bamberger a3a03f6362 update check system to create or update widget path to start with public/... 2026-02-03 13:49:06 +01:00
Harald Bamberger 82f0f3f5e3 Merge branch 'bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed_Part1' into studvw_2026-02_rc4 2026-02-03 13:39:59 +01:00
Harald Bamberger 8b9601502a Merge branch 'bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed' into studvw_2026-02_rc4 2026-02-03 13:38:28 +01:00
ma0068 888bb1c7c0 Merge branch 'master' into bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed_Part1 2026-02-03 13:26:04 +01:00
ma0068 372c932c47 Merge branch 'master' into bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed 2026-02-03 13:16:17 +01:00
Johann Hoffmann 6391bf5a45 tippfehler in phrase "c4tooltipStandard" ausgebessert: 'Termin mehr als 12 Tag entfernt' => 'Termin mehr als 12 Tage entfernt' 2026-02-03 12:52:25 +01:00
Johann Hoffmann d774335bcf assistenz view query now also checks for betreuerart_kurzbz ("Erstbegutachter", "Begutachter", "Betreuer", "Erstbetreuer", "Senatsvorsitz") instead of only ("Erstbegutachter", "Begutachter") 2026-02-03 12:35:06 +01:00
Harald Bamberger 69749da331 Merge branch 'master' into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2026-02-03 11:46:19 +01:00
Andreas Österreicher b4f28d5426 Abstract zum Default Config für Betreuer hinzugefügt 2026-02-03 11:12:50 +01:00
Harald Bamberger 0442a3da0a Merge branch 'bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed' into studvw_2026-02_rc4 2026-02-03 10:58:24 +01:00
Harald Bamberger 2492a4fc06 Merge branch 'bug-70848/FHC4_Studierendenverwaltung_Notiz_handleVisibleColumns_pp' into studvw_2026-02_rc4 2026-02-03 10:57:38 +01:00
Harald Bamberger 9ae9feb9ea Merge branch 'bug-69548/FHC4_Studierendenverwaltung_Aufnahmetermine_Gesamtnote_berechnen' into studvw_2026-02_rc4 2026-02-03 10:48:06 +01:00
Harald Bamberger a535fd85cd Merge branch 'feature-69516/studvw_verbandsbaum_zu_ausklappbar_machen' into studvw_2026-02_rc4 2026-02-03 10:47:31 +01:00
Harald Bamberger 269860252e Merge branch 'feature-69710/FHC4_Studierendenverwaltung/Filterverhalten_bei_Aenderungen' into studvw_2026-02_rc4 2026-02-03 10:46:57 +01:00
Harald Bamberger d0faba03a2 Merge branch 'feature-39571/Studierendenverwaltung_CoreNotizcontroller' into studvw_2026-02_rc4 2026-02-03 10:43:39 +01:00
ma0068 88a06194d4 Merge branch 'master' into bug-70848/FHC4_Studierendenverwaltung_Notiz_handleVisibleColumns_pp 2026-02-03 10:36:13 +01:00
Andreas Österreicher 3e1b9865b1 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2026-02-03 10:33:54 +01:00
Andreas Österreicher 3534118261 Merge branch 'feature-71355/constructor_config_bewerbungstool_datenschutz' 2026-02-03 08:50:20 +01:00
Harald Bamberger 5d73f051ba sample .htaccess to use with config option use_fhcomplete_build_version_in_path 2026-02-03 08:13:57 +01:00
Harald Bamberger 85a10e27cc fix setFirstStudent if GENERATE_ALIAS_STUDENT is false 2026-02-02 17:59:15 +01:00
ma0068 8c22a652fa merge master into bug-71363/FHC4_Stvw_Refactor_TabulatorOptions_As_Computed 2026-02-02 17:24:36 +01:00
ma0068 a70e25d0e8 Merge branch 'master' into feature-69516/studvw_verbandsbaum_zu_ausklappbar_machen 2026-02-02 16:48:02 +01:00
ma0068 e689531224 merge master into bug-69548/FHC4_Studierendenverwaltung_Aufnahmetermine_Gesamtnote_berechnen 2026-02-02 16:31:13 +01:00
ma0068 3ab1a002f0 Merge branch 'master' into feature-69710/FHC4_Studierendenverwaltung/Filterverhalten_bei_Aenderungen 2026-02-02 16:24:51 +01:00
ma0068 b9eaac18b0 merge Master into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2026-02-02 16:21:47 +01:00
ma0068 b26df9ac21 Tab Kontakt: Bankaccount: move tabulator options to computed, fix bug height 2026-02-02 11:48:02 +01:00
ma0068 0539281adf Messages: move tabulator options and event to computed 2026-02-02 11:36:03 +01:00
Johann Hoffmann 1b35569797 Merge branch 'master' into feature-69180/AnwUID4CSV 2026-02-02 10:22:10 +01:00
ma0068 e01d814ae9 Tab Dokumente: move tabulator options and event to computed 2026-02-02 09:44:47 +01:00
Harald Bamberger 77abcb6129 use absoluteJsImportUrl in Dashboard Widget Api Endpoints, send widget setup and arguments column values as json to frontend, remove JSON.parse from frontend dashboard code 2026-01-30 18:58:20 +01:00
Harald Bamberger 63f198098d use absoluteJsImportUrl Helper for calendar Event renderers 2026-01-30 18:55:25 +01:00
Harald Bamberger f7478ff05c add config to insertr fhc-build-version into path or add it as query string 2026-01-30 18:53:31 +01:00
ma0068 99ea6ad333 - moved tabulator options to computed
- removed unused change param
- added values to resetModal
2026-01-30 14:26:32 +01:00
Johann Hoffmann 366cb16b61 anw phrasen "studentByLVATitle" & "kontrolliertVon", slight adjustment of fullscreen modal button so it looks similar 2026-01-30 14:10:28 +01:00
ma0068 683626921b Tab Mobility: moved tabulator options to computed 2026-01-30 13:21:40 +01:00
ma0068 326d4b3923 Revert "refactor in computed section: Tabs Betriebsmittel, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Kontakt, Prestudent, Status, bugfix Lehrveranstaltungstermine: sorter for Lektor as string"
This reverts commit f2107a377f.
2026-01-30 10:31:38 +01:00
ma0068 f2107a377f refactor in computed section: Tabs Betriebsmittel, Abschlusspruefung, Anrechnungen, Aufnahmetermine, Kontakt, Prestudent, Status, bugfix Lehrveranstaltungstermine: sorter for Lektor as string 2026-01-30 10:29:19 +01:00
Johann Hoffmann fbe10cc2a1 PersonModel loadAllStudentUIDSForPersonID used in anw extension AdministrationApi aka Entschuldigungsmanagement 2026-01-29 15:08:24 +01:00
ma0048 783c4fc5f8 constructor warning config hinzugefuegt
testtool englisch uebersetzung datenschutz hinzugefuegt
2026-01-29 08:15:35 +01:00
Harald Bamberger f1aa5382cf check editZgv Permission for Stg and also check it in api function 2026-01-28 17:04:11 +01:00
ma0068 e3b630550a delete comment 2026-01-28 14:42:26 +01:00
ma0068 8903fa878c - more prominent view of Active Custom Filter
- one click filterreset
- fhc search bar: resetFilter with submit
2026-01-28 13:33:01 +01:00
Harald Bamberger 7fe36d59e3 apply edit Zgv permissions only to ZGV dropdowns 2026-01-28 11:32:03 +01:00
kindlm c724c6a20f MathML auf Darstellungs-Testseite überarbeitet 2026-01-27 16:53:33 +01:00
kindlm b9bfa5c3c5 Merge remote-tracking branch 'origin/master' 2026-01-27 16:52:16 +01:00
Johann Hoffmann 101613ecdd detail view infos - student: {student} titel: {titel} betreuer: {betreuer} 2026-01-27 14:47:51 +01:00
Johann Hoffmann edd0c46186 target blank on students stg moodle link; added new classes to assistenz table cell formatters 2026-01-27 11:50:29 +01:00
Johann Hoffmann 07dd9e3a77 abgabedatum logic fix in dateStyles 2026-01-27 11:31:56 +01:00
Johann Hoffmann 06139b14d6 bestanden style from purple to green 2026-01-27 11:25:41 +01:00
Harald Bamberger 3e46e94736 quick fix to prevent pruefunglist from being empty due to js error in combination with tabulator sort persistence 2026-01-27 11:07:46 +01:00
Johann Hoffmann fc468ca34a URL_ASSISTENZ for links in email jobs 2026-01-27 10:52:15 +01:00
Johann Hoffmann 84db668566 compare notenOpt in student view if necessary for datestyle 2026-01-27 10:30:00 +01:00
Johann Hoffmann 3c82cd1282 icon template statusses 2026-01-27 09:58:48 +01:00
Johann Hoffmann 709f64e292 2 new dateStyle status regarding QG benotung 2026-01-27 09:31:14 +01:00
ma0068 5dcf8bb854 add showVariables.showErledigt to tabulatorOptions 2026-01-26 15:11:00 +01:00
Johann Hoffmann 709aba5783 Merge branch 'master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	application/models/organisation/Studiengang_model.php
2026-01-26 15:06:22 +01:00
Harald Bamberger afc4544304 use showVariables properties directly in tabulatorOptions and tabulatorEvents moved to computed, so they are used only if user has not customized columns visibility in localstorage 2026-01-26 14:09:07 +01:00
ma0048 0a2afadb0a tagheaderfilter bug fix 2026-01-26 13:21:20 +01:00
Harald Bamberger f867e60702 fix use of config FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE to override studiengang_kz in public.tbl_konto 2026-01-21 17:37:23 +01:00
Johann Hoffmann 668f0a6618 fixed betreuerart bezeichnung formatting discrepancy between first and second assesor 2026-01-21 16:26:26 +01:00
Andreas Österreicher ef8314c33a Config to check Extension LVEvaluierung is enabled 2026-01-21 15:32:52 +01:00
Johann Hoffmann 48cd37058e also block uploads and termin changes for projektarbeiten with a note on backend 2026-01-21 14:53:44 +01:00
Andreas Österreicher e4ebdd59b6 Merge branch 'epic-56039/LV-Evaluierung' 2026-01-21 14:51:24 +01:00
Johann Hoffmann 4d97127539 remove Abgabedatum column from Assistenz/Betreuer update sammelmail. Keep it for UPLOADS sammelmail since it is relevant there; defined relevant_types in abgabetool config to filter for in the sammelmail for each role student/assistenz/betreuer; block saving/deleting/uploading ui components when projektarbeit has a note, since this indicates that the project is over; 2026-01-21 14:05:31 +01:00
Andreas Österreicher d1cc7244f7 Merge branch 'feature-70999/bewerbungstool_datenschutz_checkbox' 2026-01-21 10:56:54 +01:00
Johann Hoffmann c9bcf9b9b0 fixed note init by object/object key on 2nd time opening the details modal in the assistenz view; 2026-01-21 10:34:17 +01:00
ma0048 2f5b90b9d5 dsgvo confirm und proctoring confirm beim RT Login 2026-01-21 09:04:11 +01:00
Cristina 9b90e0edde Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-20 10:53:36 +01:00
Cristina 56e9b253d2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-20 10:52:23 +01:00
Cristina c5c7123358 Added lvevaluierung phrase 2026-01-20 10:51:49 +01:00
Johann Hoffmann 2471d37dd3 fix loginfo statements betreuer->assistenz 2026-01-19 16:54:10 +01:00
Johann Hoffmann ad7808eb21 fix typo in speed dial disabled computed (based on being a zweitbegutachter 2026-01-19 16:49:03 +01:00
Johann Hoffmann 9a07e7c804 wrote Studiengang_model.php -> getAssistenzForStudiengangKZ() that does just that but is not used currently since we retrieve assistenz in AbgabetoolJob.php via oe_kurzbz; added new getAssistenzForOE() method in Organisationseinheit_model; added new job "notifyAssistenzAboutChangedAbgaben" that does just that to AbgabetoolJob.php; removed console.log/debugger statements in cis4 code; 2026-01-19 16:12:54 +01:00
Cristina 50e93fc9ba Fixed wrong configs (restored CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN + removed double CIS_EVALUIERUNG_ANZEIGEN_STG) 2026-01-19 13:33:12 +01:00
Andreas Österreicher 47ea1e848c Merge branch 'feature-69528/reihungstestueberwachung_constructor' 2026-01-19 10:17:38 +01:00
ma0048 e0f99a8e88 gewichtung und regeln in die config verschoben 2026-01-19 08:28:25 +01:00
Johann Hoffmann 6c82741341 remove var_dump() statement 2026-01-16 12:00:30 +01:00
Johann Hoffmann c3f7f7223a add student name info to betreuer sammelemail jobs table; WIP adapting same logic for assistenz; 2026-01-16 11:59:46 +01:00
Johann Hoffmann fbd0a4685e fix jobs & fancy formatting; check paabgabetyp instead of bezeichnung to enable enduploads for users in english lmao 2026-01-15 18:40:51 +01:00
Harald Bamberger 63aebde7f2 Merge branch 'bug-70906/FHC4_Archive_Dokument_Studienbestaetigung' 2026-01-15 18:01:25 +01:00
ma0068 62f5b66324 add missing parameters studiensemester and studiengang_kz for document Studienbestaetigung and StudienbestaetigungEnglish 2026-01-15 17:24:38 +01:00
Harald Bamberger ef08e39449 api endpoint student: prevent storing an empty string as alias e.g. from StudVw Details Tab 2026-01-15 17:09:30 +01:00
Harald Bamberger c720c46125 education/Projektarbeit_model: fix missing from-clause entry for table tbl_projektarbeit error - ticket#6059687 2026-01-15 16:28:38 +01:00
Harald Bamberger 597d4dbfec Abschusspruefung Modal add model-type to datepicker to prevent sending full utc timestamp to backend 2026-01-15 11:37:51 +01:00
Johann Hoffmann eb15d6b841 getStudentConfig Api Method; moodle link config entry; write abgabetool termin noten into header; uniform getDateStyleClass logic in all 3 views; WIP refining AbgabetoolJob; 2026-01-14 16:57:57 +01:00
ma0048 d67cad925d externe ueberwachung deaktivieren ueber config
params in die config verlagert
2026-01-14 13:59:42 +01:00
Johann Hoffmann bbb90f6dc4 added fixtermin variable to Paabgabe->update() statement; email logic for sancho emails towards betreuer: return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; phrasen wordings; reworked assistenz config api promises as allSettled to avoid race conditions; nachreichen möglich is always the default everywhere; WIP enabling the same status logic workflow everywhere; 2026-01-13 18:20:05 +01:00
Harald Bamberger 2d9e9df8a0 fix notiz component showing no data when setting sort an switching tabs in stv 2026-01-13 14:10:33 +01:00
Cristina 6d6659f6e5 Merge remote-tracking branch 'origin/epic-56039/LV-Evaluierung' into epic-56039/LV-Evaluierung 2026-01-13 13:39:21 +01:00
Cristina 6512ad0f1c Merge branch 'master' into epic-56039/LV-Evaluierung 2026-01-13 13:38:04 +01:00
Cristina f034a99928 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2026-01-13 13:37:43 +01:00
Johann Hoffmann e89fcbab31 phrase typo fix 2026-01-13 13:05:58 +01:00
Johann Hoffmann 7c1f239dcb configurable paabgabe types for signature check; finetuned signature response message; phrasen & code cleanup; 2026-01-13 12:32:41 +01:00
Johann Hoffmann cc0f38b276 fix the comment describing the "fix" 2026-01-12 17:14:03 +01:00
Johann Hoffmann a56335f4f9 "fix" the signatur check 2026-01-12 17:11:48 +01:00
Johann Hoffmann 954c55ba3e finetuning 2026-01-12 17:06:35 +01:00
Johann Hoffmann c7250959d0 Merge remote-tracking branch 'origin/feature-61164/AbgabetoolQualityGates' into feature-61164/AbgabetoolQualityGates 2026-01-12 12:52:31 +01:00
Johann Hoffmann 6c8318ead2 wip 2026-01-12 12:51:34 +01:00
Andreas Österreicher 3095f7ea8b Notice für UID entfernt 2026-01-12 10:44:57 +01:00
Andreas Österreicher 8f98d0c5a1 Fixed UID 2026-01-12 10:31:50 +01:00
Johann Hoffmann 13232015c3 more sophisticate zuordnung check & place it in every sensitive API endpoint; WIP: check STGentitlement when querying projektarbeiten for certein stg, since only dropdown info is pulled with this berechtigungslogic in mind but not the fetch itself; 2026-01-09 14:13:26 +01:00
Johann Hoffmann db861e81b2 rewrote post param acces from $id = $_POST['id'] to $id = $this->input->post('id') and subsequently rewrote safety checks from !isset($id) || isEmptyString($id) to $id === NULL || trim((string)$id) === '' to avoid ASCII conversion of low integers when passing them to isEmptyString function 2026-01-08 17:45:02 +01:00
Johann Hoffmann 7eb147085f typo fix in getDateStyleClass; fix selectAll button in Assistenz view; change the upload_allowed checkbox on change as expected; give fhcAlert primevue btn classes instead of bootstrap so they actually get applied; save convert js date to iso string to avoid timezone shenanigans; created zusatzdaten edit phrase; 2026-01-08 16:05:24 +01:00
Johann Hoffmann 80175f46cb typo fix in getDateStyleClass; fix selectAll button in Assistenz view; 2026-01-08 14:40:24 +01:00
Johann Hoffmann 3d82d69bfc fixed student_uid variable aquisition inside StudentComponent; No allowedToSave check in client for Betreuer at all, everything done at backend level (WIP); added legacy phrasen to phrasesupdate to guarantee their existence; 2026-01-08 13:40:58 +01:00
ma0048 40ae57fb0c proctoring check ueberarbeitet 2026-01-08 12:01:20 +01:00
Andreas Österreicher f845809e6b Fixed Variable Check in Abgabetool 2026-01-07 16:02:06 +01:00
Paolo 1ce362b66b Removed forgotten error_log 2026-01-07 15:54:59 +01:00
Harald Bamberger c113c80862 fix calculation of next student matrikelnr aka personenkennzeichen and student uid 2025-12-22 21:11:05 +01:00
Andreas Österreicher 063cbcbf4f Merge branch 'feature-62775/reihungstesttool_firefox_check_entfernen' 2025-12-19 09:50:15 +01:00
Paolo 47d4b2e2d4 Change var_dump_to_error_log to show the referring script -> tail -f /var/log/apache2/error.log | grep <user> can catch it 2025-12-18 13:20:08 +01:00
Andreas Österreicher 7e6805ca98 Merge branch 'master' into epic-56039/LV-Evaluierung 2025-12-18 13:18:16 +01:00
Cristina 871534af52 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-12-18 13:07:27 +01:00
Andreas Österreicher 67b03dd29f ReAdded Lost Phrases 2025-12-18 12:55:08 +01:00
Harald Bamberger 0616236e00 bugfix: ZGV Übernahme bei Interessentenanlage, bestehende ZGVs die null sind ausfiltern 2025-12-18 12:48:08 +01:00
Andreas Österreicher 47e3c83909 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2025-12-18 12:25:05 +01:00
Cristina 4dd4d8aaa5 Removed filtering aktiv studienganege from method to get Studiengaenge by Stgs
otherwise when switching to former semester (which will have inactive studiengaenge) it will not appear
2025-12-17 14:35:24 +01:00
Cristina f9ac824cc0 Added LV-Evaluierung NEU link button to CIS LV Menu 2025-12-17 14:33:04 +01:00
Harald Bamberger 79ad8601da Merge branch 'feature-68763/CIS4_Profilupdate_Additional_Changes' 2025-12-17 13:35:59 +01:00
Harald Bamberger 6b0526fb95 add tabulator persistence config 2025-12-17 13:22:39 +01:00
Harald Bamberger 39d708aa61 Merge branch 'master' into feature-68763/CIS4_Profilupdate_Additional_Changes 2025-12-17 12:56:07 +01:00
Harald Bamberger becbe5823c Merge branch 'feature-69286/StudStatusWiedereinstiegsmail_an_Studierende' 2025-12-16 16:16:29 +01:00
Harald Bamberger ddfcef9ad7 log Error if mail can not be sent, only change status if both reminder emails were successfully sent 2025-12-16 15:52:44 +01:00
Harald Bamberger 4f5e49a93c send to all private email addresses marked as zustellung 2025-12-16 15:27:31 +01:00
Harald Bamberger a3b5718422 Merge branch 'master' into feature-69286/StudStatusWiedereinstiegsmail_an_Studierende 2025-12-16 07:43:45 +01:00
Cristina db048e876c Renamed getEntitledStgs to getByStgs
Permissions check happens in application controller.
2025-12-15 16:48:07 +01:00
Harald Bamberger a4be020156 Merge branch 'feature-68768/Studierendenstatus_Neue_Abmeldungsgruende' 2025-12-15 16:36:16 +01:00
Harald Bamberger 2149ed2384 Merge branch 'master' into feature-68768/Studierendenstatus_Neue_Abmeldungsgruende 2025-12-15 16:27:57 +01:00
Cristina e6ef234c8b Added method getOrgformsByStg to Studiengang_model.php
Get OrgForms of given Studiengang and Studiensemester
2025-12-15 16:27:47 +01:00
Harald Bamberger 29c8e6fb19 Merge branch 'master' into feature-69286/StudStatusWiedereinstiegsmail_an_Studierende 2025-12-15 16:27:25 +01:00
Harald Bamberger cf7e9921b5 change grades sort order 2025-12-15 16:11:46 +01:00
Harald Bamberger 887d9f9cbd Merge branch 'feature-69877/StudVw_Status_GrundAndAnmerkungEditable' 2025-12-15 15:31:52 +01:00
Harald Bamberger 7de3c4a24e remove unnecessary line 2025-12-15 15:22:32 +01:00
Harald Bamberger 11ff26d8e7 remove empty lines 2025-12-15 15:20:19 +01:00
Harald Bamberger 718272e8a1 remove empty line 2025-12-15 15:13:53 +01:00
Harald Bamberger 3f891179aa move check for critical changes bis from frontend to backend 2025-12-15 15:12:49 +01:00
kindlm 2a84999e56 Merge remote-tracking branch 'origin/master' 2025-12-15 14:39:47 +01:00
Andreas Österreicher 56ef700ec8 Merge branch 'feature-69439/negative_stunden_im_neuen_kartereiter' 2025-12-15 14:27:27 +01:00
Harald Bamberger afc3cd0131 Merge branch 'master' into feature-69877/StudVw_Status_GrundAndAnmerkungEditable 2025-12-15 13:53:28 +01:00
Harald Bamberger 5536408065 add property stg_kz to json of org_forms to prevent clearing tabulator when changing form a node with stg_kz property set to an orgform_node 2025-12-15 13:35:50 +01:00
Johann Hoffmann 756a51defa selectable check during selectAll to block it for Zweitbetreuer -> custom formatted/handled selection column for mitarbeiter & assistenz; custom sticky-col css; 2025-12-15 13:16:12 +01:00
ma0048 5a77478071 insertvon entfernt 2025-12-15 12:27:17 +01:00
Harald Bamberger 293a8625e4 change sort order in grades list api endpoint 2025-12-15 12:03:41 +01:00
Harald Bamberger 5266a6fe4d Merge branch 'master' into feature-69877/StudVw_Status_GrundAndAnmerkungEditable 2025-12-12 16:28:35 +01:00
Harald Bamberger 3485ee624c Merge branch 'studvw_2025-12_rc3' 2025-12-12 15:22:24 +01:00
Harald Bamberger 61c859f2e1 Merge branch 'bugfix-69874/Dokument_Ausbildungsvertrag_ohneParamUid' into studvw_2025-12_rc3 2025-12-12 15:06:49 +01:00
Harald Bamberger b967f83dd4 skip adding uid to params for templates Ausbildungsver and AusbVerEng instead of deleting it afterwards 2025-12-12 15:05:37 +01:00
Harald Bamberger ad184f5c16 change projektbetreuer tabulator layout, use correct phrases for columns person_id and punkte 2025-12-12 14:37:44 +01:00
ma0068 34d6b2d97a use only prestundent_id in Archive-functionality 2025-12-12 14:36:02 +01:00
Johann Hoffmann 735a6654b9 projektbeurteilung_check_available event when loading studentprojektarbeiten handled in extension 2025-12-12 13:45:01 +01:00
ma0068 431ae8ddac - make button edit editable
- set field anmerkung editable (like statusgrund and statusgrund)
- refactor function updateStatus to skip validation
- change phrases
2025-12-12 13:04:58 +01:00
Johann Hoffmann 635da9f8d9 checksystem paabgabetyp default values for upload_allowed, benotbar & aktiv only on first checksystem run by checking availability of qgate2 typ; english phrasen for betreuerart, paabgabetyp & projekttyp; disable new termin for zweitbetreuer (WIP disabling serientermin); QGate1/2 Status column -> text only for now; 2025-12-12 12:51:07 +01:00
Harald Bamberger 0072d87f3b Merge branch 'bug-69804/FHC4_StudVw_Mobility_showAddedZweckAndGrund' into studvw_2025-12_rc3 2025-12-11 16:41:43 +01:00
ma0068 d91789aee5 Aufruf Ausbildungsvertrag mit Param prestudent-id 2025-12-11 16:20:09 +01:00
Cristina 8280ec42b0 Added method getEntitledStgs to Studiengang_model.php
Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. Helpful to easily get Studiengänge the user is entitled for.
2025-12-11 16:07:07 +01:00
Harald Bamberger d8766e8f7a Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' into studvw_2025-12_rc3 2025-12-11 16:06:28 +01:00
Alexei Karpenko 91f141326a Studierendenverwaltung Projektarbeiten PRojektbetreuer: replaced "formdata modified" check with edit mode check 2025-12-11 15:38:53 +01:00
ma0068 a6907d1bc5 - bugfix delete Purpose
- reload local data after pushing new entries in Purpose and Support
2025-12-11 14:20:22 +01:00
Harald Bamberger 95027937bd remove debug code 2025-12-11 12:52:05 +01:00
Harald Bamberger a86d35f731 Merge branch 'master' into feature-69065/Projektarbeiten_Firmen_verwalten 2025-12-11 12:12:05 +01:00
Alexei Karpenko 1c511f9c66 Projektarbeit controller: added comments 2025-12-11 11:42:31 +01:00
ma0068 f40f554c6b add logic for config FAS_REIHUNGSTEST_EXCLUDE_GEBIETE 2025-12-11 10:53:15 +01:00
ma0048 b4668aa6bc verbandsbaum zu/ausklappbar 2025-12-11 08:58:05 +01:00
ma0048 df639c8b07 sprache mitschicken 2025-12-11 08:28:01 +01:00
Alexei Karpenko 80f80ab8e8 added comments to Projektbetreuer 2025-12-10 19:43:15 +01:00
Alexei Karpenko 32b73b7287 Studierendenverwaltung Projektarbeiten: delete checks bugfixes, layout guidelines 2025-12-10 18:03:04 +01:00
Johann Hoffmann eade9b7beb fixed accordion header padding size; student sees public mail, lektor gets notifs to private; remove unused injections; rewrite viewData validation for old Cis to remove console.warnings; clear abgabetermin.kurzbz when changing to smth not quality gate to avoid leaky kurzbz; fixed accordion header style offset for both cis environments; tooltip fix; only show abgabedatum if termin has upload_allowed; lower max-width in old cis; activated custom persistence for assistenz page + stricter promise handling around tableBuilt; activeIndex Handling on Student Page in case of several Projektarbetien; Phrasen gendering; 2025-12-10 17:41:01 +01:00
Alexei Karpenko 98bcbda53e added check for Projektarbeitsbeurteilung when deleting Projektarbeit 2025-12-10 16:09:44 +01:00
Harald Bamberger ba1f3da02f Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 15:35:58 +01:00
Harald Bamberger 994d523258 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' 2025-12-10 15:29:07 +01:00
Harald Bamberger 213f20eab3 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' into studvw_2025-12_rc3 2025-12-10 15:20:27 +01:00
Harald Bamberger 2bb58e24cc fix timing to prevent zgv autocomplete fields from being empty when switching from and to prestudent tab 2025-12-10 15:18:16 +01:00
ma0048 53cf777970 check im menu entfernt 2025-12-10 15:18:15 +01:00
ma0048 48512f46ab exam name geandert 2025-12-10 15:15:23 +01:00
Harald Bamberger da78332a92 Merge branch 'feature-69451/FHC4_Studierendenverwaltung/BerechtigungenZGVs' into studvw_2025-12_rc3 2025-12-10 14:50:56 +01:00
Harald Bamberger 83a76d06b6 Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 14:16:46 +01:00
Harald Bamberger cfd24dd8bc Merge branch 'feature-69452/studvw_status_aktion_vorruecken_ausblenden_via_config' 2025-12-10 14:07:45 +01:00
Harald Bamberger ea5d2bc6f8 Merge branch 'master' into studvw_2025-12_rc3 2025-12-10 13:50:20 +01:00
Harald Bamberger 8468d881f1 Merge branch 'feature-69517/FHC4_Abschlusspruefung_Pruefungsprotokolltext' 2025-12-10 13:40:59 +01:00
Harald Bamberger 5041999b4b Merge branch 'master' into feature-69517/FHC4_Abschlusspruefung_Pruefungsprotokolltext 2025-12-10 13:34:52 +01:00
ma0068 1176c8d6e4 - use studiengang_kz and studiengangkurzbz of studienordnung of persontRT
- add check for existing studiengang
- use studiengang_kz instead studiengangkurzbz for filter and background green
2025-12-10 09:49:00 +01:00
ma0048 8bab5285e9 testversuch ueber config
abfrage gefixed
menu wird nicht mehr angezeigt
2025-12-10 08:08:46 +01:00
Cristina 76cdaefdc7 Merge branch 'master' into epic-56039/LV-Evaluierung 2025-12-09 17:06:06 +01:00
Johann Hoffmann bb689a6d48 Merge branch 'master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	public/css/Cis4/Cis.css
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-12-09 17:03:18 +01:00
Harald Bamberger 033af68343 teleport datepicker out of modal 2025-12-09 17:01:30 +01:00
Cristina f725594f0c Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-12-09 17:00:24 +01:00
Harald Bamberger f460a909d9 Merge branch 'feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte' into studvw_2025-12_rc3 2025-12-09 16:37:16 +01:00
Harald Bamberger 054574f9fb Merge branch 'feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten' into studvw_2025-12_rc3 2025-12-09 16:35:45 +01:00
ma0048 597aa1aa4e status vorruecken ueber config steuerbar
statusgrund kann wieder entfernt werden
2025-12-09 12:36:08 +01:00
Harald Bamberger 7c57f5a308 Merge branch 'master' into feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte 2025-12-09 11:50:08 +01:00
ma0068 43497b186d return empty array if there is no placementtest instead of error 2025-12-09 11:43:39 +01:00
Harald Bamberger 50439ee6cc Merge branch 'master' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-12-09 11:37:57 +01:00
Alexei Karpenko 016d4a1927 Studierendenverwaltung Projektbetreuer: added phrases, added check for existing Projektbetreuer when saving 2025-12-06 01:28:38 +01:00
Alexei Karpenko 112e30ab39 Studierendenverwaltung Projektarbeit: added concatenated Betreuer, sorted autocomplete suggestions, added Gesamtnote, freigegeben check removed when lock date set, added phrases 2025-12-05 22:01:35 +01:00
Andreas Österreicher e1959b9e40 Quality Gate Aenderungen im DBUpdate hinzugefügt 2025-12-05 13:21:46 +01:00
ma0068 e78482e947 - refactor sum points
- create green row background for current RT
2025-12-05 12:31:02 +01:00
Johann Hoffmann ca152dc1ea add projektarbeit_id & student_uid to projektbeurteilung_formular_link event in projektarbeitsbeurteilungsextension 2025-12-04 17:28:16 +01:00
Johann Hoffmann ec7ebc8286 allowedNoten config integer instead of string so javascript array.includes() doesnt miss the noten options 2025-12-04 16:57:24 +01:00
Johann Hoffmann 035e844fab added tbl_vorlage insert for PAAChangesBetSM.txt 2025-12-04 15:40:45 +01:00
Johann Hoffmann e7a737b7aa write stg_kz & semester_kurzbz into sammelmail about each projektarbeit; move method from abgabe.php api controller to abgabejob.php 2025-12-04 15:36:24 +01:00
Harald Bamberger 7e0acdbf45 fix typo 2025-12-04 14:57:03 +01:00
Johann Hoffmann e3c1287664 WIP 2025-12-04 14:49:05 +01:00
Harald Bamberger 391a4753d5 fix flex-grow with tabulator exceeding width (found by ma0646) 2025-12-04 14:38:30 +01:00
ma0068 c6686f56f6 make ZGV fields and bisMelden field editable
- new Berechtigung student/editDokZgv
- Berechtigungen student/editBakkZGV, student/editMakkZGV, student/editBismelden
2025-12-04 10:35:43 +01:00
Harald Bamberger 1c2937dfb6 Merge branch 'feature-69570/StudVw_Filter_broken' 2025-12-04 08:47:55 +01:00
Harald Bamberger 841b4736a9 do not send filters to backend when search endpoint is used 2025-12-04 08:39:37 +01:00
Alexei Karpenko c79ff24c89 Studierendenverwaltung Projektarbeit: added Studiensemester dropdown for Lv-Teil 2025-12-03 19:29:42 +01:00
Johann Hoffmann 0c5af137db WIP notifyBetreuerAboutNewOrChangedAbgabenForBetreuedProjektarbeiten Email Job; allowed abgabetypen & allowed noten as per config now via db primary key; new ProjektbetreuerModel method "getAllBetreuerOfProjektarbeit" to do just that; 2025-12-03 16:49:49 +01:00
Alexei Karpenko 77a1067ea5 Studierendenverwaltung Projektbetreuer: default Stunden coming from global config, Stundensatz is requested each time BetreuerIn is selected 2025-12-03 15:32:21 +01:00
ma0068 d33af0ae21 bugfix: resetModal in openMode modal 2025-12-03 15:14:26 +01:00
Johann Hoffmann 541d6d78cc projektbeurteilung_formular_link event for benotung link AbgabetoolMitarbeiterDetail.js; projektarbeit_is_current event for abstracted logic in Abgabetool; show endupload missing message on benoten if neither old nor new link are eligable; 2025-12-03 11:35:49 +01:00
ma0068 7726c3ce21 disable pruefungsnotizen 2025-12-03 10:23:58 +01:00
Harald Bamberger 5a970c3f2e fix typo 2025-12-03 09:58:33 +01:00
Harald Bamberger abcc1269eb add permission to show profile images in new studvw 2025-12-03 09:44:34 +01:00
Harald Bamberger c849b5defa fix broken filters 2025-12-02 18:08:03 +01:00
ma0068 d75939a8f8 refactor Messages
- endpoint: using apiMessages instead of prop
- add Phrases
- openMode Modal: resetModal if no messageId
- openMode inSamePage: loadReplyData
- function getNameOfDefaulRecipients: add missing check, if id[]
2025-12-02 16:08:13 +01:00
Johann Hoffmann 7747857583 AbgabetoolStudent beurteilung erstbetreuer/zweitbetreuer switch + get the actual link from the projektarbeitsbeurteilung extension via event 'projektbeurteilung_download_link' + fallback from config in case that fails; WIP implementing the switch for lektor beurteilungstemplate based on isCurrent/Semester etc in an Event in the pabu extension; 2025-12-02 16:07:26 +01:00
Andreas Österreicher 3ee81ae6e7 Merge branch 'feature-55978/infocenter_electronic_onboarding_filter' 2025-12-02 16:04:51 +01:00
Andreas Österreicher d1f684f0b3 Merge branch 'feature-69182/PHP8-Stringzugriff_mit_geschwungenen_Klammern' 2025-12-02 15:53:15 +01:00
ma0048 d8e57d43f9 session url in die config verschoben 2025-12-02 13:53:38 +01:00
ma0048 5c9710f44d externe ueberwachung v1 2025-12-02 13:49:05 +01:00
ma0048 257038a2d1 negative stunden markieren
headerfilter angepasst fuer minusstunden
2025-12-02 13:25:46 +01:00
Johann Hoffmann 6359dc0fc9 use sendUploadMail on endupload, no events for that; remove extensive form validation from student detail; serientermin update table format fix; WIP new job informing betreuer about changes to thei betreued PA's; zweitbetreuer/erstbetreuer beurteilungslink switch in abgabetoolStudent; WIP getting that link from event not hardcoded; fix checkUploadSize calculation bytes to megabytes; added beurteilungerforderlich class to accordion headers; 2025-12-02 13:13:42 +01:00
Harald Bamberger 4dabc642ed Merge branch 'master' into feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte 2025-12-02 07:54:40 +01:00
Harald Bamberger afb3ce4cae modify using open mode newTab or window with multiple Recipients via post request 2025-12-02 07:54:13 +01:00
ma0068 be2b578f82 reset default openmode to modal 2025-12-01 14:43:21 +01:00
ma0068 17519eac83 refactor Messaging
- headerFilter for table Messages
- multiactions for sendMessages for openmodes modal and inSamePage
2025-12-01 13:27:42 +01:00
Harald Bamberger 89ec51bd0a Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' 2025-11-28 14:45:29 +01:00
Johann Hoffmann aee6ace42e termine without uploads can now only have 'standard' or 'abgegeben' status based on datum; FHC_Api_Controller method checkUploadSize() -> checks input->server('CONTENT_LENGTH') against min($max_upload, $max_post, $memory_limit) and throws a designated filesizeExceeded error message; added fhc-orange palette for new status 'beurteilungerforderlich'; 2025-11-28 14:09:53 +01:00
Harald Bamberger 0372853df2 Aufnahmetermine: fix error persiting boolean, GS: sortorder studiensemester, Gruppen exclude generated groups from search result 2025-11-28 14:01:20 +01:00
Harald Bamberger dc603375ec Merge branch 'master' into feature-69065/Projektarbeiten_Firmen_verwalten 2025-11-28 11:15:59 +01:00
Johann Hoffmann 095d5acbc5 load all studiensemester for assistenz; load paabgabetyp benotbar for all paabgaben; datediff calc luxon; new dateclass 'beurteilungrequired'; 2nd quality gate validation logic option; filter notenoptions as per config; filter abgabetypoptions as per config; upload_allowed checkbox for serientermine; serientermin modal layout rearranged; abgabetoolJob fixes; 23:59 in the descriptive col, not datepicker; zusatzdaten are required; activeIndex for accordion calulated on demand by method instead of reading a computed value; 2025-11-27 16:53:50 +01:00
ma0068 aa84bdec1e ---staging---- 2025-11-27 14:46:55 +01:00
ma0048 96be1789b5 tag-formatter & helper hinzugefuegt 2025-11-27 09:45:57 +01:00
Alexei Karpenko eb1c3189b5 Studierendenverwaltung Projektarbeit: title not required anymore 2025-11-26 16:45:51 +01:00
Andreas Österreicher 6d27c3f6e2 PHPInfo entfernt 2025-11-26 08:27:14 +01:00
ma0068 93e25bb5fc added Reminder for Unterbrecher for Student 2025-11-25 17:35:44 +01:00
Harald Bamberger a413b6c779 fix bug when changing studiensemester on route search 2025-11-25 14:00:31 +01:00
Harald Bamberger f0e0bdc082 add optional query parameter studiensemester to notenspiegel and notenspiegel_erweitert to override semester_aktuell if multiple tabs in new studvw have different current semesters 2025-11-24 18:37:30 +01:00
Harald Bamberger 60661d3457 Merge branch 'studvw_2025-11_rc2' 2025-11-24 17:02:00 +01:00
Harald Bamberger 41bb99b5ea Merge branch 'master' into studvw_2025-11_rc2 2025-11-24 16:48:11 +01:00
Harald Bamberger 054b9fdee3 Merge branch 'feature-69388/Pruefung_API_insert_Propleme' 2025-11-24 16:42:49 +01:00
Harald Bamberger 61faf5386a Merge branch 'master' into studvw_2025-11_rc2 2025-11-24 16:39:47 +01:00
Harald Bamberger 6b4f5778c2 refactor stv Pruefung Tab and API endpoint to use same logic for insert and update, use luxon lib to initialize datepicker with iso date and send iso date format to api endpoint 2025-11-24 16:26:11 +01:00
Johann Hoffmann 8888b6991f Merge branch 'master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	application/models/education/Projektarbeit_model.php
#	public/js/helpers/StringHelpers.js
2025-11-24 14:25:43 +01:00
Johann Hoffmann 9ac7ff2a4c allowed to upload on endtermin switch to production logic (date & quality gates) 2025-11-24 14:16:07 +01:00
Johann Hoffmann f4ca34f247 remove email sent to alert on serientermin since we do this in cronjob now; 2025-11-24 14:14:46 +01:00
Andreas Österreicher 060f11f1d8 Anmerkung und Spaltenanzahl bei Leistungsstipendien Import angepasst 2025-11-24 09:49:15 +01:00
Harald Bamberger cdc1933ce4 fix typo 2025-11-24 09:48:05 +01:00
Harald Bamberger 239a9c89d7 compare DateTime with DateTime instead of String 2025-11-24 09:46:53 +01:00
Harald Bamberger 4964a2c06d set tabulator layout to fitDataStretchFrozen when frozen columns are defined, change css classes to display disabled status use the same as in students list 2025-11-24 09:40:33 +01:00
Johann Hoffmann 3b7ed523b4 postStudentProjektarbeitZusatzdaten in detail view for Betreuer/Assistenz; 2025-11-21 12:36:03 +01:00
Harald Bamberger ce5e3131c1 Merge branch 'master' into studvw_2025-11_rc2 2025-11-21 10:55:47 +01:00
Harald Bamberger 7eee6d51aa clear tabulator when returning to index or studiensemester route from search route 2025-11-21 10:55:01 +01:00
chfhtw 1666ba82b2 Bugfix: correct compare values in Pruefung->insertPruefung() 2025-11-21 10:42:13 +01:00
Harald Bamberger e54e83f718 Merge branch 'bug-68552/LV-Plan_mobile_Wochenansicht_links_rechts_scrollen' 2025-11-21 08:48:19 +01:00
chfhtw d916c6ab31 make Pruefung->insertPruefung() behave exactly like old FAS 2025-11-21 08:27:05 +01:00
Harald Bamberger be35fd5313 fix typo 2025-11-20 19:09:31 +01:00
Harald Bamberger dd92c815da fix back button behavior in studvw and lvverwaltung 2025-11-20 18:59:44 +01:00
ma0068 d76e84639f neue Phrasen bzw. Phrasenupdate zu Abmeldungsgruende Studierendenantrag 2025-11-20 16:18:55 +01:00
Harald Bamberger 6357aca656 show combine person tab only if permission basis/person, restore endpoint handling logic in List.js 2025-11-20 15:19:36 +01:00
Harald Bamberger d001e3c168 add option to deactivate livesearch, so the searchresult in studvw is shown in tabulator 2025-11-20 13:40:10 +01:00
Harald Bamberger d88f2a0a48 Merge branch 'feature-69176/Studierendenverwaltung_Berichte' into studvw_2025-11_rc2 2025-11-20 13:35:01 +01:00
Harald Bamberger 6378e75c37 Merge branch 'feature-68744/Studierendenverwaltung_Einstellungen' into studvw_2025-11_rc2 2025-11-20 13:33:56 +01:00
Harald Bamberger e22344e9dd Merge branch 'feature-68770/FHC4_Studierendenverwaltung_Funktion_Personen_Zusammenlegen' into studvw_2025-11_rc2 2025-11-20 13:28:37 +01:00
Harald Bamberger 0ed11a02a5 Merge branch 'master' into feature-69176/Studierendenverwaltung_Berichte 2025-11-20 13:27:30 +01:00
Harald Bamberger 23d1104602 Merge branch 'master' into feature-68770/FHC4_Studierendenverwaltung_Funktion_Personen_Zusammenlegen 2025-11-20 13:26:34 +01:00
Johann Hoffmann c447fb9632 properly center loadingOverlay in center of screen, not center of content + put that template away in a FhcOverlay.js component 2025-11-20 11:33:30 +01:00
Johann Hoffmann 352638ed90 code cleanup; 2025-11-20 10:36:23 +01:00
Harald Bamberger bab15bc5b2 add fs_x-small and fs_xx-small and ajust css em settings 2025-11-19 13:01:47 +01:00
Harald Bamberger 1cc77c8eba Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-19 11:42:21 +01:00
Harald Bamberger 3730be991a Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-11-19 11:30:52 +01:00
Harald Bamberger 2f2c7d0d92 Merge branch 'feature-69379/Tooltip-Direktive' 2025-11-19 11:19:37 +01:00
Paolo e837101651 PHP8 compatibility: replaced the curly brackets {} with square brackets [] where used in combination with strings 2025-11-19 10:53:59 +01:00
Harald Bamberger e4a7955239 fix editor params stored empty in tabulator local storage causing empty grade dropdown when switching tabs 2025-11-18 16:42:31 +01:00
Johann Hoffmann a4fee77301 link url in abgabetoolJob per config; comment out addMeta; 2025-11-18 15:01:43 +01:00
Cristina 92030ca697 Merge branch 'feature-69379/Tooltip-Direktive' into epic-56039/LV-Evaluierung 2025-11-18 11:02:57 +01:00
Cristina 53424999dc Created Vue Tooltip directive
This directive initializes and disposes Bootstrap tooltip
2025-11-18 10:58:57 +01:00
Cristina a59f90112d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-11-18 10:51:18 +01:00
Johann Hoffmann 96fdc357de move getDateStyleClass to AbgabetoolStudent.js from AbgabeStudentDetail.js 2025-11-17 16:39:19 +01:00
Johann Hoffmann 6cd0e3a574 email tbl_vorlage inserts dbupdate script; index.ci.php/Abgabetool/Assistenz/stg_kz? optional param route in old cis & cis4; no data placeholder phrase fix; 2025-11-17 15:57:53 +01:00
Alexei Karpenko ad7012367c added Link to company management in project work management 2025-11-17 14:52:58 +01:00
chfhtw 03b3182000 adding Notenspiegel to AppMenu 2025-11-17 13:09:16 +01:00
Johann Hoffmann 1120b823d2 log email count and early job termination in case of new events to notify for 2025-11-17 12:06:07 +01:00
Johann Hoffmann f89a53b156 fix getProjektbetreuerAnrede function since betreuer are not necessarily mitarbeiter with such an uid; notify students config from milliseconds to pgsql interval '1 day'; ported notifyBetreuerMail & notifyStudentMail to AbgabetoolJob.php; 2025-11-17 11:47:00 +01:00
Andreas Österreicher 126aa890c4 Merge branch 'feature-6976/Link_fuer_unverifizierte_email_anpassen' 2025-11-17 10:50:34 +01:00
Andreas Österreicher 4762154bbc Merge branch 'feature-67484/lvverwaltung_finetunning' 2025-11-17 09:06:10 +01:00
Harald Bamberger c9506adc10 do not use cisroot for link to placement test administration 2025-11-14 11:19:54 +01:00
ma0048 284633012f Merge remote-tracking branch 'origin/master' into feature-67484/lvverwaltung_finetunning 2025-11-14 08:09:25 +01:00
ma0048 63eda8b934 addgroup/addperson immer anzeigen
gruppen sortierung angepasst
fehlende les anzeigen
2025-11-14 08:07:39 +01:00
Johann Hoffmann cff71ec829 AbgabetoolJob notifyStudentMail function to send Emails to students about their changed abgabetermine inside the configurable threshold; 2025-11-13 17:16:51 +01:00
chfhtw de012b290b get semester & orgform from Verband to StudVw Main Component 2025-11-13 16:27:15 +01:00
chfhtw dbf9547f9c add CSS class disabled to AppMenu 2025-11-13 16:23:57 +01:00
chfhtw 65df13ca9f add slot to AppMenu 2025-11-13 16:23:04 +01:00
Cristina 993dff3351 Gendered phrase lektorInnen (FHTW style) 2025-11-13 11:11:37 +01:00
Cristina 0a118a1427 Clustered LV-Evaluierung phrases after merge 2025-11-13 10:50:36 +01:00
Cristina 4ab0c0a44e Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-11-13 10:44:39 +01:00
chfhtw e36e86fd50 Code Quality 2025-11-13 09:54:56 +01:00
Cristina d99d1c5ca0 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-11-13 09:49:37 +01:00
Cristina 43281c6ba2 Removed test buttons from FhcChart basic template 2025-11-13 09:48:54 +01:00
chfhtw cd574cd12c Reload settings setup on language change 2025-11-13 09:39:38 +01:00
chfhtw 95f1c66684 Stv Settings Phrases 2025-11-13 09:11:06 +01:00
chfhtw 5d957e38ae Phrase settings saved 2025-11-13 08:52:47 +01:00
chfhtw 7566e8aac2 Make AppConfig a general Component 2025-11-13 08:48:54 +01:00
Johann Hoffmann 8b851221b0 cis4 main content element shrinkability with style="min-width: 0;" 2025-11-12 12:05:48 +01:00
chfhtw 7fdfa94d11 Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-12 08:15:56 +01:00
chfhtw 77604c5e15 StV: Font Size setting 2025-11-12 08:02:06 +01:00
Johann Hoffmann 2920c68f05 wip 2025-11-11 15:59:42 +01:00
Johann Hoffmann 74937db204 WIP email logs to read/send in job; 2025-11-11 15:52:04 +01:00
Johann Hoffmann 410f0c4b6a fixtermin -> "kein neichreichen erlaubt" phrase/bool logic change; signatur message on enduploads fetched from signatur server on every load request; Inplace toggle for further infos in offcanvas timeline & student details on mobile view(tooltips); reworked col/row structure on detail views for mobile; 2025-11-11 13:44:47 +01:00
Paolo 0b6dc34220 If docsbox queue is slow, the DocsboxLib can stop checking the queued document status and raise an error 2025-11-10 15:41:01 +01:00
chfhtw 775d865878 StV settings 2025-11-10 12:38:57 +01:00
Johann Hoffmann cef0046acd speeddial icon/positioning; textarea styles; fixtermin phrase; wip inverting fixtermin bool logic to avoid double negative semantics 2025-11-07 14:19:17 +01:00
Johann Hoffmann a61d5b1d62 orgform/studstatus cols; 2025-11-07 11:17:59 +01:00
Alexei Karpenko f15932964f Studierendenverwaltung email: descending order kontakt_id 2025-11-07 01:06:22 +01:00
Alexei Karpenko 5678c18619 keepemailunverified parameter: email is passed even if unverified 2025-11-07 00:51:07 +01:00
Johann Hoffmann b1a1cdf235 studiensemester dropdown filter, default all, options are current/next and op to 10 back; benotet/unbenotet/alle fetch parameter; WIP orgform/studstatus cols; 2025-11-06 16:29:24 +01:00
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
chfhtw ede2e1710e Merge branch 'master' into feature-68744/Studierendenverwaltung_Einstellungen 2025-11-05 16:45:21 +01:00
Johann Hoffmann 3878fce625 wip abgabetool; 2025-11-05 15:34:10 +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
Andreas Österreicher aa43a2f32c Merge branch 'master' into feature-55978/infocenter_electronic_onboarding_filter 2025-11-03 12:57:41 +01:00
chfhtw d6c4e0db41 show submit btn in StV 2025-11-03 11:36:24 +01:00
chfhtw 398478e575 searchbar submit button 2025-11-03 11:36:10 +01:00
chfhtw 17540070a1 remove comments 2025-11-03 11:35:31 +01:00
chfhtw d923f30ccf Add search from url functionality 2025-11-03 11:05:26 +01:00
Johann Hoffmann 3d51753419 new bootstrap offcanvas component; projektarbeit abgabetermine timeline & status legende in offcanvas; fixtermin toggle & allowed to edit all termine for assistenz; studiengang selection + filter for getSTG_isEntitledFor('basis/abgabe_assistenz:rw'); moved filedownload from Cis/Abgabetool Auth Controller to Abgabe.php Api Controller; status symbol in table columns prevTermin/nextTermin; get_betreuer_details pgsql function to avoid rewriting the same subquery for every betreuer anrede; 2025-10-31 11:14:39 +01:00
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
ma0068 c78eef8af5 add validation for required props, refactor slots 2025-10-28 09:31:04 +01:00
Johann Hoffmann ac1e0a8aa3 Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates
# Conflicts:
#	system/phrasesupdate.php
2025-10-27 14:51:52 +01:00
Johann Hoffmann 259c2aec14 load projektarbeiten for studiengänge -> assistenz page; speed dial position rework; automagicmodal logic fix; activeTabIndex by date in detail views; tooltips on icons; $capitalize phrasen to ensure capitalization; phrasenpromise & resolve similar to anw; modal component emits fullscreen event now; 2025-10-27 14:40:56 +01:00
ma0068 6a7de7417b student view: reload after delete or upload 2025-10-27 13:50:25 +01:00
ma0068 c12678ca5a buttons edit and delete foto: adapt for better visibility, add preview to upload 2025-10-27 13:43:59 +01:00
ma0068 84bfea0be9 make Prestudent.js and Details.js responsive 2025-10-24 11:18:19 +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
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
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
chfhtw 1fbca8bdab Bugfix: Add overflow for horizontal scrolling 2025-10-17 10:14:47 +02:00
ma0068 7755dc12d0 View Studierendenverwaltung
- add badge unruly
- add tileSlots for PersKz, MatrikelNr, person_id
- remove MatrikelNr and person_id from left side
- add attribut unruly to student object
2025-10-15 13:55:54 +02:00
Cristina 343964750b Merge branch 'master' into epic-56039/LV-Evaluierung
# Conflicts:
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
2025-10-14 17:22:39 +02:00
Cristina 0201bac046 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-10-14 17:19:29 +02:00
Johann Hoffmann 0d2e41cf2f added paabgabetyp columns "aktiv", "upload_allowed", "aktiv"; setting sensible default values for existing typen that are just the developers best guess really; accordion header with icons & tooltips; logLib in Abgabe API controller logging all successful delete/insert/update requests; show arbitrary '23:59' string after target date so it is clear until when the upload should be fulfilled, even though we still dont do anything technically different; new Termine can only be made with aktiv paabgabe typen; note & benotungsnotiz now tied to paabgabetyp benotbar flag instead of hardcoded for qgate1 & 2; added "noch nicht abgegeben" text in case the abgabedatum is null; modal now spawns in xl with fullscreen optionally enabled; 2025-10-14 16:45:28 +02:00
Cristina 2aee86baba Changed phrase lvevaluierung/logoutText 2025-10-14 16:16:23 +02:00
ma0068 15a9379c6e use Slots for Core Detail Header: Tags, Issues, TileSlots 2025-10-14 15:45:11 +02:00
ma0068 40512edef0 add emit redirect to reload parent 2025-10-13 16:46:29 +02:00
ma0068 e9c039dad2 Refactor detailHeader component for PV21
- own css.file for fotouplad
- domain as prop
- refactor link to Leitung
- slots for issuetracking and tags
2025-10-13 16:07:51 +02:00
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
ma0068 c7f2b145bf add checkBerechtigungen for Notes person_id and notes prestudent_id 2025-10-10 14:15:40 +02:00
Johann Hoffmann 14aad56d5e datepicker css overflow fix; returned modalMagic to old form since its simpler now 2025-10-09 12:40:53 +02:00
chfhtw 601c4367dc use fhcApps for CIS 2025-10-09 10:57:51 +02:00
chfhtw 70c230edce use fhcApps for LogsViewer/LogsViewer 2025-10-09 10:44:13 +02:00
chfhtw d294d17e37 use fhcApps for lehre/lvplanung/LvTemplates 2025-10-09 10:42:22 +02:00
chfhtw d88cc77a5c use fhcApps for Studstatus 2025-10-09 10:40:02 +02:00
chfhtw 61600e78b6 use fhcApps for Bismeldestichtag/Bismeldestichtag 2025-10-09 09:27:31 +02:00
chfhtw ea0b69d4c2 use fhcApps for ProfilUpdateRequest 2025-10-09 09:15:26 +02:00
chfhtw 0309c04ae0 use fhcApps for Cis/Documents 2025-10-09 08:46:09 +02:00
chfhtw 3c3e920573 use fhcApps for Studentenverwaltung 2025-10-09 08:43:12 +02:00
chfhtw d389cf87b8 delete MyLv->Info because app does not exist anymore and url is rerouted to MyLv->index 2025-10-09 08:42:29 +02:00
chfhtw 09864c5154 remove unused view that links to a non existing app 2025-10-09 08:41:58 +02:00
Johann Hoffmann f03411c668 legacy cis abgabetool routes; abgabetool.css for legacy cis; endupload & fixtermin logic enabled; paabgabe template rearranged; legacy view, controller has cis4 switch; viewData & router props workaround with CI3 router logic; wrapper app legacy cis; fix enduplaod validation; 2025-10-08 17:41:00 +02:00
ma0068 204ae1a469 refactor prepareQuery, use and take into account config parameters, refactor autoSelectRows 2025-10-08 16:34:39 +02:00
chfhtw d2f21ba4e6 use fhcApps for LVVerwaltung 2025-10-08 14:45:12 +02:00
ma0048 e11d72ace0 bei den tags copy button hinzugefuegt
datatree reexpand gefixed nach dem loeschen und hinzufuegen
2025-10-08 13:48:45 +02:00
chfhtw 842dabc1e7 add fhcApps functionality to view template 2025-10-08 13:37:06 +02:00
chfhtw 67281c84ed FhcApps Library 2025-10-08 13:36:20 +02:00
ma0068 3a6c8dfd2d adapt event dataProcessed and method autoselect 2025-10-08 10:28:14 +02:00
ma0068 450789ed72 extend query getStudents, change zuordnung_type from uid to prestudent 2025-10-08 09:12:54 +02:00
kindlm 3549fc1b1b Merge remote-tracking branch 'origin/master' 2025-10-07 18:43:11 +02:00
kindlm 06788bafc8 ParseHTML bei statistik.class ergänzt. SVNR aus BIS-Checks entfernt 2025-10-07 18:42:50 +02:00
Alexei Karpenko 309faaae06 phrasesupdate coma bugfix 2025-10-06 16:57:31 +02:00
Alexei Karpenko 1c21e8f88d Merge branch 'master' into feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten 2025-10-06 16:54:41 +02:00
ma0068 984d81edb6 add tag component to List.js, add column tags to table, add functionality add, delete and update 2025-10-06 16:37:17 +02:00
Alexei Karpenko 5640f229d3 Studierendenverwaltung add Interessenten: switched to new API, Studienplaene are loaded in time 2025-10-06 16:10:06 +02:00
Johann Hoffmann 1e23b6de61 download files with window.open instead of window.location; fix signature mail student_modal info loading; check length of every entry field when doing endupload and force user to accept or cancel upon notification; berechtigung check für Abgabetool.php controller; phrasen everywhere; 2025-10-06 13:58:26 +02:00
ma0048 9309a48e97 autcomplete gefixed 2025-10-06 10:20:21 +02:00
Alexei Karpenko b22c6c10e4 Student.php controller: renamed method add Interessent to addFirstPrestudentstatus 2025-10-03 14:05:40 +02:00
Alexei Karpenko 60a1d40048 prstudentlib incoming: removed addmeta (debugging) 2025-10-03 14:03:41 +02:00
Alexei Karpenko 8c6033fed6 add first incoming: correctly check lehrverband, moved creating of incoming prestudentstatus to prestudent lib 2025-10-03 14:02:53 +02:00
ma0068 e79bb607d9 add permission validation oe for lehreinheit 2025-10-03 10:23:25 +02:00
Johann Hoffmann dab34eff35 klickibunti farben in accordion headers je nach datum/abgabedatum combo; more color definitions cis4 default.css; nomore legacy classes in Abgabe.php, CI3 models only; confirm delete Termin prompt; endupload validation stub, not sure about the technical min requirements here; mitarbeiter table format fix; show noten in projektarbeit view for students so there is some distinction; fhc isMobile computed revamp; order projektarbeiten by insertamum DESC to get most recent ones at the top of lists; 2025-10-02 16:53:41 +02:00
Alexei Karpenko 3a6fb08350 Creating of Interessenten: moved to PRestudentlib, renamed check to getPerson, corrected transaction handling, enabled creating of Incomings 2025-10-02 16:52:11 +02:00
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
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
ma0068 890b50c830 add new api for notiz 2025-10-01 13:13:41 +02:00
Johann Hoffmann c796536417 notiz -> beurteilungsnotiz; some missing phrasen; more color definitions (WIP); finalize automagic modal logic; added validation stub for endupload; loading spinner on every upload; added custom header classes to code unexpanded paabgabe accordion tabs by their abgabedatum or lack thereof (WIP); 2025-09-30 16:47:05 +02:00
ma0068 3664428467 add logic to edit and delete Personfoto 2025-09-30 10:50:01 +02:00
Harald Bamberger 845c75b775 Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-09-26 12:33:39 +02:00
ma0068 5326f961c6 DetailHeader: add uid to redirectToLeitung 2025-09-25 11:25:55 +02:00
ma0048 0f43e8eb7a autocomplete auf backend umgestellt
textarea formattedAnmerkung rausgenommen
ui angepasst
2025-09-24 14:27:01 +02:00
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 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 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
Johann Hoffmann 14f5a651a4 abgabetool rechte; WIP magic modal for next QG Termin logic handling; 2025-09-22 10:47:12 +02:00
Johann Hoffmann ce9f0536d6 Merge branch 'master' into feature-61164/AbgabetoolQualityGates 2025-09-17 16:40:53 +02:00
Johann Hoffmann 48f7a04d81 wip abgabetool 2025-09-11 16:27:24 +02:00
Johann Hoffmann 4e598a321d wip add new abgabe wizard 2025-09-08 10:44:41 +02:00
Andreas Österreicher 9067f0e00a Merge branch 'master' into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2025-09-05 12:48:33 +02:00
Andreas Österreicher 4099d91a1b Vertragsverwaltung - Filter korrigiert fuer aktive und inaktive
Mitarbeiter
2025-09-05 12:45:39 +02:00
Johann Hoffmann 49ca538381 student page redesign; wip mitarbeiter page + add new modal 2025-09-04 17:38:32 +02:00
Johann Hoffmann 5f1c7537fb WIP 2025-09-04 11:04:12 +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
ma0068 1bb10ddeb1 refactor backend filter 2025-09-03 10:43:20 +02:00
ma0068 49e89f44be set default domain to fhcomplete.info 2025-09-02 20:37:20 +02:00
ma0068 e5cf417ac0 adapt headerFilter, remove frontend filter, add backend filter aktiv mitarbeiter 2025-09-02 20:29:23 +02:00
Johann Hoffmann a560c335b8 WIP responsive tabulator collapse abgabetool; paabgabe notiz column; 2025-09-02 13:35:42 +02:00
ma0068 ea85cce957 own controller detailHeader, bugfix loadDepartmentdata 2025-09-01 09:37:30 +02:00
Johann Hoffmann 1f0fe08b69 upload_required => allowed; hardcoded links => config; styling; endupload/qualgate logic; phrasen; 2025-08-29 14:15:20 +02:00
Johann Hoffmann 63390b192c qualgate 1&2 dbupdate script, note fkey reference & upload required flag in paabgabe; noten api duplicate from notentool for now; WIP more emails; qualgates benotbar & saveable aswell as upload flag; 2025-08-26 17:15:37 +02:00
Johann Hoffmann e97c26022f Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates 2025-08-25 12:00:30 +02:00
Johann Hoffmann 483662726d abgabetool api/controller refactor; quality gates dbupdate script; load types from backend instead of hardcoded; WIP email check for externe betreuer; 2025-08-22 14:40:58 +02:00
Andreas Österreicher 703872adc9 Merge branch 'master' into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2025-08-20 11:14:40 +02:00
Harald Bamberger e2d6e5d9c8 Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-08-14 18:38:04 +02:00
Cristina bbf147ec39 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-08-14 11:37:57 +02:00
ma0048 4a8868a709 verfasser nur noch readonly - wird im backend gesetzt 2025-07-21 15:29:57 +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
ma0068 10399db372 add handling comma in combination with titelpost 2025-07-14 09:42:41 +02:00
ma0068 179b50c798 fixed js-warnings
- Extraneous non-props attributes
 - duplicate html code
 - html template error
2025-07-10 14:27:54 +02:00
ma0068 ec1960e839 Bugfix: Delete Vertragsstatus if Betreuung 2025-07-10 13:33:54 +02:00
ma0068 a942423e84 remove unused code 2025-07-10 12:44:35 +02:00
ma0048 153e273fec firefox check entfernt 2025-07-09 13:52:46 +02:00
ma0068 3ca49c5574 refactor function getHeader, get mitarbeiter_uid as prop instead of using function getMitarbeiterUid 2025-07-08 15:01:54 +02:00
ma0068 d1e35b1851 bugfix js error after sort: take out persistance for header filter 2025-07-03 12:14:00 +02:00
ma0068 46a10bd92e page handling
- entry in main navigation menu
- import navigation component
- remove space side menu
2025-07-03 11:14:20 +02:00
ma0068 b4d5e1c90a bugfix delete Vertragsdetails, add missing data updateamum, updatevon 2025-07-02 13:41:08 +02:00
Cristina 0df082af1f Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-07-02 12:16:19 +02:00
Cristina b3c05f2fe1 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-07-02 12:15:21 +02:00
Cristina 56bfe46675 Added phrases for lvevaluierung 2025-07-02 12:12:44 +02:00
ma0068 411b97fa14 reload Vertragsstatus if change of mitarbeiter 2025-07-02 11:54:32 +02:00
ma0068 56e8a34d68 readd Phrasen Vertragsverwaltung 2025-07-02 09:09:33 +02:00
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
ma0068 8c69bc1682 Headerfunctions in headerAPI auslagern 2025-06-11 15:28:19 +02:00
ma0068 2eef05e593 - refactore POST_Variablen with form_validation->set_data
- add phrase: Vertragsstatus bearbeiten
- filterActive: bugfix
2025-06-11 15:02:31 +02:00
ma0068 a56a804692 - fix error with Event 'multiActionPrintHonorarvertrag'
- Naming components Vertragsverwaltung, MitarbeiterHeader, CoreListMitarbeiter
- link to Vorgesetzter, show Vorgesetzter without postTitel
- Foto: if foto_sperre: show foto with lock
2025-06-11 13:46:23 +02:00
ma0068 a8f47fad45 copy Component DetailHeader into Vertragsverwaltung 2025-06-10 13:10:26 +02:00
ma0068 6f60d7c99e API Refactoring, some other minor fixes 2025-06-10 11:57:43 +02:00
ma0068 7d2da9e7f6 Merge master into feature-52533_62055/Vertragsverwaltung_mit_CoreComponent_DetailHeader 2025-06-06 11:46:31 +02:00
Cristina 5ee72fd836 Merge branch 'master' into epic-56039/LV-Evaluierung_NEU 2025-05-27 18:23:51 +02:00
Cristina 4f8c408a8a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2025-05-27 18:22:45 +02:00
Harald Bamberger 8925692dd4 Merge branch 'master' into feature-39571/Studierendenverwaltung_CoreNotizcontroller 2025-05-21 17:03:58 +02:00
Cristina d4feee8914 Fixed wrong param causing wrong Notenliste for Wiederholer 2025-03-18 14:30:19 +01:00
Paolo bb476bb257 Merge branch 'master' into bug-56209/is_valid_date_vs_isValidDate 2025-03-12 11:54:50 +01:00
Paolo 7b74c36952 - Removed public method isValidDate from controller api/frontend/v1/studstatus/Unterbrechung
- Replaced callback_isValidDate with is_valid_date
- Removed global function isValidDate from helpers/hlp_common_helper
2025-02-27 12:09:30 +01:00
ma0068 31af28a7c4 Merge branch 'feature-52533/PV21_Karteireiter_Vertraege' of github.com:FH-Complete/FHC-Core into feature-52533/PV21_Karteireiter_Vertraege 2025-02-19 16:37:47 +01:00
ma0068 f3527dc8ff bugfix function getMitarbeiterUid 2025-02-19 16:37:30 +01:00
ma0068 660f9076ce delete commented out sections 2025-02-14 09:38:33 +01:00
ma0068 24682fb559 changeFormat Dates, use different select for MitarbeiterHeader before PV21, adapt condition for multiselect addon 2025-02-12 17:05:18 +01:00
ma0048 bc48445304 - infocenter filter fuer electronic onboarding hinzugefuegt 2025-02-10 13:05:44 +01:00
ma0068 295e2aa3e5 adaptions styling 2025-01-22 11:17:09 +01:00
ma0068 0d0071e8bf refactoring and codesniff 2025-01-22 07:57:39 +01:00
ma0068 9c0baeacf2 Add Logic Permission and Phrases 2025-01-21 15:34:43 +01:00
ma0068 ffc99379ae Injection ADDON KU for Multiselect and Print Honorarvertrag 2025-01-20 15:25:06 +01:00
ma0068 35d8f0524d new page vertragsverwaltung with employee header and details components 2025-01-15 13:56:00 +01:00
ma0068 07e6146e50 Validations, Phrases, cleanup 2024-11-19 14:34:50 +01:00
ma0068 5751441424 filter offene Vertraege, validations insert, update Contract 2024-11-12 07:57:46 +01:00
ma0068 023fafde2c update reload functions, adapt delete contract, add watcher in unassignedList 2024-11-11 10:37:51 +01:00
ma0068 2d0285e31d add and update Lehrauftraege, logic sumup beträge 2024-11-08 13:29:19 +01:00
ma0068 9fd9c4e94d edit Status Contracts 2024-11-06 11:43:59 +01:00
ma0068 40baa7e08c update childcomponent vertragstati 2024-11-05 16:06:14 +01:00
ma0068 b1452698f8 Start View Karteireiter, Components Unassigned, Details and Stati 2024-11-04 12:54:34 +01:00
ma0068 6e9ee7cf81 Notizcomponent: Api Controller for Notizzuordnungs_ids 2024-05-03 09:43:49 +02:00
329 changed files with 27304 additions and 5753 deletions
@@ -0,0 +1,36 @@
<?php
$filterCmptArray = array(
"app" => 'core',
'datasetName' => 'vertragsverwaltung',
'query' => '
SELECT
uid,
person_id,
vorname,
nachname,
gebdatum,
vertragsarten,
unternehmen,
ids,
aktiv
FROM
(
SELECT
b.uid , p.person_id,
p.vorname, p.nachname,
gebdatum,
STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten,
STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen,
STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids,
b.aktiv
FROM
hr.tbl_dienstverhaeltnis d
JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid
JOIN public.tbl_person p ON p.person_id = b.person_id
JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz
JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz
GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv
) as vertragsdaten
',
'requiredPermissions' => 'vertrag/mitarbeiter'
);
+12 -12
View File
@@ -6,30 +6,30 @@ use CI3_Events as Events;
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["lehreinheit"] = array(
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js',
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js',
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalContent.js',
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["reservierung"] = array(
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js',
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalTitle.js',
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalContent.js',
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["ferien"] = array(
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js',
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js',
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js',
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
);
});
+45
View File
@@ -0,0 +1,45 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['turnitin_link'] = 'https://technikum-wien.turnitin.com/sso/sp/redwood/saml/5IyfmBr2OcSIaWQTKlFCGj/start';
$config['old_abgabe_beurteilung_link'] = 'https://moodle.technikum-wien.at/mod/page/view.php?id=1005052';
$config['PAABGABE_EMAIL_JOB_INTERVAL'] = '1 day';
// used as APP_ROOT.URL_STUDENTS -> cis4
$config['URL_STUDENTS'] = 'cis.php/Cis/Abgabetool/Student';
// used as APP_ROOT.URL_MITARBEITER -> old cis
$config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter';
// used as APP_ROOT.URL_MITARBEITER -> old cis
$config['URL_ASSISTENZ'] = 'index.ci.php/Cis/Abgabetool/Assistenz';
// lehre.tbl_paabgabetyp bezeichnung
//$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2'];
$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['abstract','zwischen', 'qualgate1', 'qualgate2']; // tbl_paabgabetyp pk
// paabgabetypen for which betreuer is benachrichtigt via sammelmail
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'] = ['qualgate1', 'qualgate2', 'end'];
// paabgabetypen for which assistenz is benachrichtigt via sammelmail
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end'];
// paabgabetypen for which student is benachrichtigt via sammelmail -> basically all of them but still defined for consistency
$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'] = ['qualgate1', 'qualgate2', 'zwischen', 'note', 'abstract', 'end', 'enda'];
//$config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden'];
$config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk
// benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel
// wie zB "Nicht beurteilt" & "Noch nicht eingetragen"
$config['NONFINAL_NOTEN_ABGABETOOL'] = [9];
$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?';
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
$config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end'];
// to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing
$config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl';
$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true;
$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true;
$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true;
+1 -1
View File
@@ -4,7 +4,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// CMS Content Id for CIS4 Menu Root
$config['cis_menu_root_content_id'] = 11087;
$config['cis_menu_root_content_id'] = 11091;
// send Mails for ProfilUpdate
$config['cis_send_profil_update_mails'] = true;
// Vilesci CI BaseUrl
+3
View File
@@ -7,3 +7,6 @@ $config['use_vuejs_dev_version'] = false;
$config['use_bundled_javascript'] = false;
// systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered
$config['systemerror_mailto'] = '';
// use fhcomplete_build_version as path element after public (requires apache mod_rewrite)
// see <fhc_base_dir>/public/.htaccess_sample for details
$config['use_fhcomplete_build_version_in_path'] = false;
+19
View File
@@ -163,6 +163,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 50,
'requiredPermissions' => 'lehre/gruppenmanager:r'
),
'vertragsverwaltung' => array(
'link' => site_url('vertragsverwaltung'),
'description' => 'Vertragsverwaltung',
'expand' => true,
'sort' => 51,
'requiredPermissions' => 'vertrag/mitarbeiter:r'
)
)
),
@@ -335,6 +342,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
),
);
$config['navigation_menu']['vertragsverwaltung/*'] = array(
'vertragsverwaltung' => array(
'link' => site_url('vertragsverwaltung'),
'description' => 'Vertragsverwaltung',
'icon' => 'home',
'sort' => 100,
'target' => '_blank',
'requiredPermissions' => array('vertrag/mitarbeiter:r')
)
);
$config['navigation_menu']['apps'] = [
+7
View File
@@ -65,6 +65,13 @@ $route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
$route['Abgabetool/Mitarbeiter'] = 'Cis/Abgabetool/Mitarbeiter';
$route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
// Studierendenverwaltung List Routes
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
+28 -4
View File
@@ -61,7 +61,11 @@ $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
@@ -84,9 +88,14 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
);
}
$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] = '4.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] = '5.0';
$config['tabs']['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'] = true;
$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'] = [
@@ -115,7 +124,22 @@ $config['student_tab_order'] = [
$config['students_tab_order'] = [
'banking',
'status',
'messages',
'groups',
'finalexam',
'combinePeople',
'archive',
];
$config['stv_prestudent_tags'] = [
'prioone' => ['readonly' => false],
'priotwo' => ['readonly' => true],
'hinweis' => ['readonly' => false],
'hinweis_assistenz' => ['readonly' => true],
'hinweis_kf' => ['readonly' => true],
'hinweis_lehrende' => ['readonly' => false],
'hinweis_stg_kf' => ['readonly' => true],
'finished_stg' => ['readonly' => true],
'finished_kf' => ['readonly' => true],
'inwork_kf' => ['readonly' => true],
];
+39 -50
View File
@@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller
{
parent::__construct([
'index' => self::PERM_LOGGED,
'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
'Mitarbeiter' => self::PERM_LOGGED,
'Student' => self::PERM_LOGGED,
'Deadlines' => self::PERM_LOGGED
'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
'Assistenz' => array('basis/abgabe_assistenz:rw'),
'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
]);
}
@@ -29,80 +29,69 @@ class Abgabetool extends Auth_Controller
*/
public function index()
{
// TODO: routing from index based on berechtigung?
$viewData = array(
'uid'=>getAuthUID(),
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
}
}
public function Student()
public function Student($student_uid_prop = '')
{
$viewData = array(
'uid'=>getAuthUID(),
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
}
}
public function Mitarbeiter()
{
$viewData = array(
'uid'=>getAuthUID(),
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
}
}
public function Assistenz($stg_kz_prop = '')
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
}
}
public function Deadlines()
{
$viewData = array(
'uid'=>getAuthUID(),
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
}
public function getStudentProjektarbeitAbgabeFile()
{
$this->_ci =& get_instance();
$this->_ci->load->helper('download');
$paabgabe_id = $this->_ci->input->get('paabgabe_id');
$student_uid = $this->_ci->input->get('student_uid');
if (!isset($paabgabe_id) || isEmptyString($paabgabe_id) || !isset($student_uid) || isEmptyString($student_uid))
$this->terminateWithJsonError($this->p->t('global', 'wrongParameters'), 'general');
$this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$isZugeteilterBetreuer = count($this->_ci->ProjektarbeitModel->checkZuordnung($student_uid, getAuthUID())->retval) > 0;
if(getAuthUID() == $student_uid || $isZugeteilterBetreuer) {
$file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
if(file_exists($file_path)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
header('Content-Length: ' . filesize($file_path));
flush(); // send headers first just in case
readfile($file_path); // read file content to output buffer
} else {
$this->terminateWithJsonError('File not found');
}
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
} else {
$this->terminateWithJsonError('Keine Zuordnung!');
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
}
}
}
-5
View File
@@ -33,9 +33,4 @@ class MyLv extends Auth_Controller
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
}
public function Info($studien_semester,$lvid)
{
$this->load->view('Cis/LvInfo',['lvid'=> $lvid, 'studien_semester' => $studien_semester]);
}
}
+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
]);
}
}
@@ -28,10 +28,14 @@ class Studentenverwaltung extends Auth_Controller
'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'),
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
'admin' => $this->permissionlib->isBerechtigt('admin'),
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'),
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(),
'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(),
'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(),
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
@@ -39,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller
]);
}
}
@@ -0,0 +1,30 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Vertragsverwaltung extends Auth_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
#$permissions[$router->method] = ['admin:rw'];
parent::__construct($permissions);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
/**
* @return void
*/
public function _remap()
{
$this->load->view('Vertragsverwaltung', [
'permissions' => [
'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid')
]
]);
}
}
File diff suppressed because it is too large Load Diff
@@ -208,7 +208,6 @@ class Documents extends FHCAPI_Controller
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
$this->addMeta("ress", $result);
$vorlage = current($this->getDataOrTerminateWithError($result));
if (!$vorlage)
show_404();
@@ -221,7 +220,7 @@ class Documents extends FHCAPI_Controller
'gedruckt' => true,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
'uid' => $this->input->post_get('uid') ?: '',
'uid' => $this->input->post_get('uid') ?: null,
'archiv' => true,
'signiert' => !!$sign_user,
'stud_selfservice' => $vorlage->stud_selfservice
@@ -251,6 +250,9 @@ class Documents extends FHCAPI_Controller
'studiensemester_kurzbz' => $ss,
'student_uid' => $akteData['uid']
]);
if (!hasData($result)) $this->terminateWithError($this->p->t("stv", "error_noLehrverbandAssigned"));
$res = current($this->getDataOrTerminateWithError($result));
$studiengang_kz = $res->studiengang_kz;
@@ -332,6 +334,7 @@ class Documents extends FHCAPI_Controller
if ($prestudent_id) {
$this->load->model('crm/prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addSelect('tbl_prestudent.*, UPPER(typ || kurzbz) AS kuerzel');
$result = $this->PrestudentModel->load($prestudent_id);
$prestudent = current($this->getDataOrTerminateWithError($result));
@@ -442,6 +445,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);
@@ -38,34 +38,9 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
'Pruefungen' => self::PERM_LOGGED,
'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung?
'getStudentProjektabgaben' => self::PERM_LOGGED,
'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED,
'postStudentProjektarbeitEndupload' => self::PERM_LOGGED,
'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED,
'postProjektarbeitAbgabe' => self::PERM_LOGGED,
'deleteProjektarbeitAbgabe' => self::PERM_LOGGED,
'postSerientermin' => self::PERM_LOGGED,
'fetchDeadlines' => self::PERM_LOGGED // TODO: mitarbeiter recht prüfen
'Pruefungen' => self::PERM_LOGGED
]);
$this->load->library('PhrasesLib');
$this->loadPhrases(
array(
'global',
'ui',
'abgabetool'
)
);
$this->load->helper('hlp_sancho_helper');
require_once(FHCPATH . 'include/studiengang.class.php');
require_once(FHCPATH . 'include/student.class.php');
require_once(FHCPATH . 'include/projektarbeit.class.php');
require_once(FHCPATH . 'include/projektbetreuer.class.php');
}
//------------------------------------------------------------------------------------------------------------------
@@ -125,557 +100,5 @@ class Lehre extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
/**
* fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool
*/
public function getStudentProjektabgaben() {
$projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
// TODO: error messages
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$projektarbeit_obj = new projektarbeit();
if($projektarbeit_id==-1)
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
if(!$projektarbeit_obj->load($projektarbeit_id))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
// TODO: fetch zweitbetreuer
$this->terminateWithSuccess(array($ret, $paIsCurrent));
}
/**
* fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool
*/
public function getStudentProjektarbeiten($uid)
{
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
if (!isset($uid) || isEmptyString($uid))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$isZugeteilterBetreuer = count($this->ProjektarbeitModel->checkZuordnung($uid, getAuthUID())->retval) > 0;
$this->addMeta('isZugeteilterBetreuer', $isZugeteilterBetreuer);
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
if ($isMitarbeiter && $isZugeteilterBetreuer){
$projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid);
} else {
$projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
}
$this->terminateWithSuccess(array($projektarbeiten, DOMAIN, $uid));
}
/**
* projektarbeit - upload for zwischenabgaben in cis4 student abgabetool
*/
public function postStudentProjektarbeitZwischenabgabe()
{
$projektarbeit_id = $_POST['projektarbeit_id'];
$paabgabe_id = $_POST['paabgabe_id'];
$student_uid = $_POST['student_uid'];
$bperson_id = $_POST['bperson_id'];
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|| !isset($student_uid) || isEmptyString($student_uid)
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) {
exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'.'"');
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$res = $this->PaabgabeModel->update($paabgabe_id, array(
'abgabedatum' => date('Y-m-d'),
'updatevon' => getAuthUID(),
'updateamum' => date('Y-m-d H:i:s')
));
$this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
$this->terminateWithSuccess($res);
} else {
$this->terminateWithError('Error moving File');
}
} else {
$this->terminateWithError('File missing');
}
}
/**
* upload für finale abgaben aka Endupload in cis4 student abgabetool
*/
public function postStudentProjektarbeitEndupload()
{
$projektarbeit_id = $_POST['projektarbeit_id'];
$paabgabe_id = $_POST['paabgabe_id'];
$student_uid = $_POST['student_uid'];
$sprache = $_POST['sprache'];
$abstract = $_POST['abstract'];
$abstract_en = $_POST['abstract_en'];
$schlagwoerter = $_POST['schlagwoerter'];
$schlagwoerter_en = $_POST['schlagwoerter_en'];
$seitenanzahl = $_POST['seitenanzahl'];
$bperson_id = $_POST['bperson_id'];
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|| !isset($student_uid) || isEmptyString($student_uid)
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
// TODO: maybe check for other params aswell?
if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) {
// Loads Libraries
$this->load->library('SignatureLib');
// Check if the document is signed
$signaturVorhanden = true;
$signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
if (is_array($signList) && count($signList) > 0)
{
// The document is signed
$uploadedDocumentSigned = 'The document is signed';
}
elseif ($signList === null)
{
$uploadedDocumentSigned = 'WARNING: signature server error';
}
else
{
$signaturVorhanden = false;
$uploadedDocumentSigned = 'No document signature found';
}
$this->addMeta('signaturInfo', $uploadedDocumentSigned);
if ($signaturVorhanden === false)
{
$this->signaturFehltEmail($student_uid);
}
// TODO error handle get data has data the updates
// update projektarbeit cols
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
// update paabgabe datum
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$res = $this->PaabgabeModel->update($paabgabe_id, array(
'abgabedatum' => date('Y-m-d'),
'updatevon' => getAuthUID(),
'updateamum' => date('Y-m-d H:i:s')
));
$this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
$this->terminateWithSuccess($res);
} else {
$this->terminateWithError('Error moving File');
}
} else {
$this->terminateWithError('File missing');
}
}
private function signaturFehltEmail($student_uid) {
// Mail an Studiengang wenn keine Signatur gefunden wurde
$student = new student();
if(!$student->load($student_uid))
$this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
$stg_obj = new studiengang();
if(!$stg_obj->load($student->studiengang_kz))
$this->terminateWithError($this->p->t('global','fehlerBeimLesenAusDatenbank'), 'general');
$subject = 'Abgabe ohne Signatur';
$tomail = $stg_obj->email;
$data = array(
'vorname' => $student->vorname,
'nachname' => $student->nachname,
'studiengang' => $stg_obj->bezeichnung
);
$mailres = sendSanchoMail(
'ParbeitsbeurteilungSiganturFehlt',
$data,
$tomail,
$subject,
'sancho_header_min_bw.jpg',
'sancho_footer_min_bw.jpg'
);
}
private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id);
$projektarbeit_obj = new projektarbeit();
if(!$projektarbeit_obj->load($projektarbeit_id))
$this->terminateWithError('Ungueltiger Eintrag');
$num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
if( null === $num_rows_sem || false === $num_rows_sem )
{
$this->terminateWithError($this->p->t('abgabetool','fehlerAktualitaetProjektarbeit'), 'general');
}
foreach($resBetr->retval as $betreuerRow) {
// query student benutzer view for every betreuer row
$studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
// TODO: hasdata, getData etc
// 1. Begutachter mail ohne Token
$mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
$projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz;
$subject = $projektarbeit_obj->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
$abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
$maildata = array();
$maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":"");
$maildata['anrede'] = $betreuerRow->anrede;
$maildata['betreuer_voller_name'] = $betreuerRow->first;
$maildata['student_anrede'] = $studentUser->anrede;
$maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
$maildata['abgabetyp'] = $abgabetyp;
$maildata['parbeituebersichtlink'] = "<p><a href='".APP_ROOT."cis/private/lehre/abgabe_lektor_frameset.html'>Zur Projektarbeitsübersicht</a></p>";
$maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
$maildata['token'] = "";
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',
$maildata,
$betreuerRow->mitarbeiter_uid."@".DOMAIN,
$subject,
'sancho_header_min_bw.jpg',
'sancho_footer_min_bw.jpg',
get_uid()."@".DOMAIN);
if(!$mailres)
{
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
}
// 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
if ($paabgabetyp_kurzbz == 'end')
{
// Zweitbegutachter holen
$zweitbegutachter = new projektbetreuer();
$zweitbegutachterRes = $zweitbegutachter->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid);
if ($zweitbegutachterRes)
{
$zweitbegutachterResults = $zweitbegutachter->result;
foreach ($zweitbegutachterResults as $begutachter)
{
// token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
$tokenGenRes = $zweitbegutachter->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
if (!$tokenGenRes)
{
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
}
// Zweitbegutachter (evtl. mit Token) holen
$zweitbegutachterMitToken = new projektbetreuer();
$begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
if (!$begutachterMitTokenRes)
{
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
}
// Email an Zweitbegutachter senden
if (isset($zweitbegutachterMitToken->result[0]))
{
$begutachterMitToken = $zweitbegutachterMitToken->result[0];
$path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
$mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
$intern = isset($begutachterMitToken->uid);
$mail_link = $intern ? $mail_fulllink : $mail_baselink;
$zweitbetmaildata = array();
$zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
$zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
$zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
$zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
$zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
$zweitbetmaildata['abgabetyp'] = $abgabetyp;
$zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
$zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
$zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',
$zweitbetmaildata,
$begutachterMitToken->email,
$subject,
'sancho_header_min_bw.jpg',
'sancho_footer_min_bw.jpg',
get_uid()."@".DOMAIN
);
if (!$mailres)
{
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
}
}
}
}
}
}
}
public function getMitarbeiterProjektarbeiten() {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$boolParamStr = $this->input->get('showall');
$trueStrings = ['true', '1'];
$falseStrings = ['false', '0'];
// Handle missing or invalid parameter
if ($boolParamStr === null) {
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$boolParamStrLower = strtolower($boolParamStr);
if (in_array($boolParamStrLower, $trueStrings, true)) {
$showAllBool = true;
} elseif (in_array($boolParamStrLower, $falseStrings, true)) {
$showAllBool = false;
} else {
// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
$this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
}
public function postProjektarbeitAbgabe() {
$projektarbeit_id = $_POST['projektarbeit_id'];
$paabgabe_id = $_POST['paabgabe_id'];
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
$datum = $_POST['datum'];
$fixtermin = $_POST['fixtermin'];
$kurzbz = $_POST['kurzbz'];
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|| !isset($datum) || isEmptyString($datum)
|| !isset($datum) || isEmptyString($datum)
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
if($paabgabe_id == -1) {
$result = $this->PaabgabeModel->insert(
array(
'projektarbeit_id' => $projektarbeit_id,
'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
'fixtermin' => $fixtermin,
'datum' => $datum,
'kurzbz' => $kurzbz,
'insertvon' => getAuthUID(),
'insertamum' => date('Y-m-d H:i:s')
)
);
$this->terminateWithSuccess($result);
} else {
$result = $this->PaabgabeModel->update(
$paabgabe_id,
array(
'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
'datum' => $datum,
'kurzbz' => $kurzbz,
'updatevon' => getAuthUID(),
'updateamum' => date('Y-m-d H:i:s')
)
);
$this->terminateWithSuccess($result);
}
}
public function deleteProjektarbeitAbgabe() {
$paabgabe_id = $_POST['paabgabe_id'];
if (!isset($paabgabe_id) || isEmptyString($paabgabe_id))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$result = $this->PaabgabeModel->load($paabgabe_id);
$result = $this->getDataOrTerminateWithError($result);
if(count($result) == 0)
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
// TODO: berechtigung?
if($result[0]->insertvon === getAuthUID()) {
$result = $this->PaabgabeModel->delete($paabgabe_id);
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
/**
* endpoint for adding the same paabgabe for multiple projektarbeiten
* can be slow for large n since it queries twice per projektarbeit_id
*/
public function postSerientermin() {
$projektarbeit_ids = $_POST['projektarbeit_ids'];
$datum = $_POST['datum'];
$paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
$bezeichnung = $_POST['bezeichnung'];
$kurzbz = $_POST['kurzbz'];
if (!isset($projektarbeit_ids) || !is_array($projektarbeit_ids) || empty($projektarbeit_ids)
|| !isset($datum) || isEmptyString($datum)
|| !isset($kurzbz) || isEmptyString($kurzbz)
|| !isset($bezeichnung) || isEmptyString($bezeichnung)
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
// old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz
// for each termin - good to check that in principle but should not matter in this place. if necessary
// duplicate abgabetermine can be easily deleted manually, also via cronjob@night.
// since this entry includes the kurzbz string match, it should have only ever mattered when there were
// multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the
// general "saveMultiple" function should handle
// old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui
// and should never unintentionally happen
// TODO: check berechtigung &/|| zuordnung?
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$res = [];
foreach ($projektarbeit_ids as $projektarbeit_id) {
$result = $this->PaabgabeModel->insert(
array(
'projektarbeit_id' => $projektarbeit_id,
'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
'fixtermin' => false,
'datum' => $datum,
'kurzbz' => $kurzbz,
'insertvon' => getAuthUID(),
'insertamum' => date('Y-m-d H:i:s')
)
);
$data = $this->getDataOrTerminateWithError($result);
// $res[] = $data;
// send mail to student
$result = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
$data = $this->getDataOrTerminateWithError($result);
// $this->addMeta('emaildata'.$projektarbeit_id, $data);
$datetime = new DateTime($datum);
$dateEmailFormatted = $datetime->format('d.m.Y');
$anredeFillString = $data[0]->anrede=="Herr"?"r":"";
$fullFormattedNameString = trim($data[0]->titelpre." ".$data[0]->vorname." ".$data[0]->nachname." ".$data[0]->titelpost);
$res[] = $fullFormattedNameString;
// Prepare mail content
$body_fields = array(
'anrede' => $data[0]->anrede,
'anredeFillString' => $anredeFillString,
'datum' => $dateEmailFormatted,
'bezeichnung' => $bezeichnung,
'fullFormattedNameString' => $fullFormattedNameString,
'kurzbz' => $kurzbz
);
$email = $data[0]->uid."@".DOMAIN;
sendSanchoMail(
'neuerAbgabetermin',
$body_fields,
$email,
$this->p->t('abgabetool', 'neuerTerminBachelorMasterbetreuung')
);
}
$this->terminateWithSuccess($res);
}
public function fetchDeadlines() {
$person_id = $_POST['person_id'];
if (!isset($person_id) || isEmptyString($person_id))
$person_id = getAuthPersonId();
if($person_id !== getAuthPersonId()) {
$this->load->library('PermissionLib');
$isAdmin = $this->permissionlib->isBerechtigt('admin');
if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
}
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$result = $this->PaabgabeModel->getDeadlines($person_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -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))
@@ -0,0 +1,53 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Detailheader extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getHeader' => ['vertrag/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
]);
}
public function getHeader($person_id)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getHeader($person_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getPersonAbteilung($mitarbeiter_uid)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getLeitungOrg($oekurzbz)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
}
@@ -0,0 +1,237 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Foto extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'uploadFoto' => ['admin:r', 'assistenz:r'],
'deleteFoto' => ['admin:r', 'assistenz:r'],
]);
//Load Models and Libraries
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model("crm/Akte_model", "AkteModel");
$this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel');
$this->loadPhrases([
'ui',
'header'
]);
}
public function uploadFoto($person_id)
{
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
}
$data = json_decode(file_get_contents("php://input"), true);
if (!empty($data['image']))
{
$base64 = $data['image'];
$resizedImage1 = $this->_resize($base64, 827, 1063);
if (is_null($resizedImage1))
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
$akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil'));
$akteUpdateData = array(
'dokument_kurzbz' => 'Lichtbil',
'person_id' => $person_id,
'inhalt' => $resizedImage1,
'mimetype' => 'image/jpg',
'erstelltam' => date('c'),
'gedruckt' => false,
'titel' => 'Lichtbild_' . $person_id . '.jpg',
'bezeichnung' => 'Lichtbild gross',
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
);
if (hasData($akte)) {
$akte_id = getData($akte)[0]->akte_id;
$akteUpdateData['updateamum'] = date('c');
$akteUpdateData['updatevon'] = getAuthUID();
$akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData);
} else {
$akteResult = $this->AkteModel->insert($akteUpdateData);
}
if (isError($akteResult)) {
return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL);
}
$resizedImage2 = $this->_resize($base64, 101, 130);
if (is_null($resizedImage2))
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
$result = $this->_updateFoto($person_id, $resizedImage2);
if (!isError($result)) {
$this->FotostatusPersonModel->insert(array(
'person_id' => $person_id,
'fotostatus_kurzbz' => 'hochgeladen',
'datum' => date('Y-m-d'),
'updateamum' => date('c'),
'updatevon' => getAuthUID(),
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
));
return $this->terminateWithSuccess($base64);
}
}
else
{
$this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL);
}
}
public function deleteFoto($person_id)
{
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
}
$result = $this->_deleteFoto($person_id);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess($result);
}
private function _resize($imageData, $maxwidth, $maxheight, $quality = 90)
{
$meta = getimagesize($imageData);
if (!$meta)
{
return null;
}
$src_width = $meta[0];
$src_height = $meta[1];
$mime = $meta['mime'];
switch ($mime) {
case 'image/jpeg':
case 'image/jpg':
$imagecreated = imagecreatefromjpeg($imageData);
break;
case 'image/png':
$imagecreated = imagecreatefrompng($imageData);
break;
case 'image/gif':
$imagecreated = imagecreatefromgif($imageData);
break;
default:
return null;
}
if (!$imagecreated)
{
return null;
}
$src_aspect_ratio = $src_width / $src_height;
$thu_aspect_ratio = $maxwidth / $maxheight;
if ($src_width <= $maxwidth && $src_height <= $maxheight)
{
$thu_width = $src_width;
$thu_height = $src_height;
}
elseif ($thu_aspect_ratio > $src_aspect_ratio)
{
$thu_width = (int) ($maxheight * $src_aspect_ratio);
$thu_height = $maxheight;
}
else
{
$thu_width = $maxwidth;
$thu_height = (int) ($maxwidth / $src_aspect_ratio);
}
$imageScaled = imagecreatetruecolor($thu_width, $thu_height);
if ($mime === 'image/png')
{
$background = imagecolorallocate($imageScaled , 0, 0, 0);
imagecolortransparent($imageScaled, $background);
imagealphablending($imageScaled, false);
imagesavealpha($imageScaled, true);
}
imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height);
if ($mime === "image/gif")
{
$background = imagecolorallocate($imageScaled, 0, 0, 0);
imagecolortransparent($imageScaled, $background);
}
if (!empty($imageScaled))
{
ob_start();
if ($mime == 'image/png')
imagepng($imageScaled, NULL);
else if ($mime === 'image/gif')
imagegif($imageScaled, NULL);
else
imagejpeg($imageScaled, NULL, $quality);
$resizedImageData = ob_get_contents();
ob_end_clean();
@imagedestroy($imagecreated);
@imagedestroy($imageScaled);
if (!empty($resizedImageData))
{
return base64_encode($resizedImageData);
}
return null;
}
return null;
}
private function _updateFoto($person_id, $foto)
{
$personJson['foto'] = $foto;
$result = $this->PersonModel->update($person_id, $personJson);
if (isError($result))
{
return error($result->msg, EXIT_ERROR);
}
return $result;
}
private function _deleteFoto($person_id)
{
$personJson['foto'] = null;
$result = $this->PersonModel->update($person_id, $personJson);
if (isError($result))
{
return error($result->msg, EXIT_ERROR);
}
return $result;
}
}
@@ -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)
@@ -47,22 +47,22 @@ class Setup extends FHCAPI_Controller
{
$tabs['details'] = array (
'title' => 'Details',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'),
'config' => []
);
$tabs['gruppen'] = array (
'title' => 'Gruppen',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'),
'config' => []
);
$tabs['lektor'] = array (
'title' => 'LektorInnenzuteilung',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
'config' => []
);
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'config' => []
);
$this->terminateWithSuccess($tabs);
@@ -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,6 +13,7 @@ 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'],
'getDataVorlage' => ['admin:r', 'assistenz:r'],
@@ -21,6 +21,7 @@ class Messages extends FHCAPI_Controller
'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'
]);
}
@@ -101,22 +102,49 @@ class Messages extends FHCAPI_Controller
$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()
@@ -127,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(
@@ -185,47 +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')
{
$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']))
{
@@ -233,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.*');
@@ -288,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);
@@ -336,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);
@@ -343,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);
@@ -352,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)
@@ -403,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);
@@ -416,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]
@@ -425,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);
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizAnrechnung extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "anrechnung_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizBestellung extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "bestellung_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -17,5 +17,106 @@ class NotizLehreinheit extends Notiz_Controller
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
//Permission checks for allowed Oes
$allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: [];
if ($this->router->method == 'addNewNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$lehreinheit_id = $post_data['id'];
if(!$lehreinheit_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
}
if ($this->router->method == 'updateNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $post_data['notiz_id'];
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
//get lehreinheit_id
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
$data = $this->getDataOrTerminateWithError($result);
$lehreinheit_id = current($data)->lehreinheit_id;
if(!$lehreinheit_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
}
if ($this->router->method == 'deleteNotiz')
{
$notiz_id = $this->input->post('notiz_id');
$lehreinheit_id = $this->input->post('id');
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
if(!$lehreinheit_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
}
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
}
private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes)
{
//get oe from lehreinheit
$result = $this->LehreinheitModel->getOes($lehreinheit_id);
$data = $this->getDataOrTerminateWithError($result);
$oes = current($data);
if (!in_array($oes, $allowedOes))
{
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL);
}
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "lehreinheit_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizMitarbeiter extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "mitarbeiter_uid")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -20,33 +20,100 @@ class NotizPerson extends Notiz_Controller
'isBerechtigt' => ['admin:r', 'assistenz:r'],
'getCountNotes' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
//Permission checks for allowed Oes
if ($this->router->method == 'addNewNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$person_id = $post_data['id'];
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
}
if ( $this->router->method == 'updateNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $post_data['notiz_id'];
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
//get person_id
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
$data = $this->getDataOrTerminateWithError($result);
$person_id = current($data)->person_id;
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
}
if ($this->router->method == 'deleteNotiz' )
{
$notiz_id = $this->input->post('notiz_id');
$person_id = $this->input->post('id');
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
if(!$person_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL);
}
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
$this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
}
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "person_id")
{
return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre', 'error_keineSchreibrechte');
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
public function loadDokumente()
//stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs)
{
$notiz_id = $this->input->post('notiz_id');
$result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]);
$data = $this->getDataOrTerminateWithError($result);
// TODO(chris): make CI variant of endpoint
$this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview');
return parent::loadDokumente();
$checkarray = [];
foreach ($data as $item)
{
if(in_array($item->studiengang_kz, $allowedStgs))
{
return true;
}
}
$this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
}
}
@@ -0,0 +1,117 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizPrestudent extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
//Load Models
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
$this->load->model('crm/Student_model', 'StudentModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load language phrases
$this->loadPhrases([
'ui'
]);
//Permission checks for Studiengangsarray
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
if ($this->router->method == 'addNewNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$prestudent_id = $post_data['id'];
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
}
if ($this->router->method == 'updateNotiz')
{
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $post_data['notiz_id'];
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
//get prestudent_id
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
$data = $this->getDataOrTerminateWithError($result);
$prestudent_id = current($data)->prestudent_id;
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
}
if ($this->router->method == 'deleteNotiz')
{
$notiz_id = $this->input->post('notiz_id');
$prestudent_id = $this->input->post('id');
if(!$notiz_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
}
if(!$prestudent_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
}
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
}
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "prestudent_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs)
{
$student_uid = $this->StudentModel->getUID($prestudent_id);
$result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
$data = $this->getDataOrTerminateWithError($result);
$studiengang_kz = current($data)->studiengang_kz;
if (!in_array($studiengang_kz, $allowedStgs))
{
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjekt extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "projekt_kurzbz")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjektphase extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "projektphase_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjekttask extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "projekttask_id")
{
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
//TODO define permission
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre','error_keineSchreibrechte');
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
}
@@ -0,0 +1,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) : []);
}
}
@@ -25,7 +25,8 @@ class Studiensemester extends FHCAPI_Controller
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -152,4 +153,17 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess((getData(success($studienjahrObj))));
}
public function getAllStudiensemesterAndAktOrNext() {
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder("start", "DESC");
$result = $this->StudiensemesterModel->getAktOrNextSemester();
$aktuell = getData($result)[0];
$this->StudiensemesterModel->addSelect('*');
$result = $this->StudiensemesterModel->load();
$studiensemester = getData($result);
$this->terminateWithSuccess(array($studiensemester, $aktuell));
}
}
@@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->form_validation->set_rules(
'datum_wiedereinstieg',
'Datum Wiedereinstieg',
'required|callback_isValidDate|callback_isDateInFuture',
'required|is_valid_date|callback_isDateInFuture',
[
'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
'is_valid_date' => $this->p->t('ui', 'error_invalid_date'),
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
]
);
@@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
public function isValidDate($date)
{
try {
new DateTime($date);
} catch (Exception $e) {
return false;
}
return true;
}
public function isDateInFuture($date)
{
return new DateTime() < new DateTime($date);
}
}
@@ -36,15 +36,44 @@ class Aufnahmetermine extends FHCAPI_Controller
// Load models
$this->load->model('crm/Reihungstest_model', 'ReihungstestModel');
$this->load->model('crm/RtPerson_model', 'RtPersonModel');
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
public function getAufnahmetermine($person_id)
{
$result = $this->ReihungstestModel->getReihungstestPerson($person_id);
$arrayRt = $this->getDataOrTerminateWithError($result);
$data = $this->getDataOrTerminateWithError($result);
foreach ($arrayRt as $item) {
//Studienplan
$result = $this->StudienplanModel->loadWhere([
'studienplan_id' => $item->studienplan_id
]);
$data = $this->getDataOrTerminateWithError($result);
$studienordnung_id_ber = current($data)->studienordnung_id;
$this->terminateWithSuccess($data);
//Studienordnung
$result = $this->StudienordnungModel->loadWhere([
'studienordnung_id' => $studienordnung_id_ber
]);
$data = $this->getDataOrTerminateWithError($result);
$studiengang_kz_ber = current($data)->studiengang_kz;
//Studiengang von studiengang_kz_ber
$result = $this->StudiengangModel->load($studiengang_kz_ber);
$data = $this->getDataOrTerminateWithError($result);
$studiengangkurzbzlang_ber = current($data)->kurzbzlang;
$typ_ber = current($data)->typ;
//add to Array
$item->studiengang_kz_ber = $studiengang_kz_ber;
$item->studiengangkurzbzlang_ber = $studiengangkurzbzlang_ber;
$item->studiengangtyp_ber = $typ_ber;
}
$this->terminateWithSuccess($arrayRt);
}
public function insertAufnahmetermin()
@@ -60,7 +89,6 @@ class Aufnahmetermine extends FHCAPI_Controller
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
}
$rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null;
$anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null;
$teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false;
@@ -224,7 +252,11 @@ class Aufnahmetermine extends FHCAPI_Controller
)
);
$data = $this->getDataOrTerminateWithError($result);
//check if existing placementtest
if(!hasData($result))
$this->terminateWithSuccess([]);
else
$data = getData($result);
$studienplan_arr = [];
$include_ids = [];
@@ -233,12 +265,18 @@ class Aufnahmetermine extends FHCAPI_Controller
if($item->studienplan_id != null)
$studienplan_arr[] = $item->studienplan_id;
}
if(!hasData($studienplan_arr))
$this->terminateWithSuccess([]);
//get Placementtests Person
$person_id = $this->_getPersonId($prestudent_id);
$resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id);
$dataRt = $this->getDataOrTerminateWithError($resultRt);
//check if existing placementtest
if(!hasData($result))
$this->terminateWithSuccess([]);
else
$dataRt = getData($resultRt);
foreach ($dataRt as $item)
{
@@ -298,7 +336,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']
@@ -354,6 +392,7 @@ class Aufnahmetermine extends FHCAPI_Controller
$person_id = $this->input->get('person_id');
$punkte = $this->input->get('punkte');
$reihungstest_id = $this->input->get('reihungstest_id');
$has_excluded_gebiete = $this->input->get('hasExcludedAreas');
if(!$reihungstest_id)
{
@@ -364,22 +403,27 @@ class Aufnahmetermine extends FHCAPI_Controller
$studiengang_kz = $this->input->get('studiengang_kz');
$this->load->model('testtool/Ablauf_model', 'AblaufModel');
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz);
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz, 1);
$data = $this->getDataOrTerminateWithError($result);
$weightedArray = [];
$basis_gebiet_id_arr = [];
$basis_gebiet_id_toString = '';
foreach ($data as $abl)
{
$weightedArray[$abl->gebiet_id] = $abl->gewicht;
$basis_gebiet_id_arr[]= $abl->gebiet_id;
}
$basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr);
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray);
/* if (isError($result))
{
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}*/
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
$person_id,
$punkte,
$reihungstest_id,
$weightedArray,
$has_excluded_gebiete,
$basis_gebiet_id_toString
);
$this->terminateWithSuccess($result);
}
@@ -33,6 +33,8 @@ 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']
@@ -55,6 +57,95 @@ class Config extends FHCAPI_Controller
}
/**
* 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
@@ -109,7 +200,8 @@ class Config extends FHCAPI_Controller
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
'label_key' => 'beschreibung',
'default' => 'all'
],
'samestg' => [
'type' => 'bool',
@@ -135,7 +227,8 @@ class Config extends FHCAPI_Controller
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung'
'label_key' => 'beschreibung',
'default' => 'all'
],
'samestg' => [
'type' => 'bool',
@@ -240,7 +333,10 @@ class Config extends FHCAPI_Controller
];
$result['status'] = [
'title' => 'Status',
'component' => absoluteJsImportUrl('public/js/components/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'),
@@ -271,7 +367,6 @@ class Config extends FHCAPI_Controller
$result['messages'] = [
'title' => $this->p->t('stv', 'tab_messages'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'),
'showOnlyWithUid' => true
];
$result['grades'] = [
@@ -407,11 +502,25 @@ class Config extends FHCAPI_Controller
]
];
if($this->permissionlib->isBerechtigt('basis/person'))
{
$result['combinePeople'] = [
'title' => $this->p->t('stv', 'tab_combine_people'),
'component' => absoluteJsImportUrl('public/js/components/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;
});
@@ -590,14 +590,14 @@ class Dokumente extends FHCAPI_Controller
$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", $uid, 20, null),
buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Zweisprachig", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uid, 21, 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", $uid, 50, null),
buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uid, 51, 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),
@@ -686,8 +686,8 @@ class Dokumente extends FHCAPI_Controller
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", $uidString, 50, null),
buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uidString, 51, 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),
@@ -753,6 +753,10 @@ class Dokumente extends FHCAPI_Controller
);
$data = $this->getDataOrTerminateWithError($result);
if(!(is_array($data) && count($data) > 0))
{
return null;
}
$student = current($data);
return $student->student_uid;
@@ -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();
@@ -147,7 +147,8 @@ class Gruppen extends FHCAPI_Controller
'lehre' => true,
'sichtbar' => true,
'aktiv' => true,
'direktinskription' => false
'direktinskription' => false,
'generiert' => false
]);
$data = $this->getDataOrTerminateWithError($result);
@@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller
$data[$field] = $this->input->post($field);
if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) {
$data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
$data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
}
$result = [];
@@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'studierendenantrag', 'lehre'
'ui', 'studierendenantrag', 'lehre', 'global'
]);
}
@@ -98,11 +98,9 @@ class Prestudent extends FHCAPI_Controller
'person_id',
'berufstaetigkeit_code',
'ausbildungcode',
'zgv_code',
'zgvort',
'zgvdatum',
'zgvnation',
'zgvmas_code',
'zgvmaort',
'zgvmadatum',
'zgvmanation',
@@ -110,7 +108,6 @@ class Prestudent extends FHCAPI_Controller
'bismelden',
'anmerkung',
'dual',
'zgvdoktor_code',
'zgvdoktorort',
'zgvdoktordatum',
'zgvdoktornation',
@@ -125,6 +122,57 @@ class Prestudent extends FHCAPI_Controller
'standort_code'
];
// add zgv code fields only if user has permission
$this->load->library('PermissionLib');
$prestudentres = $this->PrestudentModel->load($prestudent_id);
if(!hasData($prestudentres))
{
$this->terminateWithError($this->p->t('ui', 'error_fieldNotFound', ['field' => 'Prestudent ' . $prestudent_id]));
}
$prestudent = (getData($prestudentres))[0];
$bakkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array();
$makkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array();
$dokZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array();
if(in_array($prestudent->studiengang_kz, $bakkZgvStg))
{
$array_allowed_props_prestudent[] = 'zgv_code';
}
else if(!is_null($this->input->post('zgv_code')))
{
$this->terminateWithError(
$this->p->t('global', 'zgv')
. ' - ' .
$this->p->t('ui', 'error_keineBerechtigungStg')
);
}
if(in_array($prestudent->studiengang_kz, $makkZgvStg))
{
$array_allowed_props_prestudent[] = 'zgvmas_code';
}
else if(!is_null($this->input->post('zgvmas_code')))
{
$this->terminateWithError(
$this->p->t('lehre', 'zgvMaster')
. ' - ' .
$this->p->t('ui', 'error_keineBerechtigungStg')
);
}
if(in_array($prestudent->studiengang_kz, $dokZgvStg))
{
$array_allowed_props_prestudent[] = 'zgvdoktor_code';
}
else if(!is_null($this->input->post('zgvdoktor_code')))
{
$this->terminateWithError(
$this->p->t('lehre', 'zgvDoktor')
. ' - ' .
$this->p->t('ui', 'error_keineBerechtigungStg')
);
}
// add UDFs
$result = $this->udflib->getDefinitionForModel($this->PrestudentModel);
@@ -17,7 +17,8 @@ class Projektarbeit extends FHCAPI_Controller
'getTypenProjektarbeit' => ['admin:r', 'assistenz:r'],
'getFirmen' => ['admin:r', 'assistenz:r'],
'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'],
'getNoten' => ['admin:r', 'assistenz:r']
'getNoten' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r']
]);
// Load Libraries
@@ -40,11 +41,15 @@ class Projektarbeit extends FHCAPI_Controller
$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');
@@ -53,10 +58,7 @@ class Projektarbeit extends FHCAPI_Controller
$result = $this->ProjektarbeitModel->getProjektarbeit($student_uid);
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
if (!hasData($result)) $this->terminateWithSuccess([]);
@@ -79,6 +81,9 @@ class Projektarbeit extends FHCAPI_Controller
$this->terminateWithSuccess($projektarbeiten);
}
/**
* Load a single Projektarbeit by id.
*/
public function loadProjektarbeit()
{
$projektarbeit_id = $this->input->get('projektarbeit_id');
@@ -101,6 +106,9 @@ class Projektarbeit extends FHCAPI_Controller
$this->terminateWithSuccess(current($data));
}
/**
* Inwert a Projektarbeit.
*/
public function insertProjektarbeit()
{
$student_uid = $this->input->post('uid');
@@ -128,6 +136,9 @@ class Projektarbeit extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
/**
* Update a Projektarbeit by ID.
*/
public function updateProjektarbeit()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
@@ -157,6 +168,9 @@ class Projektarbeit extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
/**
* Delete Projektarbeit by ID after validation.
*/
public function deleteProjektarbeit()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
@@ -185,6 +199,9 @@ class Projektarbeit extends FHCAPI_Controller
return $this->terminateWithSuccess(current(getData($result)) ? : null);
}
/**
* Get all active projekt work types.
*/
public function getTypenProjektarbeit()
{
$result = $this->ProjekttypModel->loadWhere(['aktiv' => true]);
@@ -194,6 +211,9 @@ class Projektarbeit extends FHCAPI_Controller
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Gets companies by search string.
*/
public function getFirmen()
{
$searchString = $this->input->get('searchString');
@@ -208,6 +228,9 @@ class Projektarbeit extends FHCAPI_Controller
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');
@@ -218,6 +241,7 @@ class Projektarbeit extends FHCAPI_Controller
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);
@@ -226,6 +250,7 @@ class Projektarbeit extends FHCAPI_Controller
foreach ($lvs as $lv)
{
// add Lehreinheiten for each Lv for the semester
$lehreinheiten = $this->LehreinheitModel->getLesForLv(
$lv->lehrveranstaltung_id, $studiensemester_kurzbz
);
@@ -250,8 +275,14 @@ class Projektarbeit extends FHCAPI_Controller
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);
@@ -260,18 +291,27 @@ class Projektarbeit extends FHCAPI_Controller
}
/**
*
* @param
* @return object success or error
* 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('titel', 'Titel', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Titel'])
]);
$this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
]);
@@ -297,9 +337,9 @@ class Projektarbeit extends FHCAPI_Controller
}
/**
*
* @param
* @return object success or error
* Extract Projektarbeit data from passed form data.
* @param formData
* @return array
*/
private function _getProjektarbeitArr($formData)
{
@@ -321,9 +361,9 @@ class Projektarbeit extends FHCAPI_Controller
}
/**
*
* @param
* @return object success or error
* Check if deletion of a Projektarbeit is possible.
* @param $projektarbeit_id
* @return object success if deletion possible, error otherwise.
*/
private function _validateDelete($projektarbeit_id)
{
@@ -344,6 +384,11 @@ class Projektarbeit extends FHCAPI_Controller
return success();
}
/**
* Checks permissions for a student.
* @param $student_uid
* @return bool true if authorized
*/
private function _hasBerechtigungForStudent($student_uid)
{
if (!$student_uid)
@@ -3,7 +3,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
use CI3_Events as Events;
use \CI3_Events as Events;
class Projektbetreuer extends FHCAPI_Controller
{
@@ -43,6 +43,9 @@ class Projektbetreuer extends FHCAPI_Controller
$this->load->library('PermissionLib');
}
/**
* Gets Projektbetreuer data for a Projektarbeit.
*/
public function getProjektbetreuer()
{
$projektarbeit_id = $this->input->get('projektarbeit_id');
@@ -50,21 +53,30 @@ class Projektbetreuer extends FHCAPI_Controller
if (!isset($projektarbeit_id))
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
$this->ProjektbetreuerModel->addSelect(
'projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden,
stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost'
);
$this->ProjektbetreuerModel->addSelect("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");
$this->ProjektbetreuerModel->addJoin('public.tbl_person pers', 'person_id');
$result = $this->ProjektbetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
$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);
@@ -86,6 +98,7 @@ class Projektbetreuer extends FHCAPI_Controller
//~ }
//~ }
// add thesis download link (from external extension)
foreach ($projektbetreuer as $pb)
{
$downloadLink = null;
@@ -104,6 +117,9 @@ class Projektbetreuer extends FHCAPI_Controller
$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');
@@ -118,14 +134,36 @@ class Projektbetreuer extends FHCAPI_Controller
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' => $projektbetreuer['stunden'],
'stundensatz' => $projektbetreuer['stundensatz'],
'stunden' => $stunden,
'stundensatz' => $stundensatz,
'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
];
@@ -152,6 +190,9 @@ class Projektbetreuer extends FHCAPI_Controller
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Delete a Projektbetreuer assignment to a Projektarbeit.
*/
public function deleteProjektbetreuer()
{
$projektarbeit_id = $this->input->post('projektarbeit_id');
@@ -159,21 +200,44 @@ class Projektbetreuer extends FHCAPI_Controller
$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));
{
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));
{
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);
$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]
);
@@ -185,9 +249,12 @@ class Projektbetreuer extends FHCAPI_Controller
$this->outputJson($result);
}
return $this->terminateWithSuccess(current(getData($result)) ? : null);
return $this->terminateWithSuccess(getData($result));
}
/**
* Get all active Betreuerarten.
*/
public function getBetreuerarten()
{
$result = $this->BetreuerartModel->loadWhere(['aktiv' => true]);
@@ -197,6 +264,9 @@ class Projektbetreuer extends FHCAPI_Controller
return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
}
/**
* Get all Noten.
*/
public function getNoten()
{
$result = $this->NoteModel->load();
@@ -206,6 +276,9 @@ class Projektbetreuer extends FHCAPI_Controller
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');
@@ -216,6 +289,9 @@ class Projektbetreuer extends FHCAPI_Controller
return $this->terminateWithSuccess($result);
}
/**
* Get all Projektbetreuer by search string.
*/
public function getProjektbetreuerBySearchQuery()
{
$searchString = $this->input->get('searchString');
@@ -227,9 +303,23 @@ class Projektbetreuer extends FHCAPI_Controller
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result)) : []);
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');
@@ -255,9 +345,7 @@ class Projektbetreuer extends FHCAPI_Controller
}
/**
*
* @param
* @return object success or error
* Validate list of Projektbetreuer.
*/
public function validateProjektbetreuer()
{
@@ -277,9 +365,9 @@ class Projektbetreuer extends FHCAPI_Controller
}
/**
*
* @param
* @return object success or error
* Validation funciton for checking Projektbetreuer input.
* @param $formData Betreuer data
* @return bool true when data is valid
*/
private function _validate($formData)
{
@@ -306,26 +394,32 @@ class Projektbetreuer extends FHCAPI_Controller
}
/**
*
* @param
* @return object success or error
* 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)
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]);
$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();
}
/**
*
* @param
* @return object success or error
* Add full name to array with Betreuer.
* @param $betreuerArr
* @return array including Betreuer with their full names
*/
private function _addFullNameToBetreuer($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();
}
}
@@ -636,7 +636,7 @@ class Status extends FHCAPI_Controller
$this->load->library('PrestudentLib');
$this->prestudentlib->setFirstStudent(
$resFirstStudent = $this->prestudentlib->setFirstStudent(
$prestudent_id,
$lastAufgenommener->studiensemester_kurzbz,
$lastAufgenommener->ausbildungssemester,
@@ -645,9 +645,8 @@ class Status extends FHCAPI_Controller
$this->input->post('statusgrund_id')
);
$this->getDataOrTerminateWithError($result);
$this->db->trans_commit();
$this->db->trans_complete();
$this->getDataOrTerminateWithError($resFirstStudent);
return $this->outputJsonSuccess(true);
}
@@ -1078,6 +1077,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
*
@@ -1102,6 +1119,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');
@@ -1112,7 +1130,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');
@@ -1135,9 +1152,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
@@ -1341,6 +1364,7 @@ class Status extends FHCAPI_Controller
'updateamum' => date('c'),
'updatevon' => $authUID
];
$nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe'];
foreach ([
'orgform_kurzbz',
'anmerkung',
@@ -1349,8 +1373,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');
@@ -37,7 +37,7 @@ class Student extends FHCAPI_Controller
'get' => ['admin:r', 'assistenz:r'],
'save' => ['admin:rw', 'assistenz:rw'],
'saveStudent' => ['admin:rw', 'assistenz:rw'],
'check' => ['admin:rw', 'assistenz:rw'],
'getPerson' => ['admin:rw', 'assistenz:rw'],
'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions
]);
@@ -108,30 +108,41 @@ class Student extends FHCAPI_Controller
$this->PrestudentModel->addSelect('p.matr_nr');
$this->PrestudentModel->addSelect('p.anrede');
$this->PrestudentModel->addSelect('p.zugangscode');
if($this->permissionlib->isBerechtigt('student/bpk'))
{
$this->PrestudentModel->addSelect('p.bpk');
}
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(
"(
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"
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
);
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
@@ -147,9 +158,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();
@@ -209,7 +220,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);
@@ -220,7 +231,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;
@@ -233,7 +244,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) {
@@ -293,7 +303,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'];
}
@@ -310,6 +320,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;
}
}
@@ -450,7 +464,7 @@ class Student extends FHCAPI_Controller
return $this->save($student->prestudent_id, $studiensemester_kurzbz);
}
public function check()
public function getPerson()
{
$this->load->library('form_validation');
@@ -468,21 +482,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);
}
@@ -496,71 +544,53 @@ class Student extends FHCAPI_Controller
$_POST['ausbildungssemester'] = 0;
}
$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[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_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_requiredIfStudentFunc|integer|less_than[9]|greater_than[-1]', [
'requiredIfStudentFunc' => $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());
$this->_validate();
// 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);
$data = $this->getDataOrTerminateWithError($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);
}
$this->terminateWithSuccess($data);
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'),
@@ -583,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 = [
@@ -607,52 +643,45 @@ class Student extends FHCAPI_Controller
'typ' => 'h',
'zustelladresse' => true,
];
if ($anlegen < 0) { // Überschreiben
$this->AdresseModel->addSelect('adresse_id');
$this->AdresseModel->addJoin('public.tbl_adressentyp', 'typ = adressentyp_kurzbz');
$this->AdresseModel->addOrder('zustelladresse', 'DESC');
$this->AdresseModel->addOrder('sort');
$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,
@@ -662,87 +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);
}
$personOnly = $anlegen = $this->input->post('personOnly');
private function _addFirstPrestudentstatus($person_id)
{
// Prestudent anlegen
if (!$personOnly)
// 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)
$anmerkung .= ' Ausbildungsart:' . $ausbildungsart;
// Incomings und ausserordentliche sind bei Meldung nicht förderrelevant
$incoming = $this->input->post('incoming');
if ($incoming || substr($studiengang_kz, 0, 1) == '9')
$foerderrelevant = false;
// Prestudent speichern
$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_id = getData($result);
// wenn Incoming, Incoming Daten hinzufügen
if ($incoming)
{
// 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
];
$ausbildungsart = $this->input->post('ausbildungsart');
if ($ausbildungsart)
$data['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;
$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);
// 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);
if ($incoming) {
// TODO(chris): IMPLEMENT!
//Matrikelnummer und UID generieren
//Benutzerdatensatz anlegen
//Studentendatensatz anlegen
//StudentLehrverband anlegen
}
$statusResult = $this->prestudentlib->setFirstIncoming(
$prestudent_id,
$studiengang_kz,
$studiensemester_kurzbz,
$this->input->post('orgform_kurzbz'),
$this->input->post('studienplan_id')
);
}
// TODO(chris): DEBUG
/*$result = $this->PrestudentModel->loadWhere([
'pestudent_id' => 1
]);
if (isError($result)) {
return $result;
}*/
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;
return success($person_id);
return success($prestudent_id);
}
public function requiredIfNotPersonId($value)
@@ -754,20 +766,84 @@ class Student extends FHCAPI_Controller
public function requiredIfAddressFunc($value)
{
if (!$_POST['address']['func'] || $_POST['address']['func'] == 0)
if (!isset($_POST['address']['checked']) || !$_POST['address']['checked'])
return true;
return !!$value;
}
public function requiredIfStudentFunc($value)
{
if ($_POST['personOnly'])
if (isset($_POST['personOnly']) && $_POST['personOnly'])
return true;
return !!$value;
}
public function isValidDate($value)
public function requiredIfStudentAndNotIncomingFunc($value)
{
return isValidDate($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', 'is_valid_date', [
'is_valid_date' => $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;
}
}
@@ -611,7 +611,7 @@ class Students extends FHCAPI_Controller
if (!$verband && !$gruppe && $orgform_kurzbz !== null) {
$this->PrestudentModel->db->where(
"(
SELECT orgform_kurzbz
SELECT orgform_kurzbz
FROM public.tbl_prestudentstatus
WHERE prestudent_id=tbl_prestudent.prestudent_id
AND studiensemester_kurzbz=" . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
@@ -765,6 +765,81 @@ class Students extends FHCAPI_Controller
$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(
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
);
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
$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);
}
/**
* @param string|null $studiensemester_kurzbz
* @param string $type
@@ -775,6 +850,41 @@ class Students extends FHCAPI_Controller
{
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
$this->load->config('stv');
$tags = $this->config->item('stv_prestudent_tags');
$whereTags = '';
if (is_array($tags) && !isEmptyArray($tags)) {
$tags = array_keys($tags);
foreach ($tags as $key => $tag) {
$tags[$key] = $this->db->escape($tag);
}
$whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
}
$subQueryTag = "
(
SELECT
tag.prestudent_id,
COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
FROM (
SELECT DISTINCT ON (n.notiz_id)
n.notiz_id AS id,
nt.typ_kurzbz,
array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
n.text AS notiz,
nt.style,
n.erledigt AS done,
nz.prestudent_id
FROM public.tbl_notizzuordnung AS nz
JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz "
. $whereTags .
"
) AS tag
GROUP BY tag.prestudent_id
) AS tag_data_agg
";
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
@@ -797,8 +907,11 @@ class Students extends FHCAPI_Controller
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->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
$this->PrestudentModel->addSelect("b.uid");
$this->PrestudentModel->addSelect('tag_data_agg.tags');
$this->PrestudentModel->addSelect('titelpre');
$this->PrestudentModel->addSelect('nachname');
$this->PrestudentModel->addSelect('vorname');
@@ -817,14 +930,9 @@ class Students extends FHCAPI_Controller
//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"
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
);
$this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
@@ -861,6 +969,7 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('mentor');
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
$this->PrestudentModel->addSelect('unruly');
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
@@ -0,0 +1,48 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Tags extends Tag_Controller
{
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
public function __construct()
{
parent::__construct([
'getTag' => self::BERECHTIGUNG_KURZBZ,
'getTags' => self::BERECHTIGUNG_KURZBZ,
'addTag' => self::BERECHTIGUNG_KURZBZ,
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ
]);
$this->config->load('stv');
}
public function getTag($readonly_tags = null)
{
parent::getTag($this->config->item('stv_prestudent_tags'));
}
public function getTags($tags = null)
{
parent::getTags($this->config->item('stv_prestudent_tags'));
}
public function addTag($withZuordnung = true, $updatable_tags = null)
{
parent::addTag(true, $this->config->item('stv_prestudent_tags'));
}
public function updateTag($updatable_tags = null)
{
parent::updateTag($this->config->item('stv_prestudent_tags'));
}
public function deleteTag($withZuordnung = true, $updatable_tags = null)
{
parent::deleteTag(true, $this->config->item('stv_prestudent_tags'));
}
public function doneTag($updatable_tags = null)
{
parent::doneTag($this->config->item('stv_prestudent_tags'));
}
}
@@ -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);
}
@@ -76,9 +76,7 @@ class Vertrag extends FHCAPI_Controller
if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
$allOe = hasData($allOe) ? getData($allOe) : [];
$this->addMeta('oe', $allOe);
$allOe = hasData($allOe) ? array_column(getData($allOe), 'oe_kurzbz') : [];
// * then check if the user has permissions to cancel the corresponding lv-organisational units
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
@@ -0,0 +1,62 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about the VV Config
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Config extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'printDocument' => ['vertrag/mitarbeiter:r'],
]);
}
public function printDocument()
{
$params = [];
$menu = [];
Events::trigger(
'multiActionPrintHonorarvertrag',
// passing $menu per reference
function & () use (&$menu) {
return $menu;
},
$params
);
if (is_array($menu) && isset($menu[0]))
{
$this->terminateWithSuccess($menu[0]);
}
else
{
// $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag');
$this->terminateWithSuccess();
}
}
}
@@ -26,9 +26,6 @@ class Vertraege extends FHCAPI_Controller
'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'],
'deleteBetreuung' =>['vertrag/mitarbeiter:w'],
'getMitarbeiter' => ['vertrag/mitarbeiter:r'],
'getHeader' => ['vertrag/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
]);
//Load Models and Libraries
@@ -241,7 +238,7 @@ class Vertraege extends FHCAPI_Controller
}
}
$this->db->trans_complete();
$this->terminateWithSuccess(true);
$this->terminateWithSuccess($vertrag_id);
}
public function updateContract()
@@ -358,7 +355,7 @@ class Vertraege extends FHCAPI_Controller
}
$this->db->trans_complete();
$this->terminateWithSuccess(true);
$this->terminateWithSuccess($vertrag_id);
}
public function loadContract($vertrag_id)
@@ -684,37 +681,4 @@ class Vertraege extends FHCAPI_Controller
}
return $this->terminateWithSuccess(getData($result));
}
public function getPersonAbteilung($mitarbeiter_uid)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getLeitungOrg($oekurzbz)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getHeader($person_id)
{
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
$result = $this->Mitarbeitermodel->getHeader($person_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
}
@@ -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');
}
+33 -8
View File
@@ -33,19 +33,26 @@ class Widget extends Auth_Controller
return $this->outputJsonSuccess([
"widget_id" => 0,
"widget_kurzbz" => "notfound",
"arguments" => json_encode([
"arguments" => [
"className" => 'alert-danger',
"title" => 'Widget Not Found',
"msg" => 'The widget with the id ' . $widget_id . ' could not be found'
]),
"setup" => json_encode([
],
"setup" => [
"name" => 'Widget Not Found',
"file" => 'DashboardWidget/Default.js',
"file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'),
"width" => 1,
"height" => 1
])
]
]);
return $this->outputJsonSuccess(current(getData($widget)));
$widget = current(getData($widget));
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $this->outputJsonSuccess($widget);
}
public function getAll()
@@ -56,7 +63,16 @@ class Widget extends Auth_Controller
if (isError($result))
return $this->outputJsonError(getError($result));
$this->outputJsonSuccess(getData($result) ?: []);
$tmpwidgets = getData($result) ?: [];
$widgets = array_map(function($widget) {
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $widget;
}, $tmpwidgets);
$this->outputJsonSuccess($widgets);
}
public function getWidgetsForDashboard()
@@ -71,7 +87,16 @@ class Widget extends Auth_Controller
]);
}
$this->outputJsonSuccess(getData($result) ?: []);
$tmpwidgets = getData($result) ?: [];
$widgets = array_map(function($widget) {
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $widget;
}, $tmpwidgets);
$this->outputJsonSuccess($widgets);
}
public function setAllowed()
@@ -0,0 +1,913 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class AbgabetoolJob extends JOB_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->_ci =& get_instance();
$this->_ci->load->helper('hlp_sancho_helper');
$this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
$this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->_ci->load->library('SignatureLib');
$this->_ci->load->config('abgabe');
$this->loadPhrases([
'abgabetool'
]);
}
// basically the notifyBetreuerMail function but email goes to assistenz
// and new abgaben are further evaluated for missing signature status
public function notifyAssistenzAboutMissingSignatureUploads() {
$this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutMissingSignatureUploads');
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes);
$retval = getData($result);
// retval are paabgaben joined with projektarbeit and betreuer
if(count($retval) == 0) {
$this->logInfo("Keine Emails über neue Paabgaben an Assistenzen versandt");
return;
}
// group changed/new abgaben for projektarbeiten
$projektarbeiten = [];
foreach($retval as $abgabeWithNewUpload) {
// Check if the current item has a 'projektarbeit_id' field.
// Replace 'projektarbeit_id' with the actual key name if it's different.
if (isset($abgabeWithNewUpload->projektarbeit_id)) {
$projektarbeitId = $abgabeWithNewUpload->projektarbeit_id;
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
// initialize it as an empty array.
if (!isset($projektarbeiten[$projektarbeitId])) {
$projektarbeiten[$projektarbeitId] = [];
}
// check signature for that abgabe, main point of this job
$this->checkAbgabeSignatur($abgabeWithNewUpload, $abgabeWithNewUpload->student_uid);
// Add the current row to the array associated with its 'projektarbeit_id'.
$projektarbeiten[$projektarbeitId][] = $abgabeWithNewUpload;
}
}
// for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails
$assistenzMap = [];
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
$projektarbeitBetreuerMap = [];
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
$assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz);
forEach($assistenzResult->retval as $assistenzRow) {
if (!isset($assistenzMap[$assistenzRow->person_id])) {
$assistenzMap[$assistenzRow->person_id] = [];
}
// Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id.
$assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow];
}
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
forEach($betreuerResult->retval as $betreuerRow) {
if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) {
$projektarbeitBetreuerMap[$projektarbeit_id] = [];
}
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
$projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow;
}
}
$count = 0;
foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
$abgabenString = '<div style="font-family: Arial, sans-serif; color: #333;">';
$hasIssues = false; // Track if this assistant actually needs an email
foreach($tupelArr as $tupel) {
$projektarbeit_id = $tupel[0];
$assistenzRow = $tupel[1];
$betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? [];
$allAbgaben = $projektarbeiten[$projektarbeit_id];
// only keep abgaben that are not correctly signed
$issueAbgaben = array_filter($allAbgaben, function($abgabe) {
// We only care about cases where it's explicitly NOT true (false, error, or null)
return $abgabe->signatur !== true;
});
// if this specific project has no signature issues, skip to the next project
if(empty($issueAbgaben)) {
continue;
}
// If we reached here, we have at least one issue to report
$hasIssues = true;
// Format the Student Name (using the first available abgabe object)
$s = reset($issueAbgaben);
$nameParts = array_filter([$s->titelpre, $s->vorname, $s->nachname, $s->titelpost]);
$studentFullName = implode(' ', $nameParts);
// Format the Supervisors string
$betreuerStrings = [];
foreach($betreuerArray as $b) {
$bNameParts = array_filter([$b->titelpre, $b->vorname, $b->nachname, $b->titelpost]);
$bFullName = implode(' ', $bNameParts);
$betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})";
}
$allBetreuerFormatted = implode(', ', $betreuerStrings);
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
// Project Header Section
$abgabenString .= "
<div style='margin-top: 25px; padding: 12px; background-color: #fff5f5; border-left: 4px solid #dc3545; border-bottom: 1px solid #fee;'>
<strong style='font-size: 16px; color: #b02a37;'>Projekt: {$projektarbeit_titel}</strong><br/>
<div style='margin-top: 5px; font-size: 14px;'>
<strong>Studierende/r:</strong> {$studentFullName}
</div>
<div style='margin-top: 3px; font-size: 14px;'>
<strong>Betreuer:</strong> {$allBetreuerFormatted}
</div>
<span style='color: #666; font-size: 12px;'>
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
</span>
</div>";
// Start Table
$abgabenString .= '
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
<thead>
<tr style="background-color: #f8f9fa; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Datum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 45%;">Abgabe/Bezeichnung</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 35%;">Status</th>
</tr>
</thead>
<tbody>';
$printed = []; // lazy hack to avoid duplicate rows
foreach ($issueAbgaben as $abgabe) {
// if we had this paabgabe already (erstbetreuer/zweitbetreuer fetch achieves duplicates
if(in_array($abgabe->paabgabe_id, $printed)) {
continue; // skip this forEach iteration
}
$printed[] = $abgabe->paabgabe_id;
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
// label and color
if ($abgabe->signatur === false) {
$sigLabel = "FEHLENDE SIGNATUR";
$sigBg = "#dc3545";
} elseif ($abgabe->signatur === 'error') {
$sigLabel = "PRÜFUNG FEHLGESCHLAGEN";
$sigBg = "#fd7e14";
} else {
$sigLabel = "DATEI NICHT GEFUNDEN";
$sigBg = "#6c757d";
}
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$abgabedatumFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>
</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; text-align: center;'>
<span style='color: #fff; background-color: {$sigBg}; padding: 3px 8px; border-radius: 3px; font-weight: bold; font-size: 11px;'>
{$sigLabel}
</span>
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
}
$abgabenString .= '</div>';
// only send the email if at least one project had an issue
if ($hasIssues) {
$assistenzRow = $tupelArr[0][1];
$anrede = $assistenzRow->anrede;
$anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : "";
$fullFormattedNameString = $assistenzRow->first;
$path = $this->_ci->config->item('URL_ASSISTENZ');
$url = CIS_ROOT . $path;
$body_fields = array(
'anrede' => $anrede,
'anredeFillString' => $anredeFillString,
'fullFormattedNameString' => $fullFormattedNameString,
'abgabenString' => $abgabenString,
'linkAbgabetool' => $url
);
$email = $assistenzRow->uid . "@" . DOMAIN;
sendSanchoMail(
'PAANoSigAssSM',
$body_fields,
$email,
$this->p->t('abgabetool', 'c4missingSignatureNotification')
);
$count++;
}
}
$this->_ci->logInfo($count . " Emails bezüglich fehlender Signaturen erfolgreich versandt");
$this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutMissingSignatureUploads');
}
/**
* helper function to check the signature status of uploaded files for zwischenabgabe & endupload
*/
private function checkAbgabeSignatur($abgabe, $student_uid) {
$paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN');
if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) {
return;
}
if (!defined('SIGNATUR_URL')) {
$abgabe->signatur = 'error';
return;
}
$path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$student_uid.'.pdf';
$signaturVorhanden = null; // if frontend receives null -> indicates no file found at path
if(file_exists($path)) {
// Check if the document is signed
$signList = SignatureLib::list($path);
if (is_array($signList) && count($signList) > 0)
{
// The document is signed
$signaturVorhanden = true;
}
elseif ($signList === null)
{
// frontend knows to handle it this way for signatures
$signaturVorhanden = 'error';
}
else
{
$signaturVorhanden = false;
}
$abgabe->signatur = $signaturVorhanden;
}
}
public function notifyAssistenzAboutChangedAbgaben() {
$this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben');
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
// get all new or changed termine in interval
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
$retval = getData($result);
if(count($retval) == 0) {
$this->_ci->logInfo("Keine Emails an Assistenzen über neue oder veränderte Termine versandt");
return;
}
// group changed/new abgaben for projektarbeiten
$projektarbeiten = [];
foreach($retval as $newOrChangedAbgabe) {
// Check if the current item has a 'projektarbeit_id' field.
// Replace 'projektarbeit_id' with the actual key name if it's different.
if (isset($newOrChangedAbgabe->projektarbeit_id)) {
$projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
// initialize it as an empty array.
if (!isset($projektarbeiten[$projektarbeitId])) {
$projektarbeiten[$projektarbeitId] = [];
}
// Add the current row to the array associated with its 'projektarbeit_id'.
$projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
}
}
// for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails
$assistenzMap = [];
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
$projektarbeitBetreuerMap = [];
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
$assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz);
forEach($assistenzResult->retval as $assistenzRow) {
if (!isset($assistenzMap[$assistenzRow->person_id])) {
$assistenzMap[$assistenzRow->person_id] = [];
}
// Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id.
$assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow];
}
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
forEach($betreuerResult->retval as $betreuerRow) {
if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) {
$projektarbeitBetreuerMap[$projektarbeit_id] = [];
}
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
$projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow;
}
}
$count = 0;
foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
$abgabenString = '<div style="font-family: Arial, sans-serif; color: #333;">';
foreach($tupelArr as $tupel) {
$projektarbeit_id = $tupel[0];
$assistenzRow = $tupel[1];
$betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? [];
$changedAbgaben = $projektarbeiten[$projektarbeit_id];
$relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($assistenzRow) {
if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $assistenzRow->uid) {
return $abgabetermin;
} else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $assistenzRow->uid) {
return $abgabetermin;
}
}));
if(count($relevantAbgaben) == 0) {
continue;
}
// Format the Student Name
$s = $relevantAbgaben[0];
$nameParts = [];
if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
$nameParts[] = $s->vorname;
$nameParts[] = $s->nachname;
if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
$studentFullName = implode(' ', $nameParts);
// Format the Supervisors string
$betreuerStrings = [];
foreach($betreuerArray as $b) {
$bNameParts = [];
if (!empty($b->titelpre)) $bNameParts[] = $b->titelpre;
$bNameParts[] = $b->vorname;
$bNameParts[] = $b->nachname;
if (!empty($b->titelpost)) $bNameParts[] = $b->titelpost;
$bFullName = implode(' ', $bNameParts);
$betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})";
}
$allBetreuerFormatted = implode(', ', $betreuerStrings);
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
// Project Header Section
$abgabenString .= "
<div style='margin-top: 25px; padding: 12px; background-color: #f8f9fa; border-left: 4px solid #007bff; border-bottom: 1px solid #eee;'>
<strong style='font-size: 16px; color: #0056b3;'>Projekt: {$projektarbeit_titel}</strong><br/>
<div style='margin-top: 5px; font-size: 14px;'>
<strong>Studierende/r:</strong> {$studentFullName}
</div>
<div style='margin-top: 3px; font-size: 14px;'>
<strong>Betreuer:</strong> {$allBetreuerFormatted}
</div>
<span style='color: #666; font-size: 12px;'>
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
</span>
</div>";
// Start Table
$abgabenString .= '
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
<thead>
<tr style="background-color: #eee; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
</tr>
</thead>
<tbody>';
foreach ($relevantAbgaben as $abgabe) {
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #777; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
}
$abgabenString .= '</div>';
// done with building the change list, now send it
$assistenzRow = $tupelArr[0][1];
$anrede = $assistenzRow->anrede;
$anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : "";
$fullFormattedNameString = $assistenzRow->first;
$path = $this->_ci->config->item('URL_ASSISTENZ');
$url = CIS_ROOT.$path;
$body_fields = array(
'anrede' => $anrede,
'anredeFillString' => $anredeFillString,
'fullFormattedNameString' => $fullFormattedNameString,
'abgabenString' => $abgabenString,
'linkAbgabetool' => $url
);
$email = $assistenzRow->uid."@".DOMAIN;
// send email with bundled info
sendSanchoMail(
'PAAChangesAssSM',
$body_fields,
$email,
$this->p->t('abgabetool', 'changedAbgabeterminev2')
);
$count++;
}
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
$this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutChangedAbgaben');
}
public function notifyBetreuerAboutChangedAbgaben() {
$this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben');
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER');
// get all new or changed termine in interval
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
$retval = getData($result);
if(!$retval) {
$this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
return;
}
// group changed/new abgaben for projektarbeiten
$projektarbeiten = [];
foreach($retval as $newOrChangedAbgabe) {
// Check if the current item has a 'projektarbeit_id' field.
// Replace 'projektarbeit_id' with the actual key name if it's different.
if (isset($newOrChangedAbgabe->projektarbeit_id)) {
$projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
// check if the updatevon field is NOT the same as the student the projektarbeit is assigned to
// since uploading a file to a paabgabe is also putting updateamum & updatevon
// we have our own "student has uploaded a file" emailjob anyways
if($newOrChangedAbgabe->student_uid === $newOrChangedAbgabe->updatevon) {
continue;
}
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
// initialize it as an empty array.
if (!isset($projektarbeiten[$projektarbeitId])) {
$projektarbeiten[$projektarbeitId] = [];
}
// Add the current row to the array associated with its 'projektarbeit_id'.
$projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
}
}
if(count($projektarbeiten) == 0) {
$this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
return;
}
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
$betreuerMap = [];
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
forEach($betreuerResult->retval as $betreuerRow) {
if (!isset($betreuerMap[$betreuerRow->person_id])) {
$betreuerMap[$betreuerRow->person_id] = [];
}
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
$betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow];
}
}
$count = 0;
// now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine
// $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel
forEach($betreuerMap as $betreuer_person_id => $tupelArr) {
// start the container
$abgabenString = '<div style="font-family: Arial, sans-serif; color: #333;">';
$result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id);
$data = getData($result)[0];
$anrede = $data->anrede;
$anredeFillString = $data->anrede == "Herr" ? "r" : "";
$fullFormattedNameString = $data->first;
$relevantCounter = 0; // workaround to check if a betreuer needs to have any notification about relevant
// abgaben at all to avoid sending empty emails since we filter on certain conditions
forEach($tupelArr as $tupel) {
$projektarbeit_id = $tupel[0];
$betreuerRow = $tupel[1];
$changedAbgaben = $projektarbeiten[$projektarbeit_id];
$relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) {
if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) {
return $abgabetermin;
} else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) {
return $abgabetermin;
}
}));
if(count($relevantAbgaben) == 0) {
continue;
}
$relevantCounter++;
// format the Student Name
$s = $relevantAbgaben[0];
$nameParts = [];
if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
$nameParts[] = $s->vorname;
$nameParts[] = $s->nachname;
if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
$studentFullName = implode(' ', $nameParts);
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
// project header section
$abgabenString .= "
<div style='margin-top: 25px; padding: 12px; background-color: #f8f9fa; border-left: 4px solid #007bff; border-bottom: 1px solid #eee;'>
<strong style='font-size: 16px; color: #0056b3;'>Projekt: {$projektarbeit_titel}</strong><br/>
<div style='margin-top: 5px; font-size: 14px;'>
<strong>Studierende/r:</strong> {$studentFullName}
</div>
<span style='color: #666; font-size: 12px;'>
ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} |
Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
</span>
</div>";
// start table
$abgabenString .= '
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
<thead>
<tr style="background-color: #eee; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
</tr>
</thead>
<tbody>';
foreach ($relevantAbgaben as $abgabe) {
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #777; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
}
// close container
$abgabenString .= '</div>';
// done with building the change list, now send it
$betreuerRow = $tupelArr[0][1];
if($relevantCounter == 0) {
$this->_ci->logInfo('No Relevant Abgaben to notify Betreuer PersonID: "'.$betreuerRow->person_id.'".');
continue;
}
$path = $this->_ci->config->item('URL_MITARBEITER');
$url = CIS_ROOT.$path;
$body_fields = array(
'anrede' => $anrede,
'anredeFillString' => $anredeFillString,
'fullFormattedNameString' => $fullFormattedNameString,
'abgabenString' => $abgabenString,
'linkAbgabetool' => $url
);
$email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email;
if(!$email) {
$this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".');
continue;
}
// send email with bundled info
sendSanchoMail(
'PAAChangesBetSM',
$body_fields,
$email,
$this->p->t('abgabetool', 'changedAbgabeterminev2')
);
$count++;
}
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
$this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben');
}
public function notifyBetreuerMail() {
// send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer
// this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still
// send an email directly after happening since they are kind of important
$this->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail');
// dont filter for relevant types since this mail should gather all UPLOAD info
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval);
$retval = getData($result);
// retval are paabgaben joined with projektarbeit and betreuer
if(count($retval) == 0) {
$this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt");
return;
}
// group contents per betreuer person_id
$betreuer_uids = [];
forEach($retval as $paabgabe) {
if(!isset($betreuer_uids[$paabgabe->person_id])) {
$betreuer_uids[$paabgabe->person_id] = [];
}
$betreuer_uids[$paabgabe->person_id][] = $paabgabe;
}
$count = 0;
forEach ($betreuer_uids as $person_id => $abgaben) {
// $person_id is from betreuer
$result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id);
$data = getData($result)[0];
$anrede = $data->anrede;
$anredeFillString = $data->anrede == "Herr" ? "r" : "";
$fullFormattedNameString = $data->first;
// sorting $abgaben array by datum
usort($abgaben, function ($a, $b) {
return strtotime($a->datum) <=> strtotime($b->datum);
});
$projektarbeit_titel = $abgaben[0]->titel;
// initialize the table and headers
$abgabenString = '
<table style="width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; color: #333; margin-top: 15px; margin-bottom: 15px;">
<thead>
<tr style="background-color: #f2f2f2; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 15%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 25%;">Studierende/r</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 15%;">Abgabedatum</th>
</tr>
</thead>
<tbody>';
foreach ($abgaben as $abgabe) {
// format the student name
$nameParts = [];
if (!empty($abgabe->titelpre)) $nameParts[] = $abgabe->titelpre;
$nameParts[] = $abgabe->vorname;
$nameParts[] = $abgabe->nachname;
if (!empty($abgabe->titelpost)) $nameParts[] = $abgabe->titelpost;
$studentFullName = implode(' ', $nameParts);
// format dates inline
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
$abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
// handle the optional Kurzbezeichnung
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #666; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$studentFullName}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$abgabedatumFormatted}</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
$path = $this->_ci->config->item('URL_MITARBEITER');
$url = CIS_ROOT.$path;
$body_fields = array(
'anrede' => $anrede,
'anredeFillString' => $anredeFillString,
'fullFormattedNameString' => $fullFormattedNameString,
'paTitel' => $projektarbeit_titel,
'abgabenString' => $abgabenString,
'linkAbgabetool' => $url
);
$result = $this->_ci->ProjektbetreuerModel->getBetreuerOfProjektarbeit($abgaben[0]->projektarbeit_id, $abgaben[0]->betreuerart_kurzbz);
$data = getData($result)[0];
$email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email;
// in rare cases there are betreuer (often zweitbetreuer) without uid and without private email
if(!$email) {
$this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".');
continue;
}
// send email with bundled info
sendSanchoMail(
'PaabgabeUpdatesBetSM',
$body_fields,
$email,
$this->p->t('abgabetool', 'changedAbgabeterminev2')
);
$count++;
}
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
$this->_ci->logInfo('End job FHC-Core->notifyBetreuerMail');
}
public function notifyStudentMail()
{
// send all new projektarbeit abgabe since the last job run to the related student
$this->_ci->logInfo('Start job FHC-Core->notifyStudentMail');
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT');
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
$retval = getData($result);
if(count($retval) == 0) {
$this->_ci->logInfo("Keine Emails an Studenten versandt");
return;
}
// group results per projektarbeit/student_uid
$student_uids = [];
forEach($retval as $paabgabe) {
if(!isset($student_uids[$paabgabe->student_uid])) {
$student_uids[$paabgabe->student_uid] = [];
}
$student_uids[$paabgabe->student_uid][] = $paabgabe;
}
$count = 0;
foreach ($student_uids as $uid => $abgaben) {
// $uid is the student's UID
$result = $this->_ci->StudentModel->getEmailAnredeForStudentUID($uid);
$data = getData($result)[0];
// $abgabe is the array of paabgabe objects
$anredeFillString = $data->anrede=="Herr"?"r":"";
$fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost);
// https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op
// php has spaceships 🚀🚀🚀🚀🚀
usort($abgaben, function($a, $b) {
return strtotime($a->datum) <=> strtotime($b->datum);
});
$projektarbeit_titel = $abgaben[0]->titel;
// initialize the table and headers
$abgabenString = '
<table style="width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; color: #333; margin-top: 15px; margin-bottom: 15px;">
<thead>
<tr style="background-color: #f2f2f2; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 25%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung / Hinweis</th>
</tr>
</thead>
<tbody>';
foreach ($abgaben as $abgabe) {
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
// handle the optional Kurzbezeichnung
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #666; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>
{$dateEmailFormatted}
</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
$route = $this->_ci->config->item('URL_STUDENTS');
$url = CIS_ROOT.$route;
$body_fields = array(
'anrede' => $data->anrede,
'anredeFillString' => $anredeFillString,
'fullFormattedNameString' => $fullFormattedNameString,
'paTitel' => $projektarbeit_titel,
'abgabenString' => $abgabenString,
'linkAbgabetool' => $url
);
// send email with bundled info
sendSanchoMail(
'PaabgabeUpdatesSammelmail',
$body_fields,
$uid.'@'.DOMAIN,
$this->p->t('abgabetool', 'changedAbgabeterminev2')
);
$count++;
}
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
$this->_ci->logInfo('End job FHC-Core->notifyStudentMail');
}
}
+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
)
);
}
}
/**
+1 -1
View File
@@ -35,7 +35,7 @@ class CI3_Events
});
self::$eventsSorted[$event] = true;
}
foreach (self::$events[$event] as $conf) {
$conf[1](...$args);
}
+28 -1
View File
@@ -266,7 +266,7 @@ class FHCAPI_Controller extends Auth_Controller
}
// ---------------------------------------------------------------
// Security
// Security Begin
// ---------------------------------------------------------------
/**
@@ -287,4 +287,31 @@ class FHCAPI_Controller extends Auth_Controller
'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
], self::ERROR_TYPE_AUTH);
}
// ---------------------------------------------------------------
// Security End
// ---------------------------------------------------------------
/**
* Checks the client's total request size (Content-Length) against the minimum
* effective PHP limit (min of upload_max_filesize, post_max_size, memory_limit).
* This preempts failures that result in vague "missing parameters" errors on large files.
*
* @return void
*/
protected function checkUploadSize() {
// this number represents bytes
$content_length_bytes = (int)$this->input->server('CONTENT_LENGTH');
$content_length = $content_length_bytes / 1000000;
//get max serverside size upload -> this comes in megabytes
$max_upload = (int)(ini_get('upload_max_filesize'));
$max_post = (int)(ini_get('post_max_size'));
$memory_limit = (int)(ini_get('memory_limit'));
$max_upload_mb = min($max_upload, $max_post, $memory_limit); // smallest of 3 config values
if($content_length >= $max_upload_mb) {
$this->terminateWithError($this->p->t('global', 'filesizeExceeded'), 'general');
}
}
}
+46 -61
View File
@@ -8,7 +8,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
{
const DEFAULT_PERMISSION_R = 'admin:r';
const DEFAULT_PERMISSION_RW = 'admin:rw';
//public function __construct($zuordnung = 'person/Notizzuordnung_model')
public function __construct($permissions)
{
$default_permissions = [
@@ -97,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
$this->terminateWithSuccess(getData($result) ?: []);
}
//Override function
protected function isBerechtigt($id, $typeId){
return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
$this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
}
public function loadNotiz()
@@ -112,7 +112,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$notiz_id = $this->input->post('notiz_id');
//$this->load->model('person/Notiz_model', 'NotizModel');
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT');
$this->NotizModel->addSelect('*');
$this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum
@@ -143,14 +142,9 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$uid = getAuthUID();
if (isset($_POST['data']))
{
$data = json_decode($_POST['data']);
unset($_POST['data']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$this->form_validation->set_data($post_data);
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -166,26 +160,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$titel = $this->input->post('titel');
$text = $this->input->post('text');
$erledigt = $this->input->post('erledigt');
$verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
$bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : null;
$type = $this->input->post('typeId');
$start = $this->input->post('start');
$ende = $this->input->post('ende');
$titel = $post_data['titel'];
$text = $post_data['text'];
$erledigt = $post_data['erledigt'];
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : null;
$type = $post_data['typeId'];
$start = isset($post_data['start']) ? $post_data['start'] : null;
$ende = isset($post_data['ende']) ? $post_data['ende'] : null;
// Start DB transaction
$this->db->trans_start();
//Save note
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid,
"insertvon" => $verfasser_uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid,
"insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
if (isError($result))
{
$this->db->trans_rollback();
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$notiz_id = $result->retval;
@@ -220,7 +213,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$dms_id_arr[] = $result->retval['dms_id'];
}
@@ -235,34 +228,28 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
}
}
$this->db->trans_commit();
return $this->terminateWithSuccess($result);
$this->terminateWithSuccess($result);
}
public function updateNotiz()
{
$this->load->library('form_validation');
$this->load->library('DmsLib');
if (isset($_POST['data']))
{
$data = json_decode($_POST['data']);
unset($_POST['data']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$notiz_id = $this->input->post('notiz_id');
$this->form_validation->set_data($post_data);
if(!$notiz_id)
{
$this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
$this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id'])
]);
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -280,25 +267,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller
//update Notiz
$uid = getAuthUID();
$titel = $this->input->post('titel');
$text = $this->input->post('text');
$verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
$bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : $uid;
$erledigt = $this->input->post('erledigt');
$start = $this->input->post('start');
$ende = $this->input->post('ende');
$titel = $post_data['titel'];
$text = $post_data['text'];
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid'];
$erledigt = $post_data['erledigt'];
$start = $post_data['start'];
$ende = $post_data['ende'];
$result = $this->NotizModel->update(
[
'notiz_id' => $notiz_id
'notiz_id' => $post_data['notiz_id'],
],
[
'titel' => $titel,
'updatevon' => $uid,
'updateamum' => date('c'),
'text' => $text,
'verfasser_uid' => $verfasser_uid,
'bearbeiter_uid' => $bearbeiter_uid,
'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid,
'start' => $start,
'ende' => $ende,
'erledigt' => $erledigt
@@ -306,7 +291,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
//update(1) loading all dms-entries with this notiz_id
@@ -314,7 +299,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->load->model('person/Notizdokument_model', 'NotizdokumentModel');
$this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id');
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id));
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $post_data['notiz_id']));
$result = $this->getDataOrTerminateWithError($result);
foreach ($result as $doc) {
$dms_id_arr[$doc->dms_id] = array(
@@ -351,7 +336,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$result = $this->getDataOrTerminateWithError($result);
$dms_id = $result['dms_id'];
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id));
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id));
$this->getDataOrTerminateWithError($result);
}
@@ -365,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->getDataOrTerminateWithError($result);
}
return $this->terminateWithSuccess($result);
$this->terminateWithSuccess($result);
}
public function deleteNotiz()
@@ -416,15 +401,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
$this->db->trans_complete();
return $this->terminateWithSuccess(getData($result));
$this->terminateWithSuccess(getData($result));
}
public function loadDokumente()
@@ -440,14 +425,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
array('public.tbl_notiz.notiz_id' => $notiz_id)
);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result));
$this->terminateWithSuccess(getData($result));
}
public function getMitarbeiter($searchString)
@@ -457,7 +442,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess($result);
$this->terminateWithSuccess($result);
}
public function getCountNotes($person_id)
@@ -476,4 +461,4 @@ abstract class Notiz_Controller extends FHCAPI_Controller
return $this->terminateWithSuccess($anzahl->anzahl ?: 0);
}
}
}
+3 -18
View File
@@ -91,7 +91,7 @@ function var_dump_to_error_log($parameter)
var_dump($parameter); // KEEP IT!!!
$ob_get_contents = ob_get_contents();
ob_end_clean();
error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!!
error_log(str_replace("\n", '', $ob_get_contents) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!!
}
/**
@@ -408,22 +408,6 @@ function findResource($path, $resource, $subdir = false, $extraDir = null)
return null;
}
/**
* check if String can be converted to a date
*/
function isValidDate($dateString)
{
try
{
return (new DateTime($dateString)) !== false;
}
catch(Exception $e)
{
return false;
}
}
// ------------------------------------------------------------------------
// PHP functions that don't exist in older versions
// ------------------------------------------------------------------------
@@ -446,7 +430,8 @@ if (!function_exists('array_is_list')) {
// ------------------------------------------------------------------------
/**
* check if string can be converted to a date
* Check if the provided parameter is a string containing a valid date
* NOTE: the name is in the "snake case" format because othewise the CI form validation _cannot_ use it
*/
function is_valid_date($dateString)
{
+215 -3
View File
@@ -185,7 +185,15 @@ function generateJSModulesInclude($JSModules)
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
{
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
if($ci->config->item('use_fhcomplete_build_version_in_path'))
{
$relurl = preg_replace('#public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $tmpJSs[$tmpJSsCounter]);
$toPrint = sprintf($jsInclude, base_url($relurl)).PHP_EOL;
}
else
{
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
}
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
@@ -250,6 +258,210 @@ function generateSkipLink($skipID)
function absoluteJsImportUrl($relurl)
{
$ci =& get_instance();
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
$ci->load->config('javascript');
if($ci->config->item('use_fhcomplete_build_version_in_path'))
{
$url = base_url(preg_replace('#^public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $relurl));
}
else
{
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
}
return $url;
}
}
/*
* Manipulate CI views includes Array to load
* - public/js/FhcApps.js via customJSs and
* - app customisation js and/or css from extensions via customJSModules
* if customJSModules contains at least one vuejs app and customisation files
* exist in extensions
*/
class ExtendableAppsHelper
{
private static $instance = null;
protected $extensions;
protected $customCSSs;
protected $customJSs;
protected $customJSModules;
protected $initialised;
protected $appscount;
protected $extCustomCSSs;
protected $extCustomJSs;
protected $extCustomJSModules;
private function __construct()
{
$this->extensions = array();
$this->customCSSs = null;
$this->customJSs = null;
$this->customJSModules = null;
$this->initialised = false;
$this->appscount = 0;
$this->extCustomCSSs = null;
$this->extCustomJSs = null;
$this->extCustomJSModules = null;
}
public static function getInstance()
{
if(self::$instance === null)
{
self::$instance = new ExtendableAppsHelper();
}
return self::$instance;
}
public function init($customCSSs, $customJSs, $customJSModules)
{
if($this->initialised)
{
return;
}
$this->customCSSs = $customCSSs;
$this->customJSs = $customJSs;
$this->customJSModules = $customJSModules;
$this->initialised = true;
if(!isset($this->customJSModules))
{
return;
}
if(!is_array($this->customJSModules))
{
$this->customJSModules = array($this->customJSModules);
}
if(count($this->customJSModules) < 1)
{
return;
}
$this->buildExtensionsList();
$this->prepareExtendedArrays();
}
public function getCustomCSSs()
{
if(is_null($this->extCustomCSSs))
{
return $this->customCSSs;
}
return $this->extCustomCSSs;
}
public function getCustomJSs()
{
if(is_null($this->extCustomJSs))
{
return $this->customJSs;
}
return $this->extCustomJSs;
}
public function getCustomJSModules()
{
if(is_null($this->extCustomJSModules))
{
return $this->customJSModules;
}
return $this->extCustomJSModules;
}
protected function buildExtensionsList()
{
$this->extensions = array();
$fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
foreach ($fsiterator as $fsitem)
{
if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
{
$this->extensions[] = $fsitem->getBasename();
}
}
}
protected function prepareExtendedArrays()
{
$this->appscount = 0;
$this->initExtCustomCSSs();
$this->extCustomJSModules = array();
foreach($this->customJSModules as $item)
{
$matches = array();
if(preg_match('#^public/(extensions/FHC-Core-.+)?js/apps/(.*)\.js$#', $item, $matches))
{
$this->appscount++;
$fhcextension = $matches[1];
$app = $matches[2];
$extend_js_suffix = 'js/extend_app/' . $fhcextension . $app . '.js';
$extend_css_suffix = 'css/extend_app/' . $fhcextension . $app . '.css';
foreach($this->extensions as $extension)
{
$extend_js = 'public/extensions/' . $extension . '/' . $extend_js_suffix;
$extend_css = 'public/extensions/' . $extension . '/' . $extend_css_suffix;
if(is_readable(FHCPATH . $extend_js))
{
array_push($this->extCustomJSModules, $extend_js);
}
if(is_readable(FHCPATH . $extend_css))
{
array_push($this->extCustomCSSs, $extend_css);
}
}
}
array_push($this->extCustomJSModules, $item);
}
if($this->appscount > 0)
{
$this->addFhcAppsJs();
}
}
protected function initExtCustomCSSs()
{
if(!isset($this->customCSSs))
{
$this->extCustomCSSs = array();
}
elseif(!is_array($this->customCSSs))
{
$this->extCustomCSSs = array($this->customCSSs);
}
else
{
$this->extCustomCSSs = $this->customCSSs;
}
}
protected function addFhcAppsJs()
{
if(!isset($this->customJSs))
{
$this->extCustomJSs = array();
}
elseif(!is_array($this->customJSs))
{
$this->extCustomJSs = array($this->customJSs);
}
else
{
$this->extCustomJSs = $this->customJSs;
}
array_push($this->extCustomJSs, 'public/js/FhcApps.js');
}
}
+2 -1
View File
@@ -180,7 +180,8 @@ class DocsboxLib
}
// Just started or still working on it
elseif ($getStatusResponse->body->status == self::STATUS_WORKING
|| $getStatusResponse->body->status == self::STATUS_STARTED)
|| $getStatusResponse->body->status == self::STATUS_STARTED
|| $getStatusResponse->body->status == self::STATUS_QUEUED)
{
// go on!
}
+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']))
+237 -6
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,
@@ -641,7 +723,7 @@ class PrestudentLib
// Generate Alias
$alias = '';
$alias = null;
if (!defined('GENERATE_ALIAS_STUDENT')
|| GENERATE_ALIAS_STUDENT === true
) {
@@ -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);
@@ -490,6 +490,175 @@ class Vertrag_model extends DB_Model
return $bezeichnung;
}
/**
* Loads all Contracts of a Person
* @param $person_id
* @return array of objects
*/
public function loadContractsOfPerson($person_id)
{
$query = "
SELECT
*,
tbl_vertrag.bezeichnung as bezeichnung,
tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung,
tbl_vertrag.vertragsdatum,
(SELECT bezeichnung FROM lehre.tbl_vertragsstatus
JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz)
WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung,
CASE
WHEN EXISTS (
SELECT 1
FROM lehre.tbl_vertrag_vertragsstatus
WHERE vertrag_id = tbl_vertrag.vertrag_id
AND vertragsstatus_kurzbz = 'abgerechnet'
) THEN true
ELSE false
END AS isAbgerechnet
FROM
lehre.tbl_vertrag
LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz)
WHERE person_id= ?";
return $this->execQuery($query, array($person_id));
}
/**
* Loads all Contracts of a Person that are not assigned yet
* @param $person_id
* @return array of objects
*/
public function loadContractsOfPersonNotAssigned($person_id)
{
$query = "
SELECT
'Lehrauftrag' as type,
lehreinheit_id,
mitarbeiter_uid,
null as pruefung_id,
null as projektarbeit_id,
(tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1,
tbl_lehreinheit.studiensemester_kurzbz,
null as betreuerart_kurzbz,
( SELECT
upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
FROM
lehre.tbl_lehrveranstaltung
JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
as bezeichnung
FROM
lehre.tbl_lehreinheitmitarbeiter
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
WHERE
mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
AND vertrag_id IS NULL
UNION
SELECT
'Betreuung' as type,
tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
null as mitarbeiter_uid,
null::integer as pruefung_id,
projektarbeit_id,
(tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
tbl_lehreinheit.studiensemester_kurzbz,
tbl_projektbetreuer.betreuerart_kurzbz,
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
as bezeichnung
FROM
lehre.tbl_projektbetreuer
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
WHERE
tbl_projektbetreuer.person_id=?
AND vertrag_id IS NULL
";
return $this->execQuery($query, array($person_id, $person_id));
}
/**
* Loads all Contracts of a Person that are assigned yet
* @param $person_id, $vertrag_id
* @return array of objects
*/
public function loadContractsOfPersonAssigned($person_id, $vertrag_id)
{
$query = "
SELECT
'Lehrauftrag' as type,
lehreinheit_id,
mitarbeiter_uid,
null as pruefung_id,
null as projektarbeit_id,
(tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag,
tbl_lehreinheit.studiensemester_kurzbz,
null as betreuerart_kurzbz,
( SELECT
upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
FROM
lehre.tbl_lehrveranstaltung
JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
as bezeichnung, vertrag_id
FROM
lehre.tbl_lehreinheitmitarbeiter
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
WHERE
mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
AND vertrag_id = ?
UNION
SELECT
'Betreuung' as type,
tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
null as mitarbeiter_uid,
null::integer as pruefung_id,
projektarbeit_id,
(tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
tbl_lehreinheit.studiensemester_kurzbz,
tbl_projektbetreuer.betreuerart_kurzbz,
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
as bezeichnung, vertrag_id
FROM
lehre.tbl_projektbetreuer
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
WHERE
tbl_projektbetreuer.person_id=?
AND vertrag_id = ?
";
return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id));
}
/**
* Returns all stati of a contract
*
* @param $vertrag_id
* @return array
*/
public function getStatiOfContract($vertrag_id)
{
$query = "
SELECT
*,
tbl_vertrag_vertragsstatus.datum,
tbl_vertrag_vertragsstatus.insertamum,
tbl_vertrag_vertragsstatus.updateamum
FROM
lehre.tbl_vertrag_vertragsstatus
JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
WHERE
tbl_vertrag_vertragsstatus.vertrag_id = ?
ORDER BY tbl_vertrag_vertragsstatus.datum DESC";
return $this->execQuery($query, array($vertrag_id));
}
private function _updateVertragRelevant($vertrag_id)
{
$this->LehreinheitmitarbeiterModel->update(
@@ -11,4 +11,5 @@ class Vertragstyp_model extends DB_Model
$this->dbTable = 'lehre.tbl_vertragstyp';
$this->pk = 'vertragstyp_kurzbz';
}
}
@@ -190,4 +190,6 @@ class Vertragvertragsstatus_model extends DB_Model
return $this->loadWhere($condition);
}
}
@@ -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);
+53 -15
View File
@@ -10,7 +10,7 @@ class Reihungstest_model extends DB_Model
parent::__construct();
$this->dbTable = 'public.tbl_reihungstest';
$this->pk = 'reihungstest_id';
}
}
/**
* Gets a test from a test id only if it is available
@@ -42,8 +42,8 @@ class Reihungstest_model extends DB_Model
/**
* Checks if there are active studyplans which have no public placement tests assigned yet.
* Only check assignment to studyplans that are
* - Bachelor,
* - active,
* - Bachelor,
* - active,
* - set as online application
* - valid for 1st terms
* @return array Returns object array with studyplans that have no public placement tests assigned yet.
@@ -97,7 +97,7 @@ class Reihungstest_model extends DB_Model
USING (reihungstest_id)
WHERE
datum >= now()
AND
AND
oeffentlich = \'t\'
)
';
@@ -105,7 +105,7 @@ class Reihungstest_model extends DB_Model
return $this->execQuery($query);
}
/**
/**
* Gets amount of free places.
* @return array Returns object array with faculty and amount of free places
* for each public actual placement test date.
@@ -432,10 +432,10 @@ class Reihungstest_model extends DB_Model
}
/**
* Loads all applicants of a placement test
* @param integer $reihungstest_id ID of placement test
* @return array Returns object array with data of applicants.
*/
* Loads all applicants of a placement test
* @param integer $reihungstest_id ID of placement test
* @return array Returns object array with data of applicants.
*/
public function getApplicantsOfPlacementTest($reihungstest_id)
{
$query = '
@@ -556,13 +556,22 @@ class Reihungstest_model extends DB_Model
* Calculates Result of Placement Test for a given Person and given placementtest
* and with taking account of weighting per area
*
* @param $person_id ID of Person
* @param $punkte if true result is points else result is percentage of sum
* @param $reihungstest_id ID of Placementtest
* @param $weightedArray array of weighting per area (gewicht per gebiet_id)
* @return float result
* @param Number $person_id ID of Person
* @param Boolean $punkte if true result is points else result is percentage of sum
* @param Number $reihungstest_id ID of Placementtest
* @param Array $weightedArray array of weighting per area (gewicht per gebiet_id)
* @param Boolean $has_excluded_gebiete if true, areas in the configArray will be excluded
* @param Array $basis_gebiet_id_toString areas to exclude
* @return float result points of RT
*/
public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null)
public function getReihungstestErgebnisPerson(
$person_id,
$punkte,
$reihungstest_id,
$weightedArray = null,
$has_excluded_gebiete = false,
$basis_gebiet_id_toString = null
)
{
$parametersArray = array($reihungstest_id);
@@ -577,6 +586,35 @@ class Reihungstest_model extends DB_Model
WHERE
reihungstest_id = ? ";
//areas of Studiengang
if (!empty($basis_gebiet_id_toString))
{
$qry .= "
AND
gebiet_id IN (". $basis_gebiet_id_toString. ")
";
}
//areas to exclude
if($has_excluded_gebiete)
{
if (defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE))
{
$excluded_gebiete = unserialize(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE);
$exclude_gebiet_id_arr = $excluded_gebiete;
if (is_array($exclude_gebiet_id_arr) && count($exclude_gebiet_id_arr) > 0)
{
$exclude_gebiet_id_toString = implode(', ', $exclude_gebiet_id_arr);
$qry .= "
AND
gebiet_id NOT IN (". $exclude_gebiet_id_toString. ")
-- AND
-- typ = 'b'
";
}
}
}
//using prestudent Status to avoid to get the sum of more than 1 placement tests
$qry .= "
AND prestudent_id = (
+10 -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;
}
@@ -279,4 +279,12 @@ class Student_model extends DB_Model
{
return $student_uid . '@' . DOMAIN;
}
public function getEmailAnredeForStudentUID($student_uid) {
$qry = "SELECT anrede, titelpre, vorname, vornamen, nachname, titelpost
FROM campus.vw_student
WHERE uid = ?";
return $this->execReadOnlyQuery($qry, array($student_uid));
}
}
@@ -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
@@ -11,4 +11,12 @@ class Note_model extends DB_Model
$this->dbTable = 'lehre.tbl_note';
$this->pk = 'note';
}
public function getAllActive() {
$qry ="SELECT *
FROM lehre.tbl_note
WHERE aktiv = true";
return $this->execReadOnlyQuery($qry);
}
}
@@ -60,5 +60,69 @@ class Paabgabe_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($person_id));
}
public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes)
{
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum,
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
FROM campus.tbl_paabgabe
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
JOIN public.tbl_person USING (person_id)
WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ?
OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?)
AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
}
public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes = null) {
$queryParams = [$interval];
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum,
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id,
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
FROM campus.tbl_paabgabe
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?";
if($relevantTypes !== null) {
$query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
$queryParams[]= $relevantTypes;
}
$query .= " ORDER BY abgabedatum DESC";
return $this->execQuery($query, $queryParams);
}
public function loadByIDs($paabgabe_ids) {
$qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?";
return $this->execReadOnlyQuery($qry, [$paabgabe_ids]);
}
}
@@ -11,4 +11,10 @@ class Paabgabetyp_model extends DB_Model
$this->dbTable = 'campus.tbl_paabgabetyp';
$this->pk = 'paabgabetyp_kurzbz';
}
public function getAll() {
$qry = "SELECT * FROM campus.tbl_paabgabetyp ORDER BY bezeichnung";
return $this->execReadOnlyQuery($qry);
}
}
@@ -24,17 +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
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
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.student_uid = ?";
pa.student_uid = ?";
$params = array($student_uid);
@@ -53,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;
}
@@ -98,36 +109,36 @@ class Projektarbeit_model extends DB_Model
*/
public function getStudentProjektarbeitenWithBetreuer($studentUID)
{
$betreuerQuery = "
SELECT
$betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
vorname as bvorname,
nachname as bnachname,
titelpre as btitelpre,
titelpost AS btitelpost,
titelpost AS btitelpost,
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
(SELECT person_id
FROM lehre.tbl_projektbetreuer
(SELECT person_id
FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
(SELECT betreuerart_kurzbz
FROM lehre.tbl_projektbetreuer
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
(SELECT betreuerart_kurzbz
FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
(SELECT tbl_betreuerart.beschreibung
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
(SELECT tbl_betreuerart.beschreibung
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
tbl_betreuerart.betreuerart_kurzbz,
person_id as bperson_id,
projektarbeit_id,
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz,
lehre.tbl_lehreinheit.studiensemester_kurzbz,
lehre.tbl_lehrveranstaltung.studiengang_kz,
public.tbl_studiengang.kurzbzlang,
lehre.tbl_projektbetreuer.note as note,
lehre.tbl_projektarbeit.note as note,
lehre.tbl_note.bezeichnung as note_bezeichnung,
public.tbl_mitarbeiter.mitarbeiter_uid,
lehre.tbl_projektarbeit.titel as titel,
lehre.tbl_projektarbeit.sprache as sprache,
@@ -136,9 +147,8 @@ class Projektarbeit_model extends DB_Model
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
lehre.tbl_projektarbeit.abstract as abstract,
lehre.tbl_projektarbeit.abstract_en as abstract_en,
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt,
lehre.tbl_projektarbeit.abstract_en as abstract_en,
lehre.tbl_projektarbeit.insertamum as insertamum,
(SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben
FROM lehre.tbl_projektarbeit
@@ -147,15 +157,17 @@ class Projektarbeit_model extends DB_Model
LEFT JOIN public.tbl_benutzer USING(person_id)
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE
tbl_projektarbeit.student_uid = ? AND
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note)
WHERE
tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
ORDER BY insertamum DESC";
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
}
@@ -168,8 +180,12 @@ class Projektarbeit_model extends DB_Model
campus.tbl_paabgabe.fixtermin,
campus.tbl_paabgabe.kurzbz,
campus.tbl_paabgabe.datum,
campus.tbl_paabgabe.note,
campus.tbl_paabgabe.upload_allowed,
campus.tbl_paabgabe.beurteilungsnotiz,
campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
campus.tbl_paabgabetyp.bezeichnung,
campus.tbl_paabgabetyp.benotbar,
campus.tbl_paabgabe.abgabedatum,
campus.tbl_paabgabe.insertvon
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
@@ -179,16 +195,76 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
public function getProjektarbeitenAbgabetermine($projektarbeiten_ids) {
$qry ="SELECT campus.tbl_paabgabe.paabgabe_id,
campus.tbl_paabgabe.projektarbeit_id,
campus.tbl_paabgabe.fixtermin,
campus.tbl_paabgabe.kurzbz,
campus.tbl_paabgabe.datum,
campus.tbl_paabgabe.note,
campus.tbl_paabgabe.upload_allowed,
campus.tbl_paabgabe.beurteilungsnotiz,
campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
campus.tbl_paabgabetyp.bezeichnung,
campus.tbl_paabgabe.abgabedatum,
campus.tbl_paabgabe.insertvon
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
WHERE campus.tbl_paabgabe.projektarbeit_id IN ?
ORDER BY campus.tbl_paabgabe.datum";
return $this->execReadOnlyQuery($qry, array($projektarbeiten_ids));
}
public function getProjektbetreuerAnrede($bperson_id) {
$qry_betr="SELECT distinct trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first,
public.tbl_mitarbeiter.mitarbeiter_uid, anrede
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
JOIN public.tbl_benutzer ON(public.tbl_benutzer.person_id=public.tbl_person.person_id)
JOIN public.tbl_mitarbeiter ON(public.tbl_benutzer.uid=public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE public.tbl_person.person_id= ?";
$qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
WHERE public.tbl_person.person_id= ?";
return $this->execReadOnlyQuery($qry_betr, [$bperson_id]);
}
public function getProjektbetreuerEmail($projektarbeit_id) {
$qry = "SELECT (
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp = 'email'
AND person_id = pers.person_id
ORDER BY
CASE WHEN zustellung THEN 0 ELSE 1 END,
insertamum DESC NULLS LAST
LIMIT 1
) AS private_email, mitarbeiter_uid as uid
FROM lehre.tbl_projektarbeit pa
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
JOIN public.tbl_person pers USING (person_id)
LEFT JOIN public.tbl_benutzer ben USING (person_id)
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
WHERE (ben.aktiv OR ben.aktiv IS NULL)
AND projektarbeit_id = ?";
return $this->execReadOnlyQuery($qry, [$projektarbeit_id]);
}
public function getProjektbetreuerEmailByPersonID($person_id) {
$qry = "SELECT (
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp = 'email'
AND person_id = pers.person_id
ORDER BY
CASE WHEN zustellung THEN 0 ELSE 1 END,
insertamum DESC NULLS LAST
LIMIT 1
) AS private_email, mitarbeiter_uid as uid
FROM lehre.tbl_projektarbeit pa
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
JOIN public.tbl_person pers USING (person_id)
LEFT JOIN public.tbl_benutzer ben USING (person_id)
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
WHERE (ben.aktiv OR ben.aktiv IS NULL)
AND person_id = ?";
return $this->execReadOnlyQuery($qry, [$person_id]);
}
public function getProjektarbeitBenutzer($uid) {
@@ -223,9 +299,9 @@ class Projektarbeit_model extends DB_Model
*
FROM
(SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz,
tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id,
tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz
tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid
FROM lehre.tbl_projektarbeit
LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
@@ -262,7 +338,180 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) {
$new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name
FROM(
SELECT
DISTINCT ON(tbl_projektarbeit.projektarbeit_id)
tbl_projektarbeit.projekttyp_kurzbz,
tbl_projektarbeit.titel,
tbl_projektarbeit.projektarbeit_id,
tbl_studiengang.typ, tbl_studiengang.kurzbz,
student_benutzer.uid as student_uid,
student_person.vorname as student_vorname,
student_person.nachname as student_nachname,
tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
betreuer_benutzer.uid as betreuer_benutzer_uid,
betreuer_person.titelpre as betreuer_titelpre,
betreuer_person.vorname as betreuer_vorname,
betreuer_person.nachname as betreuer_nachname,
betreuer_person.titelpost as betreuer_titelpost,
lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
lehre.tbl_projektarbeit.sprache as sprache,
lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl,
lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter,
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
lehre.tbl_projektarbeit.abstract as abstract,
lehre.tbl_projektarbeit.abstract_en as abstract_en,
lehre.tbl_projektarbeit.insertamum as insertamum,
lehre.tbl_projektarbeit.note as note,
(
SELECT orgform_kurzbz
FROM tbl_prestudentstatus
WHERE prestudent_id = (SELECT prestudent_id
FROM tbl_student
WHERE student_uid = student_benutzer.uid
LIMIT 1)
ORDER BY datum DESC, insertamum DESC, ext_id DESC
LIMIT 1
)
as organisationsform,
(
SELECT person_id
FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
AS zweitbetreuer_person_id,
(
SELECT betreuerart_kurzbz
FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
AS zweitbetreuer_betreuerart_kurzbz,
(
SELECT tbl_betreuerart.beschreibung
FROM lehre.tbl_projektbetreuer
JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
AS zweitbetreuer_betreuerart_beschreibung,
(
SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' ||
COALESCE(titelpost, ''))
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_full_name,
(
SELECT titelpre
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_titelpre,
(
SELECT vorname
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_vorname,
(
SELECT nachname
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_nachname,
(
SELECT titelpost
FROM public.tbl_person
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
LIMIT 1
)
as zweitbetreuer_titelpost,
(
SELECT
COALESCE(tbl_studienplan.orgform_kurzbz,
tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as
orgform
FROM
public.tbl_prestudent
JOIN public.tbl_prestudentstatus USING(prestudent_id)
JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
JOIN public.tbl_studiengang USING(studiengang_kz)
LEFT JOIN lehre.tbl_studienplan USING(studienplan_id)
WHERE
prestudent_id=tbl_student.prestudent_id
ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1
) as orgform,
(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 studienstatus
FROM lehre.tbl_projektarbeit
LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid)
LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id)
LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid)
LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz)
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id)
LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id)
WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
AND student_benutzer.aktiv AND (
lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter'
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter'
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer'
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer'
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz'
)
AND public.tbl_studiengang.studiengang_kz = ?";
if($benotet == 0) {
$new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL ";
} else if ($benotet == 1) {
$new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL ";
}
$new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
) as tmp";
return $this->execReadOnlyQuery($new_qry, array($studiengang_kz));
}
/**
*
* @param
@@ -288,4 +537,17 @@ class Projektarbeit_model extends DB_Model
return false;
}
public function getProjektarbeitByPaabgabeID($paabgabe_id) {
$qry = "SELECT
projektarbeit_id
FROM
campus.tbl_paabgabe
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
WHERE
campus.tbl_paabgabe.paabgabe_id = ?;
";
return $this->execReadOnlyQuery($qry, [$paabgabe_id]);
}
}
@@ -232,4 +232,41 @@ class Projektbetreuer_model extends DB_Model
return $this->execQuery($qry, array($projektarbeit_id, $betreuer_person_id));
}
/**
* Gets all Betreuer of a Projektarbeit.
* Returns one row for each person.
* @param int $projektarbeit_id
* @return array success with number of Betreuer or error
*/
public function getAllBetreuerOfProjektarbeit($projektarbeit_id)
{
$qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname,
trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name,
anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz,
ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid,
(
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp = 'email'
AND person_id = pers.person_id
ORDER BY
CASE WHEN zustellung THEN 0 ELSE 1 END,
insertamum DESC NULLS LAST
LIMIT 1
) AS private_email
FROM lehre.tbl_projektarbeit pa
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
JOIN public.tbl_person pers USING (person_id)
LEFT JOIN public.tbl_benutzer ben USING (person_id)
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
WHERE (ben.aktiv OR ben.aktiv IS NULL)
AND projektarbeit_id = ?
ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/
CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/
ben.insertamum";
return $this->execQuery($qry, array($projektarbeit_id));
}
}
@@ -243,4 +243,20 @@ class Organisationseinheit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
}
public function getAssistenzForOE($oe_kurzbz) {
$qry = "
SELECT person_id, uid, benutzerfunktion_id, funktion_kurzbz, oe_kurzbz, alias,
anrede, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first
FROM tbl_benutzerfunktion
JOIN public.tbl_benutzer USING(uid)
JOIN public.tbl_person USING(person_id)
WHERE funktion_kurzbz = 'ass'
AND oe_kurzbz = ?
AND (datum_bis IS NULL OR NOW() <= datum_bis)
AND public.tbl_benutzer.aktiv = true
";
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
}
}
@@ -657,37 +657,7 @@ class Studiengang_model extends DB_Model
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('crm/Student_model', 'StudentModel');
$addEmailProperty= function(&$benutzerfunktionen){
if(count($benutzerfunktionen) && defined('DOMAIN'))
{
$benutzerfunktionen = array_map(function($benutzer)
{
$benutzer->email = $benutzer->alias."@".DOMAIN;
return $benutzer;
},$benutzerfunktionen) ;
}
};
$addFotoProperty= function(&$collection){
$collection = array_map(function($item){
$person_id = $this->PersonModel->getByUid($item->uid);
if(isError($person_id))
return error($person_id);
$person_id = current(getData($person_id))->person_id;
$this->PersonModel->addSelect('foto');
$foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
if(isError($foto))
return error($foto);
$foto = current(getData($foto))->foto;
$item->foto = $foto;
return $item;
},$collection);
};
$this->load->model('crm/Student_model', 'StudentModel');
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
if (isError($student))
return error($student);
@@ -712,7 +682,7 @@ class Studiengang_model extends DB_Model
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
return $stg_leitung->aktiv;
}));
$addFotoProperty($stg_ltg);
$this->addFotoProperty($stg_ltg);
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
if (isError($gf_ltg))
@@ -721,8 +691,8 @@ class Studiengang_model extends DB_Model
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
return $gf_leitung->aktiv;
}));
$addEmailProperty($gf_ltg);
$addFotoProperty($gf_ltg);
$this->addEmailProperty($gf_ltg);
$this->addFotoProperty($gf_ltg);
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
if (isError($stv_ltg))
@@ -731,8 +701,8 @@ class Studiengang_model extends DB_Model
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
return $stv_leitung->aktiv;
}));
$addEmailProperty($stv_ltg);
$addFotoProperty($stv_ltg);
$this->addEmailProperty($stv_ltg);
$this->addFotoProperty($stv_ltg);
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
@@ -741,8 +711,8 @@ class Studiengang_model extends DB_Model
$ass = array_values(array_filter($ass, function($assistenz){
return $assistenz->aktiv;
}));
$addEmailProperty($ass);
$addFotoProperty($ass);
$this->addEmailProperty($ass);
$this->addFotoProperty($ass);
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
if (isError($hochschulvertr))
@@ -751,7 +721,7 @@ class Studiengang_model extends DB_Model
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
return $hochschul_vertreter->aktiv;
}));
$addEmailProperty($hochschulvertr);
$this->addEmailProperty($hochschulvertr);
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
@@ -761,7 +731,7 @@ class Studiengang_model extends DB_Model
$stdv = array_values(array_filter($stdv, function($std_vertreter){
return $std_vertreter->aktiv;
}));
$addEmailProperty($stdv);
$this->addEmailProperty($stdv);
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
@@ -771,7 +741,7 @@ class Studiengang_model extends DB_Model
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
return $jahrgang_vertreter->aktiv;
}));
$addEmailProperty($jahrgangsvertr);
$this->addEmailProperty($jahrgangsvertr);
$result_object = new stdClass();
@@ -801,4 +771,141 @@ 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]);
}
public function getStudiengaengeFiltered($allowed_stg) {
$query ="SELECT DISTINCT
public.tbl_studiengang.studiengang_kz,
public.tbl_studiengang.bezeichnung,
public.tbl_studiengang.kurzbzlang,
public.tbl_studiengang.orgform_kurzbz
FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz)
JOIN lehre.tbl_studienplan USING(studienordnung_id)
JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
WHERE public.tbl_studiengang.aktiv = true
AND public.tbl_studiengang.studiengang_kz IN ?
ORDER BY public.tbl_studiengang.kurzbzlang";
return $this->execReadOnlyQuery($query, [$allowed_stg]);
}
public function getAssistenzForStudiengangKZ($stg_kz) {
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$stg_obj = $this->load($stg_kz);
if(isError($stg_obj))
return error($stg_obj);
if(getData($stg_obj))
{
$stg_obj = current(getData($stg_obj));
}
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
return $ass;
$ass = getData($ass) ?: [];
$ass = array_values(array_filter($ass, function($assistenz){
return $assistenz->aktiv;
}));
$this->addEmailProperty($ass);
return success($ass);
}
private function addEmailProperty(&$benutzerfunktionen) {
if(count($benutzerfunktionen) && defined('DOMAIN'))
{
$benutzerfunktionen = array_map(function($benutzer)
{
$benutzer->email = $benutzer->alias."@".DOMAIN;
return $benutzer;
},$benutzerfunktionen) ;
}
}
private function addFotoProperty (&$collection) {
$collection = array_map(function($item){
$person_id = $this->PersonModel->getByUid($item->uid);
if(isError($person_id))
return error($person_id);
$person_id = current(getData($person_id))->person_id;
$this->PersonModel->addSelect('foto');
$foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
if(isError($foto))
return error($foto);
$foto = current(getData($foto))->foto;
$item->foto = $foto;
return $item;
},$collection);
}
}
@@ -420,4 +420,17 @@ class Person_model extends DB_Model
return success($result);
}
}
public function loadAllStudentUIDSForPersonID($person_id) {
$qry = "SELECT
CONCAT(tp.vorname, ' ', tp.nachname) AS name,
ARRAY_AGG(DISTINCT b.uid ORDER BY b.uid) AS uids
FROM public.tbl_student s
JOIN public.tbl_benutzer b ON s.student_uid = b.uid
JOIN public.tbl_person tp ON b.person_id = tp.person_id
GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id
HAVING b.person_id = ? AND b.aktiv IS TRUE;";
return $this->execReadOnlyQuery($qry, [$person_id]);
}
}
@@ -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
@@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model
{
$qry = "
SELECT
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe, personalnummer, mitarbeiter_uid
FROM
public.tbl_person
JOIN public.tbl_benutzer b USING(person_id)
@@ -363,14 +363,14 @@ class Mitarbeiter_model extends DB_Model
$returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$qry = "
SELECT " . $returnwert . "
FROM
SELECT " . $returnwert . "
FROM
public.tbl_mitarbeiter ma
JOIN
JOIN
public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
JOIN
JOIN
public.tbl_person p on (p.person_id = b.person_id)
WHERE
WHERE
lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
@@ -393,14 +393,14 @@ class Mitarbeiter_model extends DB_Model
public function getMitarbeiterFromLV($lehrveranstaltung_id)
{
$qry = "SELECT DISTINCT
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
FROM
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
FROM
lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit
WHERE
WHERE
lehrveranstaltung_id= ?
AND
mitarbeiter_uid=uid
AND
AND
mitarbeiter_uid=uid
AND
tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
$parametersArray = array($lehrveranstaltung_id);
@@ -470,12 +470,12 @@ class Stundenplan_model extends DB_Model
}
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
{
$query .= "((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
$query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
// Eintraege fuer den ganzen Verband
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
// Eintraege fuer das ganze Semester
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)
." AND ".$this->escape($sem_date_range->ende).")". $stringGroupLv. ")";
." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)";
$query .="OR";
}
@@ -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]);
}
}
@@ -47,7 +47,6 @@ class Stundensatz_model extends DB_Model
{
$this->load->config('stv');
$useFixangestelltStundensatz = $this->config->item('tabs')['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'];
$defaultStundensatz = $this->config->item('tabs')['projektarbeit']['defaultProjektbetreuerStundensatz'];
$stundensatz = '';
@@ -63,7 +62,7 @@ class Stundensatz_model extends DB_Model
{
$studiensemester = getData($result)[0];
if (isset($useFixangestelltStundensatz) && !$useFixangestelltStundensatz)
if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ)
{
// load Mitarbeiter
$params = [$person_id];
@@ -83,19 +82,30 @@ class Stundensatz_model extends DB_Model
if (hasData($result))
{
foreach (getData($result) as $ma)
{
if (!$ma->fixangestellt)
{
$stundensatzRes = $this->getStundensatzByDatum(
$ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'
);
$ma = getData($result)[0];
if (hasData($stundensatzRes))
$stundensatz = getData($stundensatzRes)[0]->stundensatz;
else
$stundensatz = '0.00';
}
$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
+71 -54
View File
@@ -242,74 +242,91 @@ class Message_model extends DB_Model
*/
public function getMessagesForTable($person_id, $offset, $limit)
{
$sql_base = "
SELECT
$sql = <<<EOSQL
with filtered_messages as (
select
m.message_id, m.person_id as sender_id, mr.person_id as recipient_id
from
public.tbl_msg_message m
join
public.tbl_msg_recipient mr on mr.message_id = m.message_id
where
m.person_id = ?
group by
m.message_id, m.person_id, mr.person_id
union all
select
m.message_id, m.person_id as sender_id, mr.person_id as recipient_id
from
public.tbl_msg_message m
join
public.tbl_msg_recipient mr on mr.message_id = m.message_id
where
mr.person_id = ?
group by
m.message_id, m.person_id, mr.person_id
), lastmsgstatus as (
select
ms.*
from (
select
s.message_id, s.person_id, MAX(s.insertamum) as lastinserted
from
public.tbl_msg_status s
join
filtered_messages fm on fm.message_id = s.message_id and fm.recipient_id = s.person_id
group by
s.message_id, s.person_id
) ls
join
public.tbl_msg_status ms on ms.message_id = ls.message_id and ms.person_id = ls.person_id and ms.insertamum = ls.lastinserted
)
select
(select count(*) from filtered_messages) as total_msgs,
m.message_id AS message_id,
m.subject AS subject,
m.body AS body,
m.insertamum AS insertamum,
m.relationmessage_id AS relationmessage_id,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
m.person_id as sender_id,
r.person_id as recipient_id,
MAX(ss.status) as status,
MAX(ss.insertamum) as statusdatum
FROM public.tbl_msg_message m
JOIN public.tbl_msg_recipient r USING(message_id)
JOIN public.tbl_msg_status ss ON(r.message_id = ss.message_id AND ss.person_id = r.person_id)
WHERE m.person_id = ?
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
UNION ALL
SELECT
m.message_id AS message_id,
m.subject AS subject,
m.body AS body,
m.insertamum AS insertamum,
m.relationmessage_id AS relationmessage_id,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
m.person_id as sender_id,
r.person_id as recipient_id,
MAX(ss.status) as status,
MAX(ss.insertamum) as statusdatum
FROM public.tbl_msg_recipient r
JOIN public.tbl_msg_status ss USING(message_id, person_id)
JOIN public.tbl_msg_message m USING(message_id)
WHERE r.person_id = ?
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
";
$sql = "
SELECT COUNT(*) AS count FROM (
" . $sql_base . "
) a
";
$parametersArray = array($person_id, $person_id);
$count = $this->execQuery($sql, $parametersArray);
if (isError($count))
return $count;
$count = ceil(current(getData($count))->count/$limit);
$sql = "
SELECT * FROM (
" . $sql_base . "
) a
ORDER BY insertamum DESC
LIMIT ?
OFFSET ?
";
(COALESCE(ps.titelpre,'') || ' ' || COALESCE(ps.vorname,'') || ' ' || COALESCE(ps.nachname,'') || ' ' || COALESCE(ps.titelpost,'')) as sender,
(COALESCE(pr.titelpre,'') || ' ' || COALESCE(pr.vorname,'') || ' ' || COALESCE(pr.nachname,'') || ' ' || COALESCE(pr.titelpost,'')) as recipient,
fm.sender_id,
fm.recipient_id,
ms.status,
ms.insertamum as statusdatum
from
filtered_messages fm
join
public.tbl_msg_message m on fm.message_id = m.message_id
join
lastmsgstatus ms on fm.message_id = ms.message_id and fm.recipient_id = ms.person_id
left join
public.tbl_person ps on ps.person_id = fm.sender_id
left join
public.tbl_person pr on pr.person_id = fm.recipient_id
order by
m.insertamum DESC
limit ?
offset ?;
EOSQL;
$parametersArray = array($person_id, $person_id, $limit, $offset);
$count = 0;
$data = $this->execQuery($sql, $parametersArray);
if (isError($data))
return $data;
$data = getData($data);
if($data)
{
$count = ceil($data[0]->total_msgs / $limit);
}
return success(['data' => $data, 'count' => $count]);
}
@@ -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();
@@ -286,7 +286,13 @@ EOSQL;
foreach( $rows as $row ) {
$tmpgb = new Gehaltsbestandteil();
$tmpgb->hydrateByStdClass($row, true);
if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null
&& $row->valorisierungsdatum == $row->von) {
// neuer Gehaltsbestandteil mit Valorisierungsdatum aber auch valorisiert
$tmpgb->setGrundbetrag($row->betrag_valorisiert);
}
// prevent duplication (caused by the join with historic values)
if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) {
$gehaltsbestandteile[] = $tmpgb;
+47
View File
@@ -0,0 +1,47 @@
<?php
$includesArray = array(
'title' => 'Cis4',
'axios027' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'tabulator5' => true, // TODO: upgrade to 6 when available
'vue3' => true,
'primevue3' => true,
'skipID' => '#fhccontent',
'vuedatepicker11' => true,
'customCSSs' => array(
'public/css/components/verticalsplit.css',
'public/css/components/FilterComponent.css',
'public/css/components/FormUnderline.css',
'public/css/theme/default.css',
'public/css/components/abgabetool/abgabe.css'
),
'customJSs' => array(
'vendor/npm-asset/primevue/accordion/accordion.min.js',
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
'vendor/npm-asset/primevue/textarea/textarea.min.js',
'vendor/npm-asset/primevue/timeline/timeline.min.js',
'vendor/npm-asset/primevue/inplace/inplace.min.js',
'vendor/npm-asset/primevue/message/message.min.js',
'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
'vendor/moment/luxonjs/luxon.min.js'
),
'customJSModules' => array(
'public/js/apps/Abgabetool/Abgabetool.js',
),
);
$this->load->view('templates/FHC-Header', $includesArray);
?>
<div id="abgabetoolroot" class="h-100" style="max-width: 95%;" route=<?php echo json_encode($route) ?>
uid=<?php echo $uid ?>
student_uid_prop="<?php echo $student_uid_prop ?? '' ?>"
stg_kz_prop="<?php echo $stg_kz_prop ?? '' ?>"
>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
-15
View File
@@ -1,15 +0,0 @@
<?php
$includesArray = array(
'title' => 'LvInfo',
'customJSModules' => ['public/js/apps/Cis/LvInfo.js']
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="content">
<Info studien_semester="<?= $studien_semester ?>" lehrveranstaltung_id="<?= $lvid ?>"></Info>
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
-18
View File
@@ -1,18 +0,0 @@
<?php
$includesArray = array(
'title' => 'Profil',
'customJSModules' => ['public/js/apps/Cis/Profil.js'],
'tabulator5' => true,
'primevue3' => true,
'customCSSs' => ['public/css/components/calendar.css', 'public/css/components/FilterComponent.css','public/css/components/Profil.css','public/css/components/FormUnderline.css'],
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="content" >
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
@@ -21,19 +21,25 @@ $includesArray = array(
'public/css/components/FilterComponent.css',
'public/css/components/Profil.css',
'public/css/components/FormUnderline.css',
'public/css/components/abgabetool/abgabe.css',
'public/css/Cis4/Cms.css',
'public/css/Cis4/Studium.css',
),
'customJSs' => array(
'vendor/npm-asset/primevue/accordion/accordion.min.js',
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
'vendor/npm-asset/primevue/textarea/textarea.min.js',
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
'vendor/npm-asset/primevue/textarea/textarea.min.js',
'vendor/npm-asset/primevue/timeline/timeline.min.js',
'vendor/npm-asset/primevue/inplace/inplace.min.js',
'vendor/npm-asset/primevue/message/message.min.js',
'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
'vendor/moment/luxonjs/luxon.min.js'
),
'customJSModules' => array(
'public/js/apps/Dashboard/Fhc.js'
'public/js/apps/Dashboard/Fhc.js',
),
);
+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>
+10 -3
View File
@@ -7,22 +7,25 @@
'vue3' => true,
'primevue3' => true,
#'filtercomponent' => true,
'tabulator5' => true,
'tabulator6' => true,
'tinymce5' => true,
'phrases' => array(
'global',
'ui',
'notiz',
),
'tags' => true,
'customCSSs' => [
#datepicker fuer component functions
'public/css/components/vue-datepicker.css',
'public/css/components/primevue.css',
'public/css/Studentenverwaltung.css',
'public/css/components/function.css'
'public/css/components/function.css',
'public/css/components/Detailheader.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'
],
@@ -44,6 +47,8 @@ $configArray = [
'showAufnahmegruppen' => !defined('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN') ? false : FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN,
'allowUebernahmePunkte' => !defined('FAS_REIHUNGSTEST_PUNKTEUEBERNAHME') ? true : FAS_REIHUNGSTEST_PUNKTEUEBERNAHME,
'useReihungstestPunkte' => !defined('FAS_REIHUNGSTEST_PUNKTE') ? true : FAS_REIHUNGSTEST_PUNKTE,
'hasExcludedAreas' => defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE),
'stvTagsEnabled' => defined('STV_TAGS_ENABLED') ? STV_TAGS_ENABLED : false,
];
?>
@@ -53,6 +58,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)); ?>"
>

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