Compare commits

..

177 Commits

Author SHA1 Message Date
Harald Bamberger 81244a06ca antrag_prestudentstatus_whitelist_abmeldung damit Unterbrecher sich auch abmelden koennen 2024-01-12 16:13:19 +01:00
Harald Bamberger 64279bace2 change function type from volatile to stable for public.get_rolle_prestudent 2024-01-09 09:40:56 +01:00
Harald Bamberger fde1623dc0 Merge branch 'feature-35545/Studstatus_Status_Abgemeldet' 2024-01-08 18:23:10 +01:00
Harald Bamberger 3687f63189 Merge branch 'feature-35411/Studstatus_Query_Performance' 2024-01-08 17:42:20 +01:00
cgfhtw 5b62271711 s&d 2024-01-02 09:36:28 +01:00
cgfhtw 43813b3ef0 getActiveStgs 2023-12-27 10:51:57 +01:00
cgfhtw aa5868826f getAntraege 2023-12-27 10:26:42 +01:00
cgfhtw f03d218872 s&d 2023-12-22 14:49:40 +01:00
Harald Bamberger 151012fedf AntragJob: nur Personen die eine Aufforderung oder einen Reminder zur Wiederholung erhalten haben und die Frist abgelaufen ist zum Abbrecher machen 2023-12-22 11:08:56 +01:00
Andreas Österreicher 1530726b0a Merge branch 'feature-20037/reihungstestjob_neue_studienplaene_werden_nicht_korrekt_zugeordnet' 2023-12-21 15:44:58 +01:00
ma0048 250434b806 Merge remote-tracking branch 'origin/master' into feature-20037/reihungstestjob_neue_studienplaene_werden_nicht_korrekt_zugeordnet 2023-12-21 15:41:28 +01:00
Andreas Österreicher 2e742a7913 Merge branch 'feature-29144/Prestudent_status_nach_Bismeldung_sperren_2' 2023-12-21 13:29:02 +01:00
Harald Bamberger 5bfa8ca53c Merge branch 'feature-35066/Studstatus_divers' 2023-12-20 19:57:33 +01:00
Andreas Österreicher 29d7a97ee8 Wording korrigiert 2023-12-20 14:26:30 +01:00
Andreas Österreicher 20f9f52eef Doppelten Composer Eintrag entfernt 2023-12-20 14:11:49 +01:00
Andreas Österreicher 72217d9793 Merge branch 'master' into feature-29144/Prestudent_status_nach_Bismeldung_sperren_2 2023-12-20 14:06:18 +01:00
Andreas Österreicher c400e112fd Merge branch 'feature-35007/Text_zu_UHSTAT_Formular_hinzufuegen' 2023-12-20 13:43:23 +01:00
cgfhtw 3f88bba9bb Negative Prüfungen sortiert und bei bestehenden Anträgen nach Antragsdatum und Stdsem gefiltert 2023-12-20 12:06:45 +01:00
cgfhtw ca55b63e01 Load Language before Anträge 2023-12-20 09:30:44 +01:00
cgfhtw ba7f60b16e Filter Beschriftung 2023-12-20 09:18:44 +01:00
cgfhtw 6c0fa3fed3 Leitungsansicht: Aktiv Default & korrekter Filter beim Neuladen der Seite 2023-12-20 09:14:58 +01:00
Harald Bamberger a02e79a33a fix sancho mail template kurzbz too long 2023-12-19 18:14:08 +01:00
cgfhtw f4194c251a loadActiveForStudiengaenge eigene Funktion 2023-12-18 14:27:32 +01:00
cgfhtw d8dc19ef2f Merge branch 'master' into feature-35066/Studstatus_divers 2023-12-18 14:19:50 +01:00
Andreas Österreicher 7868c2e073 Merge branch 'feature-35019/visual_library_abgabetool_nutzungsbedingungen_fuer_epub' 2023-12-18 13:32:41 +01:00
ma0048 55fbf40374 - abgabetool text anpassungen
- nutzungsbedingungen
- delay config hinzugefuegt
- required inputs hinzugefuegt
2023-12-18 09:20:01 +01:00
cgfhtw e698564202 StudStatus: Toggle "nur aktive anzeigen" 2023-12-14 11:28:19 +01:00
Harald Bamberger adc66695e4 Merge branch 'feature-34727/Studstatus_Studienplaene_w_multiple_languages' 2023-12-13 16:05:04 +01:00
Harald Bamberger 9e59caf7bc Merge branch 'master' into feature-34727/Studstatus_Studienplaene_w_multiple_languages 2023-12-13 15:10:21 +01:00
Andreas Österreicher a75234165b Merge branch 'hotfix_Anrechnungsantraege-in-zukuenftigen-Studiensemester-ermoeglichen' 2023-12-12 14:45:18 +01:00
Andreas Österreicher 18f88b7697 Merge branch 'infocenter_2023_12_04' 2023-12-12 13:27:05 +01:00
Andreas Österreicher 5c3f5b26d3 Composer Lock aktualisiert und neuen Config Eintrag für Zahlungstypen
hinzugefügt
2023-12-12 13:25:10 +01:00
cgfhtw 14c24005fe Wiederholung wenn Studierende das letze Semester wiederholen 2023-12-12 11:02:12 +01:00
Harald Bamberger 9fa7e6e56c modify label of Studiengaenge in Dropdown and Table 2023-12-07 17:12:38 +01:00
Harald Bamberger b6585dc186 add margin-right to prevent scrollbar from overlaying table 2023-12-07 16:05:52 +01:00
cgfhtw b15adf7b23 Revert "task-35010: Abmeldung d. StG Pre-Abbrecher Statusgrund nach zurückgezogen wieder rückgängig machen"
This reverts commit 3e9dcf2911.
2023-12-06 14:32:29 +01:00
cgfhtw b6b21d54fc Pre-Abbrecher Statusgrund nach zurückgezogen wieder rückgängig machen 2023-12-06 14:26:59 +01:00
cgfhtw 3e9dcf2911 task-35010: Abmeldung d. StG Pre-Abbrecher Statusgrund nach zurückgezogen wieder rückgängig machen 2023-12-06 09:46:34 +01:00
cgfhtw 98de634393 s&d 2023-12-05 09:27:20 +01:00
ma0048 f3be186c5a Merge branch 'feature-27398/Offene_Rechnungen_im_Bewerbungstool_anzeigen' into infocenter_2023_12_04 2023-12-04 12:46:16 +01:00
ma0048 ab5d0693eb Merge branch 'feature-16354/TinyMCE_move_to_new_version' into infocenter_2023_12_04
# Conflicts:
#	composer.lock
2023-12-04 12:44:10 +01:00
ma0048 a4417bdd98 Merge remote-tracking branch 'origin/feature-32978/bewerberstatus_cronjob_aktivieren' into infocenter_2023_12_04 2023-12-04 12:33:25 +01:00
ma0048 a8efe3c109 Merge remote-tracking branch 'origin/feature-33037/bewerbungstool_textanpassung' into infocenter_2023_12_04 2023-12-04 12:32:55 +01:00
ma0048 4ceca78ebc Merge remote-tracking branch 'origin/feature-33185/statusfilter_im_fas_fuer_neuen_bewerber_prozess' into infocenter_2023_12_04 2023-12-04 12:32:34 +01:00
ma0048 af1db47e1d Merge remote-tracking branch 'origin/feature-33250/messages_von_reihungstestverwaltungsseite_aus_schicken' into infocenter_2023_12_04 2023-12-04 12:29:43 +01:00
ma0048 fa80c49eba Merge remote-tracking branch 'origin/feature-33714/erhoehter_studienbeitrag_fuer_drittsaatenangehoerig' into infocenter_2023_12_04 2023-12-04 12:29:17 +01:00
Harald Bamberger 483b6171c7 add space between firstname and surname 2023-12-01 09:39:46 +01:00
Harald Bamberger 0e04138480 Merge branch 'feature-34998/Studierendenstatus_Mail_nicht_an_private_Adresse_schicken' 2023-11-30 15:04:10 +01:00
cgfhtw a3963248dd s&d 2023-11-29 14:37:35 +01:00
ma0048 ea14fa1a4b - infocenter kaution spalte angepasst
- infocenter abgewiesen nachricht spalte angepasst
2023-11-29 13:05:49 +01:00
KarpAlex 734ab45264 UHSTAT form: added SVNR text 2023-11-29 01:06:42 +01:00
Cris 1310dea4a5 Changed Tabulators new-Button to btn-primary color 2023-11-28 18:55:14 +01:00
Cris be0e2a6dca Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-11-28 18:49:37 +01:00
Harald Bamberger 0f2f21aa19 Merge branch 'feature-34537/Phrasenmixin_als_Plugin' 2023-11-28 12:56:31 +01:00
Harald Bamberger bbd41f17cc use textarea instead of pre 2023-11-28 12:53:44 +01:00
Harald Bamberger c123ad0578 Merge branch 'master' into feature-34537/Phrasenmixin_als_Plugin 2023-11-28 09:28:02 +01:00
ma0048 6b2d728143 - textänderung 2023-11-28 08:57:30 +01:00
cgfhtw a6f18ae424 Bugfix: parameter missing 2023-11-27 12:21:25 +01:00
Andreas Österreicher 71495877f3 Merge branch 'feature-29767/anpassung_abgabetool_fuer_vl' 2023-11-27 10:09:45 +01:00
Harald Bamberger 28e533fb3c replace pre with textarea to fix reason being overlapped by scroll bar 2023-11-23 17:53:43 +01:00
Harald Bamberger a1aff9bd0c Merge branch 'feature-34883/Studstatus_insertvon__bestaetigtvon_bei_Abbrechern' 2023-11-23 16:29:40 +01:00
Harald Bamberger 66cbe5199a correct phrasestext 2023-11-23 16:17:05 +01:00
Harald Bamberger b0d6212c5e Merge branch 'feature-34922/NeuerAbmeldungsgrundPhrase' 2023-11-23 16:06:54 +01:00
cgfhtw c93a4d2fb5 Studstatus: Wiederholer Reminder 1 wird vermutlich mit einem Tag delay versandt 2023-11-23 15:51:35 +01:00
cgfhtw 4932f21204 s&d 2023-11-23 15:37:01 +01:00
ma0068 2d25e08227 Longtext ZGV ohne Hinweis auf Ausbildungsvertrag 2023-11-23 09:45:29 +01:00
ma0068 d0bebeaa4a neue Phrase MissingZGV, entfernen new lines 2023-11-23 09:16:56 +01:00
Harald Bamberger 594dbdca21 Merge branch 'feature-34883/bestaetigtvon_bei_Abbrechern' 2023-11-22 17:08:20 +01:00
cgfhtw 8142982ac7 s&d 2023-11-22 14:57:24 +01:00
cgfhtw ca2256bb32 Fix: Better handling of uninitialized variables 2023-11-22 14:57:06 +01:00
Harald Bamberger ad8a18ed7d change lvzuweisungurl to use VILESCI_ROOT if defined for Sancho_Mail_Antrag_W_New 2023-11-22 13:08:47 +01:00
cgfhtw 73e8761728 Bugfix: Lvzuweisung - DB Errors in production 2023-11-21 10:46:23 +01:00
cgfhtw cc779f3d27 finish 2023-11-21 08:48:34 +01:00
ma0048 2158e7a28d - wording
- standardwert
- absage infocenter
2023-11-20 11:55:05 +01:00
cgfhtw a82df1058d Phrasen Plugin: async loadCategory function & use Vue.computed() 2023-11-16 15:23:40 +01:00
Harald Bamberger f9cf1a5b32 change perstistenceID to force new settings in browser localstorage 2023-11-14 22:55:29 +01:00
cgfhtw 5b2bfb9340 Code optimizing 2023-11-13 09:52:04 +01:00
Harald Bamberger 89c546f74f fix resize-handle in right column header 2023-11-10 15:29:50 +01:00
Harald Bamberger 18f36c9d23 update tabulator5 to version 5.5.2 to get better behaviour of frozen right column 2023-11-10 15:16:40 +01:00
cgfhtw cb009529af Mixin auf Plugin ändern 2023-11-10 14:46:18 +01:00
cgfhtw e56ccffe8d Bugfixes: Studstatus 2023-11-10 14:30:41 +01:00
cgfhtw 479d1a900f Orgform PDFs 2023-11-09 14:19:36 +01:00
Harald Bamberger 1d2a92f37f Merge branch 'feature-34545/Bug_StudStatus_Orgform_falsch' 2023-11-09 13:46:07 +01:00
cgfhtw 46855c9547 Blacklist für Noten 2023-11-09 13:37:56 +01:00
cgfhtw 85f178fcf3 remove var_dump 2023-11-09 13:26:54 +01:00
Harald Bamberger 4bfc26006b Merge branch 'feature-28886/Filter_Component_vs_Table_Component' 2023-11-09 11:48:51 +01:00
cgfhtw 05744f3921 Bugfix 2023-11-08 09:35:23 +01:00
Andreas Österreicher fad475fb64 Fixed Loading Lehraufträge with Postgresql 15 2023-11-06 09:00:28 +01:00
ma0048 e0a2fba209 - erhoehte studiengebuehr hinzugefuegt & filter 2023-11-03 11:37:58 +01:00
ma0048 6e18d2ee2b - rt verwaltung message an prestudent 2023-11-03 11:22:27 +01:00
Harald Bamberger c7508d2b8c Merge branch 'master' of github.com:FH-Complete/FHC-Core 2023-11-02 16:50:06 +01:00
Harald Bamberger c12169557b rename vuepic/vue-datepicker to vuejs/vuedatepicker 2023-11-02 16:49:38 +01:00
Harald Bamberger f956db5889 Merge branch 'feature-34495/LinkSammelmailStgl' 2023-10-31 13:34:57 +01:00
ma0068 8971f79a77 Verwendung von APP_ROOT 2023-10-31 13:23:56 +01:00
ma0068 fdb4eb5e7d Link Stgl Sammelmail 2023-10-31 13:16:25 +01:00
Cris d37a8f1357 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-10-31 12:58:03 +01:00
Andreas Österreicher ccace2f826 Fehler beim Laden der Lehrauftragsliste korrigiert mit Postgres15 2023-10-31 11:16:53 +01:00
Andreas Österreicher 2254aa3643 Merge branch 'bug-34481/infocenter_bug_rueckstellung' 2023-10-31 08:34:11 +01:00
ma0048 684a741f2a - bugfix 2023-10-31 08:33:10 +01:00
Harald Bamberger f53bca1ba6 Merge branch 'feature-33948/Studstatus_CSV_Export' 2023-10-27 10:47:10 +02:00
Harald Bamberger 2ed6f30bea Merge branch 'feature-33947/Studierendenantraege_SammelmailAnAssistenz' 2023-10-27 10:45:35 +02:00
cgfhtw 73cbaf77f1 CSV Options adjusted for German MS Office 2023-10-24 14:16:13 +02:00
ma0068 aead4f3380 Assistenz als CC zu SammelmailSTGL hinzugefügt 2023-10-24 10:44:17 +02:00
KarpAlex c9331771b3 lock Prestudentstatus after Bismeldestichtag in FAS: possible to edit student with prestudentstatus check permission, all fields are greyed out when not editable, changed BIS-Meldestichtagsverwaltung menu point text 2023-10-23 16:39:33 +02:00
Andreas Österreicher dc496deadd Merge branch 'bug-33290/ZeitsperreEndeDatumFehlenderMaxwert' 2023-10-23 16:18:54 +02:00
Andreas Österreicher ecba22acfc Merge branch 'master' of github.com:FH-Complete/FHC-Core 2023-10-23 15:03:21 +02:00
Andreas Österreicher 01ca583167 Vertragsstunden werden auf 2 Nachkommastellen gerundet anstatt auf 1 2023-10-23 15:02:34 +02:00
ma0048 a1ee027ea4 - phrasen 2023-10-23 09:51:04 +02:00
Harald Bamberger 548a3e39b9 change label 2023-10-20 15:50:48 +02:00
ma0048 6a008fc5da - filter hinzugefuegt 2023-10-17 16:38:05 +02:00
Cris d85bbac19b Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-10-17 11:32:01 +02:00
cgfhtw 56f26e6ebe Bugfix: FilterCmpt: reload function 2023-10-11 15:39:14 +02:00
cgfhtw c3b6a77dad switch visibility only for not frozen columns with title 2023-10-11 13:18:33 +02:00
cgfhtw 16fdb0de69 cleanup 2023-10-11 13:17:45 +02:00
cgfhtw 9db6874dc4 CSS for tabulator 2023-10-11 13:17:32 +02:00
ma0068 23aeba4620 Verwendung von datetime-funktionen anstelle von strtotime, Adaptierung config-eintrag, update Phrasen 2023-10-06 12:30:14 +02:00
ma0048 e30ad887c9 - msg an alle moeglich 2023-10-05 10:26:19 +02:00
ma0048 6c8b3b4ec4 - nur an markierte msg moeglich 2023-10-02 14:12:03 +02:00
ma0048 dc78660433 - fix for fas 2023-09-29 09:49:12 +02:00
ma0068 f9af5638f5 Update Config: Format in Tagen für Validierung JS 2023-09-28 09:31:40 +02:00
KarpAlex 285af0a7f4 composer: updated datepicker 2023-09-27 13:52:31 +02:00
ma0048 2d963c92cc - msg aus rtverwaltung moeglich 2023-09-27 10:38:44 +02:00
ma0068 1809ff3008 accept days, weeks, month and years in config 2023-09-27 08:30:03 +02:00
ma0068 be3e4e552b Adapt diffTageMax 2023-09-25 15:44:48 +02:00
ma0068 b1f3916e49 Adaptierung bismax-Validierung 2023-09-25 15:33:17 +02:00
ma0068 746ee76a3b Validierungen Von- und Bis-Felder vilesci 2023-09-25 15:11:14 +02:00
ma0068 f71b0e500e Adaptierung Berechnung diff 2023-09-25 14:15:33 +02:00
ma0068 9eeeeca62c Fix format 2023-09-25 09:54:49 +02:00
ma0068 9b11b19cf9 Zeitsperre: Maxwert bei Bisdatum 2023-09-22 13:33:54 +02:00
ma0048 91f3197c24 - added link option
- styling
2023-09-14 11:56:26 +02:00
ma0048 0e1f4148f5 - anpassungen fuer bewerberautofill 2023-09-07 14:34:20 +02:00
ma0048 07deb7b6c5 - textanpassung 2023-09-04 13:34:42 +02:00
KarpAlex 8122ab0292 simplified error message for invalid status dates 2023-08-15 19:27:39 +02:00
KarpAlex 3ea74ab23c Bismeldestichtage GUI: improved datepicker, correct Studiensemester sort, insertamum is set when inserting 2023-08-10 23:15:44 +02:00
KarpAlex 459f068765 bismeldestichtag gui: added icon to delete button, added id field 2023-07-26 20:59:05 +02:00
KarpAlex c2962f51e1 Bismeldestichtag gui: added vue date picker 2023-07-17 21:03:51 +02:00
KarpAlex c6fee48c8c bismeldestichtage GUI: correct date format on row click 2023-07-17 12:31:45 +02:00
KarpAlex 7ab5d3add6 Bismeldestichtage Management GUI: added row delete button 2023-07-17 12:11:15 +02:00
KarpAlex b7a1add2f3 bismeldestichtage gui: removed filters, now just simple tabulator 2023-07-07 02:12:14 +02:00
KarpAlex 8a1de56dc2 Merge branch 'feature-28886/Filter_Component_vs_Table_Component' into feature-29144/Prestudent_status_nach_Bismeldung_sperren 2023-07-06 22:54:48 +02:00
cgfhtw 3798720ee0 +emit: click:new 2023-07-04 14:38:20 +02:00
cgfhtw 16356d8a5c reverse order setColumns & setData 2023-07-04 10:42:06 +02:00
KarpAlex f6661fabea bismeldestichtage GUI: added delete button again (for now...) 2023-06-30 13:33:52 +02:00
KarpAlex 74814db900 Bismeldestichtag Management: improved GUI layout, studiensemester is optional for "bismeldestichtag reached" check 2023-06-29 19:19:00 +02:00
KarpAlex 18d25069f3 tbl_bismeldestichtag: removed edit permissions for web user 2023-06-29 19:17:38 +02:00
KarpAlex 097010290d Merge branch 'master' into feature-29144/Prestudent_status_nach_Bismeldung_sperren 2023-06-29 11:47:56 +02:00
KarpAlex f29d5a7b50 Bismeldestichtage management: added menu entry, changed size of filter widget table to auto 2023-06-17 21:00:52 +02:00
KarpAlex f865d09033 manage Bismeldestichtage: added possibility to delete a report target date 2023-06-13 16:14:38 +02:00
KarpAlex fe9bf1dc8a Bismeldestichtag: prestudentstatus is displayed as inaktive in FAS list if Stichtag is reached, fixed comments 2023-06-11 11:07:28 +02:00
KarpAlex e6b47266b9 Added GUI for adding Bismeldestichtag 2023-06-10 21:40:28 +02:00
KarpAlex f95c5ec7cf added overview for editing Bismeldestichtage 2023-06-07 19:25:23 +02:00
KarpAlex df64ad30eb Merge branch 'master' into feature-29144/Prestudent_status_nach_Bismeldung_sperren 2023-06-07 18:48:38 +02:00
KarpAlex dd98434522 added new right for editing bismelden property, disabled bismelden checkbox in FAS if no right 2023-06-07 13:33:43 +02:00
KarpAlex c490aa0040 Revert "hide bismelden checkbox if no keine_studstatuspruefung right"
This reverts commit ae1817fc7b.
2023-06-07 13:31:30 +02:00
KarpAlex ae1817fc7b hide bismelden checkbox if no keine_studstatuspruefung right 2023-06-05 16:36:01 +02:00
KarpAlex 42197c39ed FAS prestudents status: check is Meldestichtag is reached and disable input if it is, bismeldestichtag table: added sequence primary key 2023-06-03 15:18:06 +02:00
ma0048 9f13f876ef - swd.php entfernt 2023-06-01 07:39:56 +02:00
ma0048 bf344df8d6 - abgabetool anpassungen 2023-06-01 07:12:40 +02:00
KarpAlex 0a179c963f bismeldestichtag: added meldestichtag_id to table, created bismeldestichtag class, improved comment for prestudentstatuschecks in studentDBML 2023-05-25 16:35:44 +02:00
cgfhtw be331d6200 Styles 2023-05-24 12:05:36 +02:00
KarpAlex f6f2defc8c Bismeldestichtag: added table 2023-05-23 18:48:18 +02:00
cgfhtw 94a15093ac New Button 2023-05-23 15:26:49 +02:00
cgfhtw d10a229b59 Slot for action buttons 2023-05-23 14:56:31 +02:00
cgfhtw 429c595e04 Reload Button 2023-05-22 11:59:26 +02:00
cgfhtw 4154df1704 Property to Enable/disable the download button 2023-05-19 14:47:05 +02:00
cgfhtw 76fd425027 assert valid nw-new-entry listener if side-menu is enabled 2023-05-16 14:12:46 +02:00
cgfhtw 38f2bb89a4 readability 2023-05-16 10:40:58 +02:00
cgfhtw 1568e619a5 Split the component to improve the quality, readability and maintainability 2023-05-16 10:33:31 +02:00
cgfhtw 2b363119c5 Split the component to improve the quality, readability and maintainability 2023-05-16 10:33:05 +02:00
Paolo 39137d1348 Load a model in the filter component controller to have the DB functionalities ready 2023-04-24 17:07:40 +02:00
Paolo 25313a8f52 Code quality check fixes 2023-03-23 14:34:37 +01:00
Paolo 1b53b17b48 Merge branch 'master' into feature-16354/TinyMCE_move_to_new_version 2023-03-22 16:43:56 +01:00
ma0048 406e1bebfe Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-20037/reihungstestjob_neue_studienplaene_werden_nicht_korrekt_zugeordnet 2022-11-15 15:11:44 +01:00
Paolo ac1df7691a - Added new view application/views/system/messages/FAShtmlWriteTemplate.php to be used with FAS/SeaMonkey and TinyMCE3
- Replaced TinyMCE V4 with V5
- Dropped TinyMCE V4
- Added new JS public/js/messaging/fasMessageWrite.js to be included by application/views/system/messages/FAShtmlWriteTemplate.php
2022-11-11 13:54:25 +01:00
Paolo 9c0d70fe89 Removed version 4 of tinymce 2022-11-08 12:01:05 +01:00
ma0048 a2c2eddf0d - sql angepasst 2022-10-12 11:18:05 +02:00
ma0048 1b49ea2a20 - rt job angepasst 2022-10-11 08:23:49 +02:00
129 changed files with 4542 additions and 1367 deletions
+8
View File
@@ -31,6 +31,14 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 20,
'requiredPermissions' => 'admin:w'
),
'bismeldestichtagsverwaltung' => array(
'link' => site_url('codex/Bismeldestichtag'),
'icon' => '',
'description' => 'BIS-Meldestichtagsverwaltung',
'expand' => true,
'sort' => 30,
'requiredPermissions' => 'admin:w'
)
)
),
@@ -126,6 +126,7 @@ $config['antrag_job_systemuser'] = '';
* @var array Array of tbl_status.status_kurzbz's
*/
$config['antrag_prestudentstatus_whitelist'] = ['Student', 'Diplomand'];
$config['antrag_prestudentstatus_whitelist_abmeldung'] = ['Student', 'Diplomand', 'Unterbrecher'];
/**
@@ -159,3 +160,11 @@ $config['stgkz_blacklist_unterbrechung'] = [];
* @var array An array of tbl_studiengang.studiengang_kz's
*/
$config['stgkz_blacklist_wiederholung'] = [];
/**
* Blacklisted noten for negative committee exams
* noten with this ids won't be seen as negative
*
* @var array An array of noten ids
*/
$config['note_blacklist_wiederholung'] = [];
@@ -0,0 +1,140 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Overview on Bismeldestichtage
*/
class Bismeldestichtag extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'admin:r',
'getStudiensemester' => 'admin:r',
'getBismeldestichtage' => 'admin:r',
'addBismeldestichtag' => 'admin:rw',
'deleteBismeldestichtag' => 'admin:rw'
)
);
// Load models
$this->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// Loads phrases system
$this->loadPhrases(
array(
'bismeldestichtag'
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
*/
public function index()
{
$this->load->view('codex/bismeldestichtag.php');
}
public function getStudiensemester()
{
// load semester list
$semList = array();
$this->StudiensemesterModel->addSelect('studiensemester_kurzbz');
$this->StudiensemesterModel->addOrder('start', 'DESC');
$semRes = $this->StudiensemesterModel->load();
if (hasData($semRes))
{
$semList = getData($semRes);
}
// load current semester
$currSem = null;
$semRes = $this->StudiensemesterModel->getAkt();
if (hasData($semRes))
{
$currSem = getData($semRes)[0]->studiensemester_kurzbz;
}
// output data
$this->outputJsonSuccess(
array('semList' => $semList, 'currSem' => $currSem)
);
}
public function getBismeldestichtage()
{
$this->BismeldestichtagModel->addSelect(
'meldestichtag_id, meldestichtag,
tbl_bismeldestichtag.studiensemester_kurzbz, sem.start AS semester_start,
tbl_bismeldestichtag.insertamum, tbl_bismeldestichtag.insertvon, tbl_bismeldestichtag.updateamum, tbl_bismeldestichtag.updatevon'
);
$this->BismeldestichtagModel->addJoin('public.tbl_studiensemester sem', 'studiensemester_kurzbz', 'LEFT');
$this->BismeldestichtagModel->addOrder('semester_start');
$this->BismeldestichtagModel->addOrder('meldestichtag', 'DESC');
$this->BismeldestichtagModel->addOrder('meldestichtag_id', 'DESC');
$this->outputJson($this->BismeldestichtagModel->load());
}
public function addBismeldestichtag()
{
// get request data
$request = $this->getPostJSON();
// check request data
if (!property_exists($request, 'meldestichtag') || isEmptyString($request->meldestichtag))
$this->terminateWithJsonError('Error occured: Meldestichtag missing');
if (!property_exists($request, 'studiensemester_kurzbz') || isEmptyString($request->studiensemester_kurzbz))
$this->terminateWithJsonError('Error occured: Studiensemester missing');
$meldestichtag = $request->meldestichtag;
$studiensemester_kurzbz = $request->studiensemester_kurzbz;
// check if Bismeldestichtag already exists
$this->BismeldestichtagModel->addSelect('1');
$bismeldestichtagRes = $this->BismeldestichtagModel->loadWhere(
array('meldestichtag' => $meldestichtag, 'studiensemester_kurzbz' => $studiensemester_kurzbz)
);
// return success if already exists
if (hasData($bismeldestichtagRes))
$this->outputJsonSuccess('Bismeldestichtag already exists');
else
{
// insert new if Stichtag does not exist
$this->outputJson($this->BismeldestichtagModel->insert(
array(
'meldestichtag' => $request->meldestichtag,
'studiensemester_kurzbz' => $request->studiensemester_kurzbz,
'insertvon' => getAuthUID()
)
));
}
}
public function deleteBismeldestichtag()
{
// get request data
$request = $this->getPostJSON();
// check request data
if (!property_exists($request, 'meldestichtag_id'))
$this->terminateWithJsonError('Error occured: Meldestichtag Id missing');
$meldestichtag_id = $request->meldestichtag_id;
// deletetion
$this->outputJson($this->BismeldestichtagModel->delete($meldestichtag_id));
}
}
@@ -33,54 +33,28 @@ class Leitung extends FHC_Controller
public function getActiveStgs()
{
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
$stgs = [];
if ($studiengaenge) {
$result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
if (isError($result))
return $this->outputJson($result);
$antraege = getData($result) ?: [];
foreach ($antraege as $antrag) {
if (!isset($stgs[$antrag->studiengang_kz])) {
$stgs[$antrag->studiengang_kz] = new stdClass();
$stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
$stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform;
$stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
}
}
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
$studiengaenge = array_merge($studiengaenge, $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []);
$result = $this->StudierendenantragModel->loadStgsWithAntraege($studiengaenge);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
}
if ($stgsNeuanlage) {
$result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage);
if (isError($result))
return $this->outputJson($result);
$antraege = getData($result) ?: [];
foreach ($antraege as $antrag) {
if (!isset($stgs[$antrag->studiengang_kz])) {
$stgs[$antrag->studiengang_kz] = new stdClass();
$stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
$stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform;
$stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
}
}
}
$this->outputJsonSuccess($stgs);
$this->outputJson($result);
}
public function getAntraege($studiengang = null)
public function getAntraege($studiengang = null, $extra = null)
{
if ($studiengang && $studiengang == 'todo') {
$studiengang = $extra;
$extra = true;
} else {
$extra = false;
}
if($studiengang)
if ($studiengang) {
$studiengaenge = [$studiengang];
else {
} else {
$studiengaenge =$this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
if(!is_array($studiengaenge))
$studiengaenge = [];
@@ -96,7 +70,9 @@ class Leitung extends FHC_Controller
$antraege = [];
if ($studiengaenge) {
$result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
$result = $extra
? $this->StudierendenantragModel->loadActiveForStudiengaenge($studiengaenge)
: $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
if (isError($result)) {
$this->output->set_status_header(500);
return $this->outputJson('Internal Server Error');
@@ -76,10 +76,9 @@ class Wiederholung extends FHC_Controller
if (isError($result)) {
return $this->outputJsonError(getError($result));
}
$data = getData($result);
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id, $data->datum, $data->studiensemester_kurzbz);
// NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
$pruefungsdata = current(getData($result));
@@ -26,6 +26,9 @@ class Filter extends FHC_Controller
// Loads authentication library and starts authentication
$this->load->library('AuthLib');
// Loads the FiltersModel
$this->load->model('system/Filters_model', 'FiltersModel');
// Loads the FilterCmptLib with HTTP GET/POST parameters
$this->_startFilterCmptLib();
}
+63 -44
View File
@@ -96,7 +96,7 @@ class AntragJob extends JOB_Controller
}
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
$result = $this->StudiengangModel->load($antrag->studiengang_kz);
$result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
if (isError($result))
{
$this->logError(getError($result));
@@ -165,9 +165,14 @@ class AntragJob extends JOB_Controller
}
$data['table'] = $data['table_' . DEFAULT_LANGUAGE];
$data['leitungLink'] = APP_ROOT. 'index.ci.php/lehre/Studierendenantrag/leitung';
//Mail an Stgl und Assistenz
$to = $leitung['Details']->uid . '@' . DOMAIN;
$cc = $leitung['Details']->email;
// NOTE(chris): Sancho mail
if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $leitung['Details']->uid . '@' . DOMAIN, 'Anträge - Aktion(en) erforderlich'))
if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $to, 'Anträge - Aktion(en) erforderlich', DEFAULT_SANCHO_HEADER_IMG, DEFAULT_SANCHO_FOOTER_IMG, '', $cc))
$count++;
}
@@ -209,8 +214,7 @@ class AntragJob extends JOB_Controller
$count = 0;
foreach ($antraege as $antrag)
{
$this->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
$res = $this->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
$res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
$stg = '';
$orgform = '';
if (hasData($res)) {
@@ -282,7 +286,6 @@ class AntragJob extends JOB_Controller
$result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed(
[
null,
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
Studierendenantragstatus_model::STATUS_REQUESTSENT_2
],
@@ -342,9 +345,11 @@ class AntragJob extends JOB_Controller
$dateDeadline = new DateTime();
$dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline));
$this->StudierendenantragModel->addSelect('tbl_studierendenantrag.studierendenantrag_id');
$this->StudierendenantragModel->addSelect('prestudent_id');
$this->StudierendenantragModel->addSelect('studiensemester_kurzbz');
$this->StudierendenantragModel->addSelect('s.insertamum');
$this->StudierendenantragModel->addSelect('s.insertvon');
$this->StudierendenantragModel->db->where_in('public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', $this->config->item('antrag_prestudentstatus_whitelist'));
@@ -365,51 +370,65 @@ class AntragJob extends JOB_Controller
foreach ($antraege as $antrag)
{
$result = $this->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
$insertvon,
'abbrecherStgl',
$antrag->insertamum
);
$result = $this->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag->studierendenantrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED,
'insertvon' => 'AntragJob'
]);
if (isError($result))
$this->logError(getError($result));
else
{
$count++;
$result = $this->PrestudentModel->load($antrag->prestudent_id);
if(!hasData($result)) {
$this->logWarning('No Prestudent found');
continue;
}
$prestudent = current(getData($result));
$result = $this->StudiengangModel->load($prestudent->studiengang_kz);
if(!hasData($result)) {
$this->logWarning('No Studiengang found');
continue;
}
$studiengang = current(getData($result));
$result = $this->PersonModel->loadPrestudent($antrag->prestudent_id);
if(!hasData($result))
{
$this->logWarning('No Person found');
continue;
}
$person = current(getData($result));
$email = $studiengang->email;
$dataMail = array(
'prestudent' => $antrag->prestudent_id,
'studiensemester' => $antrag->studiensemester_kurzbz,
'name' => trim($person->vorname . ' '. $person->nachname),
);
else {
$deregisterStatus = getData($result);
if(!sendSanchoMail('Sancho_Mail_Antrag_A_Assist', $dataMail, $email, 'Einspruchsfrist abgelaufen'))
{
$this->logWarning("Failed to send Notification to " . $email);
$result = $this->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
'AntragJob',
'abbrecherStgl',
$antrag->insertamum,
null,
$antrag->insertvon ?: $insertvon
);
if (isError($result)) {
$this->StudierendenantragstatusModel->delete($deregisterStatus);
$this->logError(getError($result));
} else {
$count++;
$result = $this->PrestudentModel->load($antrag->prestudent_id);
if(!hasData($result)) {
$this->logWarning('No Prestudent found');
continue;
}
$prestudent = current(getData($result));
$result = $this->StudiengangModel->load($prestudent->studiengang_kz);
if(!hasData($result)) {
$this->logWarning('No Studiengang found');
continue;
}
$studiengang = current(getData($result));
$result = $this->PersonModel->loadPrestudent($antrag->prestudent_id);
if(!hasData($result))
{
$this->logWarning('No Person found');
continue;
}
$person = current(getData($result));
$email = $studiengang->email;
$dataMail = array(
'prestudent' => $antrag->prestudent_id,
'studiensemester' => $antrag->studiensemester_kurzbz,
'name' => trim($person->vorname . ' '. $person->nachname),
);
if(!sendSanchoMail('Sancho_Mail_Antrag_A_Assist', $dataMail, $email, 'Einspruchsfrist abgelaufen'))
{
$this->logWarning("Failed to send Notification to " . $email);
}
}
}
}
$this->logInfo($count . " Students set to Abbrecher");
$this->logInfo($count . "/" . count($antraege) . " Students set to Abbrecher");
}
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
}
@@ -467,7 +467,7 @@ class ReihungstestJob extends JOB_Controller
$this->PrestudentstatusModel->addJoin('public.tbl_person', 'person_id');
$yesterdays_applicants_arr = $this->PrestudentstatusModel->loadWhere('
status_kurzbz = \'Interessent\' AND
status_kurzbz IN (\'Interessent\', \'Bewerber\') AND
typ = \'b\' AND
bestaetigtam = current_date - 1
');
@@ -730,33 +730,27 @@ class ReihungstestJob extends JOB_Controller
tbl_reihungstest.reihungstest_id,
tbl_studienplan.studienplan_id,
tbl_reihungstest.studiensemester_kurzbz,
tbl_studienordnung.studiengang_kz
tbl_studienordnung.studiengang_kz,
tbl_studienplan.orgform_kurzbz
FROM
public.tbl_reihungstest
JOIN public.tbl_rt_studienplan ON(tbl_rt_studienplan.reihungstest_id=tbl_reihungstest.reihungstest_id)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
JOIN public.tbl_rt_studienplan ON(tbl_rt_studienplan.reihungstest_id=tbl_reihungstest.reihungstest_id)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
WHERE
NOT EXISTS(
SELECT 1 FROM lehre.tbl_studienplan_semester
WHERE studienplan_id=tbl_rt_studienplan.studienplan_id
AND tbl_studienplan_semester.studiensemester_kurzbz=tbl_reihungstest.studiensemester_kurzbz
EXISTS (
SELECT studienplan_id
FROM lehre.tbl_studienordnung sordnung
JOIN lehre.tbl_studienplan USING (studienordnung_id)
JOIN lehre.tbl_studienplan_semester USING (studienplan_id)
WHERE sordnung.studiengang_kz = tbl_studienordnung.studiengang_kz
AND tbl_studienplan_semester.studiensemester_kurzbz = tbl_reihungstest.studiensemester_kurzbz
AND tbl_studienplan.studienplan_id NOT IN
(
SELECT studienplan_id FROM tbl_rt_studienplan WHERE reihungstest_id = tbl_reihungstest.reihungstest_id
)
)
AND tbl_reihungstest.datum >= now()
AND NOT EXISTS(
SELECT
1
FROM
public.tbl_rt_studienplan rtstp
JOIN lehre.tbl_studienplan stp USING(studienplan_id)
JOIN lehre.tbl_studienordnung sto USING(studienordnung_id)
JOIN lehre.tbl_studienplan_semester stpsem USING(studienplan_id)
WHERE
sto.studiengang_kz=tbl_studienordnung.studiengang_kz
AND rtstp.reihungstest_id=tbl_reihungstest.reihungstest_id
AND stpsem.studiensemester_kurzbz=tbl_reihungstest.studiensemester_kurzbz
)
";
AND tbl_reihungstest.datum >= now()";
$db = new DB_Model();
$result_rt = $db->execReadOnlyQuery($qry);
@@ -766,7 +760,9 @@ class ReihungstestJob extends JOB_Controller
// find an active studyplan for the same degree program with is valid in this semester
$result_stpl = $this->StudienplanModel->getStudienplaeneBySemester(
$row_rt->studiengang_kz,
$row_rt->studiensemester_kurzbz
$row_rt->studiensemester_kurzbz,
null,
$row_rt->orgform_kurzbz
);
if (hasData($result_stpl)) {
@@ -81,42 +81,9 @@ class Studierendenantrag extends FHC_Controller
public function leitung()
{
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
$stgL = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
$stgL = [];
if ($studiengaenge) {
$result = $this->StudiengangModel->loadWithOrgform($studiengaenge);
if (isError($result))
return show_error(getError($result));
$antraege = getData($result) ?: [];
foreach ($antraege as $antrag) {
if (!isset($stgL[$antrag->studiengang_kz])) {
$stgL[$antrag->studiengang_kz] = new stdClass();
$stgL[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
$stgL[$antrag->studiengang_kz]->orgform = $antrag->orgform;
$stgL[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
}
}
}
$stgA = [];
if ($stgsNeuanlage) {
$result = $this->StudiengangModel->loadWithOrgform($stgsNeuanlage);
if (isError($result))
return show_error(getError($result));
$antraege = getData($result) ?: [];
foreach ($antraege as $antrag) {
if (!isset($stgA[$antrag->studiengang_kz])) {
$stgA[$antrag->studiengang_kz] = new stdClass();
$stgA[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
$stgA[$antrag->studiengang_kz]->orgform = $antrag->orgform;
$stgA[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
}
}
}
$stgA = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: [];
$this->load->view('lehre/Antrag/Leitung/List', [
'stgA' => $stgA,
@@ -152,10 +152,10 @@ class requestAnrechnung extends Auth_Controller
return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt'));
}
// Exit if application is not for actual studysemester
if (!self::_applicationIsForActualSS($studiensemester_kurzbz))
// Exit if application is a past ( < actual ) studysemester
if (self::_applicationIsPastSS($studiensemester_kurzbz))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragNurImAktSS'));
return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtFuerVerganganeSS'));
}
// Upload document
@@ -312,18 +312,21 @@ class requestAnrechnung extends Auth_Controller
}
/**
* Check if applications' study semester is actual study semester.
* Check if applications' study semester is < actual study semester.
*
* @param $studiensemester_kurzbz
* @return bool
*/
private function _applicationIsForActualSS($studiensemester_kurzbz)
private function _applicationIsPastSS($studiensemester_kurzbz)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->getNearest();
$actual_ss = getData($result)[0]->studiensemester_kurzbz;
$actual_ss = getData($result)[0];
return $studiensemester_kurzbz == $actual_ss;
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$anrechnung_ss = getData($result)[0];
return $anrechnung_ss->ende < $actual_ss->start;
}
private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id)
@@ -37,7 +37,7 @@ class FASMessages extends Auth_Controller
// Loads the view to write a new message with a template
$this->load->view(
'system/messages/htmlWriteTemplate',
'system/messages/FAShtmlWriteTemplate',
$this->CLMessagesModel->prepareHtmlWriteTemplatePrestudents($prestudents)
);
}
@@ -53,7 +53,7 @@ class FASMessages extends Auth_Controller
// Loads the view to write a new message with a template
$this->load->view(
'system/messages/htmlWriteTemplate',
'system/messages/FAShtmlWriteTemplate',
$this->CLMessagesModel->prepareHtmlWriteTemplatePrestudents($prestudents, $message_id, $recipient_id)
);
}
+175 -56
View File
@@ -62,6 +62,24 @@ class AntragLib
'insertvon' => $insertvon
]);
// NOTE(chris): remove "preabbrecher" statusgrund for Stgl-Abmeldungen if set
$res = $this->_ci->StudierendenantragModel->load($antrag_id);
if (hasData($res) && current(getData($res))->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) {
$this->_ci->PrestudentstatusModel->addSelect('tbl_status_grund.statusgrund_kurzbz');
$res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail(current(getData($res))->prestudent_id, '', 'Student');
if (hasData($res) && current(getData($res))->statusgrund_kurzbz == 'preabbrecher') {
$prestudentstatus = current(getData($res));
$this->_ci->PrestudentstatusModel->update([
'prestudent_id' => $prestudentstatus->prestudent_id,
'status_kurzbz'=>$prestudentstatus->status_kurzbz,
'studiensemester_kurzbz'=>$prestudentstatus->studiensemester_kurzbz,
'ausbildungssemester'=>$prestudentstatus->ausbildungssemester
], [
'statusgrund_id' => null
]);
}
}
return $result;
}
@@ -123,6 +141,8 @@ class AntragLib
*/
public function approveAbmeldung($studierendenantrag_ids, $insertvon)
{
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$errors = [];
foreach ($studierendenantrag_ids as $studierendenantrag_id) {
$result = $this->_ci->StudierendenantragModel->load($studierendenantrag_id);
@@ -156,7 +176,6 @@ class AntragLib
if (hasData($result)) {
$studiengang = current(getData($result));
$stg = $studiengang->bezeichnung;
$orgform = $studiengang->orgform_kurzbz;
}
if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG)
{
@@ -166,6 +185,7 @@ class AntragLib
else {
$prestudent_status = getData($resultPrestudentStatus)[0];
$orgform = $prestudent_status->orgform_kurzbz;
$vorlage ='Sancho_Mail_Antrag_A_Approve';
$subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve');
@@ -202,14 +222,14 @@ class AntragLib
$data['UID'] = $student->student_uid;
}
$data['Orgform'] = $orgform;
$data['Orgform'] = $prestudent_status->orgform;
$data['stg'] = $stg;
// NOTE(chris): Sancho mail
sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject);
}
} else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
$result = $this->_ci->PrestudentstatusModel->getLastStatus($antrag->prestudent_id, '', 'Student');
$result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student');
if (isError($result))
{
$errors[] = getError($result);
@@ -221,6 +241,7 @@ class AntragLib
continue;
}
$prestudentstatus = getData($result)[0];
$orgform = $prestudentstatus->orgform_kurzbz;
$result = $this->_ci->PrestudentstatusModel->withGrund('preabbrecher')->update([
'prestudent_id' => $prestudentstatus->prestudent_id,
@@ -250,10 +271,9 @@ class AntragLib
$vorname = '';
$nachname = $name;
}
$res = $this->_ci->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']);
$res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
if (hasData($res)) {
$kontakt = current(getData($res));
$email = $kontakt->kontakt;
$email = $this->_ci->StudentModel->getEmailFH(current(getData($res))->student_uid);
$vorlage = $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG ? 'Student' : 'Stgl';
// NOTE(chris): Sancho mail
@@ -334,6 +354,8 @@ class AntragLib
$res = $this->_ci->PrestudentModel->load($antrag->prestudent_id);
if (hasData($res)) {
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$prestudent = current(getData($res));
$res = $this->_ci->PersonModel->load($prestudent->person_id);
if (hasData($res)) {
@@ -344,13 +366,12 @@ class AntragLib
} else {
$name = $this->_ci->p->t('person', 'studentIn');
}
$res = $this->_ci->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']);
if (hasData($res)) {
$kontakt = current(getData($res));
$email = $kontakt->kontakt;
$this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
$res = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
$res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
if (hasData($res)) {
$email = $this->_ci->StudentModel->getEmailFH(current(getData($res))->student_uid);
$res = $this->_ci->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
$stg = '';
$orgform = '';
if (hasData($res)) {
@@ -432,6 +453,7 @@ class AntragLib
public function approveUnterbrechung($studierendenantrag_ids, $insertvon)
{
$this->_ci->load->model('person/Kontakt_model', 'KontaktModel');
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$errors = [];
@@ -555,7 +577,7 @@ class AntragLib
[
'name' => $mail['ass'],
'stg' => $data['studiengang']->bezeichnung,
'Orgform' => $data['studiengang']->orgform_kurzbz,
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
'vorname' => $data['person']->vorname,
'nachname' => $data['person']->nachname,
'UID' => $data['UID'],
@@ -579,7 +601,7 @@ class AntragLib
[
'name' => $mail['stu'],
'stg' => $data['studiengang']->bezeichnung,
'Orgform' => $data['studiengang']->orgform_kurzbz,
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
'vorname' => $data['person']->vorname,
'nachname' => $data['person']->nachname
],
@@ -609,6 +631,7 @@ class AntragLib
public function rejectUnterbrechung($studierendenantrag_ids, $insertvon, $grund)
{
$this->_ci->load->model('person/Kontakt_model', 'KontaktModel');
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$errors = [];
@@ -673,7 +696,7 @@ class AntragLib
'nachname' => $nachname,
'grund' => $grund,
'stg' => $data['studiengang']->bezeichnung,
'Orgform' => $data['studiengang']->orgform_kurzbz,
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
'prestudent_id' => $data['prestudent_status']->prestudent_id,
'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id),
'abmeldungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id
@@ -719,7 +742,6 @@ class AntragLib
else{
$result['studiengang'] = new stdClass();
$result['studiengang']->bezeichnung = "";
$result['studiengang']->orgform_kurzbz = "";
}
$res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id);
@@ -756,7 +778,7 @@ class AntragLib
}
}
$res = $this->_ci->KontaktModel->getZustellKontakt($person_id, ['email']);
$res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
if (isError($res)) {
$errors['email'] = getError($res);
} else {
@@ -765,7 +787,7 @@ class AntragLib
if (!$res) {
$errors['email'] = $this->_ci->p->t('studierendenantrag', 'error_no_email', ['person_id' => $person_id]);
} else {
$result['email'] = current($res)->kontakt;
$result['email'] = $this->_ci->StudentModel->getEmailFH(current($res)->student_uid);
}
}
}
@@ -855,14 +877,18 @@ class AntragLib
$prestudent_status = current($res);
$email = $prestudent_status->email;
// NOTE(chris): Sancho mail
$lvzuweisungLink = site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id);
if( defined('VILESCI_ROOT') )
{
$lvzuweisungLink = VILESCI_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id;
}
sendSanchoMail(
'Sancho_Mail_Antrag_W_New',
[
'antrag_id' => $antrag_id,
'stg' => $prestudent_status->stg_bezeichnung,
'Orgform' => $prestudent_status->orgform,
'lvzuweisungLink' => site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id),
'lvzuweisungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id
'lvzuweisungLink' => $lvzuweisungLink
],
$email,
$this->_ci->p->t('studierendenantrag', 'mail_subject_W_New')
@@ -959,6 +985,7 @@ class AntragLib
$studiengang_kz = $result->studiengang_kz;
$orgform_kurzbz = $result->orgform_kurzbz;
$ausbildungssemester = $result->ausbildungssemester;
$sprache = $result->sprache;
// NOTE(chris): check permission
$allowedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: [];
@@ -1004,11 +1031,12 @@ class AntragLib
$semA,
$ausbildungssemester + 1,
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz
$sprache
);
if (isError($result))
return $result;
$lvsA = $result->retval; // NOTE(chris): don't use getData() because we want to differenciate [] and null
$repeat_last = false;
if ($lvsA) {
foreach($lvsA as $lv)
{
@@ -1019,6 +1047,81 @@ class AntragLib
$lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung;
}
}
} elseif ($lvsA === null) {
// NOTE(chris): We are repeating the last semester
$repeat_last = true;
$result = $this->_ci->PrestudentstatusModel->getStatusByFilter($antrag->prestudent_id, 'Student', $ausbildungssemester - 1);
if (isError($result))
return $result;
$stdsems = getData($result) ?: [];
$stdsem = null;
$result = $this->_ci->StudiensemesterModel->load($antrag->studiensemester_kurzbz);
if (isError($result))
return $result;
if (!hasData($result))
return error($this->_ci->p->t('studierendenantrag', 'error_no_stdsem', ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz]));
$asem = current(getData($result));
foreach ($stdsems as $sem) {
$result = $this->_ci->StudiensemesterModel->load($sem->studiensemester_kurzbz);
if (isError($result))
return $result;
if (hasData($result)) {
if (current(getData($result))->start < $asem->start) {
$stdsem = $sem->studiensemester_kurzbz;
break;
}
}
}
// NOTE(chris): if we don't find a status in the previous semester there is something wrong
if (!$stdsem)
return error($this->_ci->p->t('studierendenantrag', 'error_no_status_in_prev_sem'));
$result = $this->getLvsByStgStsemAndSem(
$studiengang_kz,
$orgform_kurzbz,
$semA,
$ausbildungssemester - 1,
$antrag->prestudent_id,
$sprache
);
if (isError($result))
return $result;
$lvsA = getData($result) ?: [];
$result = $this->getLvsByStgStsemAndSem(
$studiengang_kz,
$orgform_kurzbz,
$stdsem,
$ausbildungssemester - 1,
$antrag->prestudent_id,
$sprache
);
if (isError($result))
return $result;
$lvsAtest = getData($result) ?: [];
if (count(array_intersect(array_map(function ($a) {
return $a->lehrveranstaltung_id;
}, $lvsA), array_map(function ($a) {
return $a->lehrveranstaltung_id;
}, $lvsAtest)))) {
foreach ($lvsA as $lv) {
if (isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == 0)) {
$lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung;
$lv->antrag_zugelassen = true;
}
}
} else {
$lvsA = null;
}
}
$result = $this->getLvsByStgStsemAndSem(
@@ -1027,7 +1130,7 @@ class AntragLib
$semB,
$ausbildungssemester,
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz
$sprache
);
if (isError($result))
return $result;
@@ -1042,10 +1145,14 @@ class AntragLib
// TODO(manu): eventuelle Änderungen taggen
}
return success([
$result = [
'1' . $semA => $lvsA,
'2' . $semB => $lvsB ?: []
]);
];
if ($repeat_last)
$result['repeat_last'] = true;
return success($result);
}
public function getLvsByStgStsemAndSem(
@@ -1054,7 +1161,7 @@ class AntragLib
$studiensemester_kurzbz,
$ausbildungssemester,
$prestudent_id,
$note_stsem
$sprache
) {
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
@@ -1083,19 +1190,31 @@ class AntragLib
'semester' => $ausbildungssemester
]));
}
if (count($result) > 1)
return error($this->_ci->p->t('studierendenantrag', 'error_multiple_studienplan', [
'studiengang_kz' => $studiengang_kz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'semester' => $ausbildungssemester
]));
if (count($result) > 1) {
$langmap = array_unique(array_map(function ($a) {
return $a->sprache;
}, $result));
if ($sprache
&& count($langmap) == count($result)
&& in_array($sprache, $langmap)
) {
$result = array_filter($result, function ($a) use ($sprache) {
return $a->sprache == $sprache;
});
} else {
return error($this->_ci->p->t('studierendenantrag', 'error_multiple_studienplan', [
'studiengang_kz' => $studiengang_kz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'semester' => $ausbildungssemester
]));
}
}
$studienplan = current($result);
return $this->_ci->StudienplanModel->getStudienplanLehrveranstaltungForPrestudent(
$studienplan->studienplan_id,
$ausbildungssemester,
$prestudent_id,
$note_stsem
$prestudent_id
);
}
@@ -1130,7 +1249,7 @@ class AntragLib
$result = current(getData($result));
$datumStatus = $result->datum;
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) {
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist_abmeldung'))) {
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
@@ -1380,6 +1499,8 @@ class AntragLib
$resultDetails->grund = $resultAntrag->grund;
$resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id;
$resultDetails->typ = $resultAntrag->typ;
$resultDetails->datum = $resultAntrag->datum;
$resultDetails->studiensemester_kurzbz = $resultAntrag->studiensemester_kurzbz;
return success($resultDetails);
}
@@ -1481,9 +1602,9 @@ class AntragLib
);
}
public function getFailedExamForPrestudent($prestudent_id)
public function getFailedExamForPrestudent($prestudent_id, $max_date = null, $studiensemester_kurzbz = null)
{
return $this->_ci->PruefungModel->loadWhereCommitteeExamFailedForPrestudent($prestudent_id);
return $this->_ci->PruefungModel->loadWhereCommitteeExamFailedForPrestudent($prestudent_id, $max_date, $studiensemester_kurzbz);
}
public function saveLvs($lvArray)
@@ -1514,6 +1635,8 @@ class AntragLib
public function approveWiederholung($antrag_id, $insertvon)
{
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$result = $this->_ci->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
@@ -1540,18 +1663,9 @@ class AntragLib
if (!$result)
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id]));
$result = current($result);
$studiengang_kz = $result->studiengang_kz;
$semester = $result->ausbildungssemester;
$result = $this->_ci->StudiengangModel->load($studiengang_kz);
if (isError($result))
return $result;
$result = getData($result);
if (!$result)
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id]));
$stg = current($result);
$studiengang_kz = $stg->studiengang_kz;
$semester = $stg->ausbildungssemester;
$result = $this->_ci->StudierendenantragModel->load($antrag_id);
if (isError($result))
@@ -1577,10 +1691,10 @@ class AntragLib
$mitarbeiter = getData($result);
}
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $antrag->prestudent_id]);
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $prestudent_id]);
if (hasData($result)) {
$student = current(getData($result));
$student_uid = $student->student_uid;
$studentObj = current(getData($result));
$student_uid = $studentObj->student_uid;
}
else
$student_uid = '';
@@ -1602,10 +1716,9 @@ class AntragLib
))
return error($this->_ci->p->t('studierendenantrag', 'error_mail_to', ['email' => $email]));
$result = $this->_ci->KontaktModel->getZustellKontakt($person->person_id, ['email']);
if (hasData($result)) {
$kontakt = current(getData($result));
$email = $kontakt->kontakt;
if ($student_uid) {
$email = $this->_ci->StudentModel->getEmailFH($student_uid);
$vorlage = 'Sancho_Mail_Antrag_W_Student';
$sem_not_allowed = $sem_to_repeat = '';
$list_not_allowed = $list_to_repeat = $this->_ci->p->t('studierendenantrag', 'mail_part_error_no_lvs');
@@ -1613,9 +1726,15 @@ class AntragLib
$result = $this->getLvsForAntrag($antrag_id);
if (hasData($result)) {
$lvs = getData($result);
$repeat_last = false;
if (isset($lvs['repeat_last'])) {
$repeat_last = true;
unset($lvs['repeat_last']);
$vorlage .= '_Lst';
}
foreach ($lvs as $sem => $lv_list) {
$lvs_filtered = array_filter($lv_list, function ($el) {
return $el->antrag_zugelassen;
return property_exists($el, 'antrag_zugelassen') && $el->antrag_zugelassen;
});
if (substr($sem, 0, 1) == '1') {
$sem_not_allowed = substr($sem, 1);
@@ -1635,7 +1754,7 @@ class AntragLib
// NOTE(chris): Sancho mail
sendSanchoMail(
'Sancho_Mail_Antrag_W_Student',
$vorlage,
[
'antrag_id' => $antrag_id,
'stg' => $stg->bezeichnung,
+4 -2
View File
@@ -35,10 +35,12 @@ class PrestudentLib
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null, $statusgrund_kurzbz = null, $datum = null, $bestaetigtam = null)
public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null, $statusgrund_kurzbz = null, $datum = null, $bestaetigtam = null, $bestaetigtvon = null)
{
if (!$insertvon)
$insertvon = getAuthUID();
if (!$bestaetigtvon)
$bestaetigtvon = $insertvon;
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz);
if (isError($result))
@@ -79,7 +81,7 @@ class PrestudentLib
'insertamum' => date('c'),
'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz,
'studienplan_id'=> $prestudent_status->studienplan_id,
'bestaetigtvon' => $insertvon,
'bestaetigtvon' => $bestaetigtvon,
'bestaetigtam' => $bestaetigtam
]);
@@ -0,0 +1,14 @@
<?php
class Bismeldestichtag_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'bis.tbl_bismeldestichtag';
$this->pk = 'meldestichtag_id';
}
}
@@ -238,7 +238,7 @@ class Prestudentstatus_model extends DB_Model
{
$this->addSelect('tbl_prestudentstatus.*,
tbl_studienplan.bezeichnung AS studienplan_bezeichnung,
tbl_studienplan.orgform_kurzbz AS orgform,
tbl_orgform.orgform_kurzbz AS orgform,
tbl_studienplan.sprache,
tbl_orgform.bezeichnung_mehrsprachig AS bezeichnung_orgform,
tbl_status.bezeichnung_mehrsprachig,
@@ -250,7 +250,7 @@ class Prestudentstatus_model extends DB_Model
$this->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->addJoin('public.tbl_status', 'tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz');
$this->addJoin('public.tbl_status_grund', 'statusgrund_id', 'LEFT');
$this->addJoin('bis.tbl_orgform', 'tbl_studienplan.orgform_kurzbz = tbl_orgform.orgform_kurzbz', 'LEFT');
$this->addJoin('bis.tbl_orgform', 'COALESCE(tbl_studienplan.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) = tbl_orgform.orgform_kurzbz', 'LEFT');
$this->db->where('tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz');
$where = array('prestudent_id' => $prestudent_id);
@@ -295,7 +295,8 @@ class Prestudentstatus_model extends DB_Model
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_studiengang g', 'p.studiengang_kz=g.studiengang_kz');
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
$this->addOrder($this->dbTable . '.datum', 'DESC');
$this->addOrder($this->dbTable . '.insertamum', 'DESC');
@@ -322,7 +322,7 @@ class Reihungstest_model extends DB_Model
JOIN lehre.tbl_studienplan ON (tbl_prestudentstatus.studienplan_id = tbl_studienplan.studienplan_id)
LEFT JOIN bis.tbl_zgv ON (ps.zgv_code = tbl_zgv.zgv_code)
WHERE rt_id = ?
AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) = \'Interessent\'
AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) IN (\'Interessent\', \'Bewerber\')
AND tbl_prestudentstatus.studiensemester_kurzbz = rt.studiensemester_kurzbz
AND bewerbung_abgeschicktamum IS NOT NULL
AND bestaetigtam IS NOT NULL
@@ -411,7 +411,7 @@ class Reihungstest_model extends DB_Model
JOIN lehre.tbl_studienplan ON (tbl_prestudentstatus.studienplan_id = tbl_studienplan.studienplan_id)
LEFT JOIN bis.tbl_zgv ON (ps.zgv_code = tbl_zgv.zgv_code)
WHERE rt.studiengang_kz = ?
AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) = \'Interessent\'
AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) IN (\'Interessent\', \'Bewerber\')
AND tbl_prestudentstatus.studiensemester_kurzbz = rt.studiensemester_kurzbz
AND bewerbung_abgeschicktamum IS NOT NULL
AND bestaetigtam IS NOT NULL
@@ -462,7 +462,7 @@ class Reihungstest_model extends DB_Model
LEFT JOIN bis.tbl_zgv ON (ps.zgv_code = tbl_zgv.zgv_code)
LEFT JOIN PUBLIC.tbl_ort ON (tbl_rt_person.ort_kurzbz = tbl_ort.ort_kurzbz)
WHERE rt_id = ?
AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) = \'Interessent\'
AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) IN (\'Interessent\', \'Bewerber\')
AND tbl_prestudentstatus.studiensemester_kurzbz = rt.studiensemester_kurzbz
AND bewerbung_abgeschicktamum IS NOT NULL
AND bestaetigtam IS NOT NULL
@@ -20,7 +20,7 @@ class Rueckstellung_model extends DB_Model
$this->addLimit(1);
$this->addJoin('tbl_rueckstellung_status', 'status_kurzbz');
$this->addSelect('*,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>'.$language_index . 'as bezeichnung');
array_to_json(bezeichnung_mehrsprachig::varchar[])->>'.$language_index . ' as bezeichnung');
$this->addOrder('datum_bis', 'DESC');
$where['person_id'] = $person_id;
+1 -1
View File
@@ -84,7 +84,7 @@ class Student_model extends DB_Model
}
/**
* Get the FH-Email for a student (not the private kontakt emailt)
* Get the FH-Email for a student (not the private kontakt email)
* @param $student_uid
* @return string
*/
@@ -39,6 +39,7 @@ class Pruefung_model extends DB_Model
/**
* NOTE(chris): not used
* @return string
*/
protected function loadWhereThreeExamsFailed()
@@ -86,8 +87,10 @@ class Pruefung_model extends DB_Model
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
$this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
$this->db->where("n.positiv", false);
/* $this->db->where_in("p.pruefungstyp_kurzbz1", ['kommPruef','zusKommPruef']);*/
@@ -122,6 +125,8 @@ class Pruefung_model extends DB_Model
*/
public function loadWhereCommitteeExamsFailed()
{
$this->load->config('studierendenantrag');
$this->dbTable = 'lehre.tbl_pruefung p';
$this->addSelect('p.datum');
@@ -129,8 +134,13 @@ class Pruefung_model extends DB_Model
$this->addJoin('lehre.tbl_note n', 'note');
$this->db->where("n.positiv", false);
$note_blacklist = $this->config->item('note_blacklist_wiederholung');
if ($note_blacklist)
$this->db->where_not_in("n.note", $note_blacklist);
$this->db->where_in("p.pruefungstyp_kurzbz", ['kommPruef','zusKommPruef']);
$this->addOrder('p.datum', 'DESC');
return $this->load();
}
@@ -164,7 +174,9 @@ class Pruefung_model extends DB_Model
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
$this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
$this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT');
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
@@ -191,12 +203,19 @@ class Pruefung_model extends DB_Model
*
* @return stdClass
*/
public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id)
public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id, $max_date = null, $studiensemester_kurzbz = null)
{
$this->withDetailsForStudierendenAntrag();
$this->db->where('ps.prestudent_id', $prestudent_id);
if ($max_date !== null) {
$this->db->where('p.datum <', $max_date);
}
if ($studiensemester_kurzbz !== null) {
$this->db->where('le.studiensemester_kurzbz', $studiensemester_kurzbz);
}
return $this->loadWhereCommitteeExamsFailed();
}
@@ -212,9 +231,9 @@ class Pruefung_model extends DB_Model
$this->withDetailsForStudierendenAntrag();
if ($maxDate)
$this->db->where("p.datum < ", $maxDate->format('c'));
$this->db->where("p.datum <= ", $maxDate->format('Y-m-d'));
if ($minDate)
$this->db->where("p.datum > ", $minDate->format('c'));
$this->db->where("p.datum > ", $minDate->format('Y-m-d'));
$this->db->where("b.aktiv", true);
@@ -26,22 +26,23 @@ class Studierendenantrag_model extends DB_Model
return $this->loadForStudiengaenge($studiengaenge, $typ, $this->StudierendenantragstatusModel::STATUS_CREATED);
}
public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null)
public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null, $sql = null)
{
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
if ($sql == null)
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
$this->addSelect('stg.bezeichnung');
$this->addSelect('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung AS bezeichnung');
$this->addSelect('bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false);
$this->addSelect('s.studierendenantrag_id');
$this->addSelect('matrikelnr');
$this->addSelect('studienjahr_kurzbz');
$this->addSelect('vorname');
$this->addSelect('nachname');
$this->addSelect('prestudent_id');
$this->addSelect('p.prestudent_id');
$this->addSelect('p.studiengang_kz');
$this->addSelect('semester');
$this->addSelect($this->dbTable . '.grund');
$this->addSelect('datum');
$this->addSelect($this->dbTable . '.datum');
$this->addSelect('datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.typ');
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
@@ -52,8 +53,10 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin('public.tbl_student', 'prestudent_id');
$this->addJoin('public.tbl_person', 'person_id');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
$this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
$this->addJoin('bis.tbl_orgform', 'orgform_kurzbz');
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
$this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
$this->addJoin(
'campus.tbl_studierendenantrag_status as s',
'campus.get_status_id_studierendenantrag('. $this->dbTable .'.studierendenantrag_id) = studierendenantrag_status_id'
@@ -71,6 +74,44 @@ class Studierendenantrag_model extends DB_Model
return $this->loadWhere($where);
}
public function loadActiveForStudiengaenge($studiengaenge)
{
// NOTE(chris): get language before changing things in the global db object because getUserLanguage() might use it and it should not have been tampered with
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
$this->db->group_start();
$this->db->where_not_in('s.studierendenantrag_statustyp_kurzbz', [
Studierendenantragstatus_model::STATUS_CANCELLED,
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_REJECTED,
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
Studierendenantragstatus_model::STATUS_DEREGISTERED
]);
$this->db->or_group_start();
$this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED);
$this->db->where('tbl_studierendenantrag.typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL);
$this->db->group_end();
$this->db->group_end();
return $this->loadForStudiengaenge($studiengaenge, null, null, $sql);
}
public function loadStgsWithAntraege($studiengaenge)
{
$this->addDistinct();
$this->addSelect('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung AS bezeichnung');
$this->addSelect('p.studiengang_kz');
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
$this->addOrder('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung');
$this->db->where_in('p.studiengang_kz', $studiengaenge);
return $this->load();
}
public function isInStudiengang($studierendenantrag_id, $studiengaenge)
{
$this->addJoin('public.tbl_prestudent', 'prestudent_id');
@@ -120,14 +161,18 @@ class Studierendenantrag_model extends DB_Model
public function getStgAndSem($antrag_id)
{
$this->addSelect('p.studiengang_kz');
$this->addSelect('stg.bezeichnung');
$this->addSelect('s.ausbildungssemester');
$this->addSelect('s.orgform_kurzbz');
$this->addSelect('plan.sprache');
$this->addSelect('COALESCE(plan.orgform_kurzbz, s.orgform_kurzbz, stg.orgform_kurzbz) AS orgform_kurzbz');
$this->addJoin(
'public.tbl_prestudentstatus s',
$this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz'
);
$this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id');
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addOrder('s.datum', 'DESC');
$this->addOrder('s.insertamum', 'DESC');
@@ -192,7 +237,9 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
$this->addJoin('bis.tbl_orgform', 'orgform_kurzbz');
$this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp st',
'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz',
@@ -65,20 +65,40 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model
'stat.studierendenantrag_status_id = campus.get_status_id_studierendenantrag(a.studierendenantrag_id)'
);
$this->addJoin('public.tbl_student s', 'prestudent_id');
$this->addJoin(
'lehre.tbl_zeugnisnote z',
'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid AND z.studiensemester_kurzbz=a.studiensemester_kurzbz',
'LEFT'
);
// NOTE(chris): last offizell note
$this->addJoin('(
SELECT z.*
FROM lehre.tbl_zeugnisnote z
LEFT JOIN public.tbl_studiensemester zs
USING(studiensemester_kurzbz)
JOIN (
SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start
FROM lehre.tbl_zeugnisnote zi
LEFT JOIN lehre.tbl_note zin
USING(note)
LEFT JOIN public.tbl_studiensemester zis
USING(studiensemester_kurzbz)
WHERE zin.aktiv AND zin.offiziell
GROUP BY zi.lehrveranstaltung_id, zi.student_uid
) zx
ON (
z.lehrveranstaltung_id=zx.lehrveranstaltung_id
AND z.student_uid=zx.student_uid
AND zs.start = zx.start
)) z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid', 'LEFT');
$this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT');
$this->load->config('studierendenantrag');
$note_intern_angerechntet = $this->config->item('wiederholung_note_angerechnet');
return $this->loadWhere([
'ps.prestudent_id' => $prestudent_id,
'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
'n.note <> ' => 0,
$this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz,
'(n.note<>19 OR (z.note IS NOT NULL AND zn.positiv))' => null
'(n.note<>' . $this->db->escape($note_intern_angerechntet) . ' OR (z.note IS NOT NULL AND zn.positiv))' => null
]);
}
}
@@ -14,6 +14,7 @@ class Studierendenantragstatus_model extends DB_Model
const STATUS_REQUESTSENT_2 = 'ZweiteAufforderungVersandt';
const STATUS_OBJECTED = 'Beeinsprucht';
const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt';
const STATUS_DEREGISTERED = 'Abgemeldet';
/**
* Constructor
@@ -525,20 +525,6 @@ class Studiengang_model extends DB_Model
return $this->execQuery($query, $params);
}
public function loadWithOrgform($studiengang_kzs)
{
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
$this->addSelect($this->dbTable . '.*');
$this->addSelect('o.bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform');
$this->addJoin('bis.tbl_orgform o', 'orgform_kurzbz');
$this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs);
return $this->load();
}
/**
* @param array $studiengang_kzs
* @param array $not_antrag_typ (optional) If the prestudent has an antrag with one of the specified types it will be excluded from the result
@@ -571,7 +557,8 @@ class Studiengang_model extends DB_Model
AND ps.ausbildungssemester=get_absem_prestudent(p.prestudent_id, NULL)
AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, NULL)'
);
$this->addJoin('bis.tbl_orgform o', $this->dbTable . '.orgform_kurzbz=o.orgform_kurzbz');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz)=o.orgform_kurzbz');
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_student stud', 'p.prestudent_id=stud.prestudent_id', 'LEFT');
@@ -60,7 +60,7 @@ class Studienplan_model extends DB_Model
));
}
public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id, $note_stsem)
public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id)
{
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
$sql = 'SELECT student_uid FROM public.tbl_student WHERE prestudent_id=' . $this->escape($prestudent_id);
@@ -75,11 +75,27 @@ class Studienplan_model extends DB_Model
$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id');
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
$this->addJoin(
'lehre.tbl_zeugnisnote zn',
'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=(' . $sql . ') AND zn.studiensemester_kurzbz=' . $this->escape($note_stsem),
'LEFT'
);
// NOTE(chris): last offizell note
$this->addJoin('(
SELECT z.*
FROM lehre.tbl_zeugnisnote z
LEFT JOIN public.tbl_studiensemester zs
USING(studiensemester_kurzbz)
JOIN (
SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start
FROM lehre.tbl_zeugnisnote zi
LEFT JOIN lehre.tbl_note zin
USING(note)
LEFT JOIN public.tbl_studiensemester zis
USING(studiensemester_kurzbz)
WHERE zin.aktiv AND zin.offiziell
GROUP BY zi.lehrveranstaltung_id, zi.student_uid
) zx
ON (
z.lehrveranstaltung_id=zx.lehrveranstaltung_id
AND z.student_uid=zx.student_uid
AND zs.start = zx.start
)) zn', 'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=( ' . $sql . ')', 'LEFT');
$this->addJoin('lehre.tbl_note n', 'n.note=zn.note', 'LEFT');
$this->addOrder('lehre.tbl_studienplan_lehrveranstaltung.sort');
@@ -0,0 +1,75 @@
<?php
$includesArray = array(
'title' => 'Bismeldestichtage',
'axios027' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'vue3' => true,
'filtercomponent' => true,
'navigationcomponent' => true,
'tabulator5' => true,
'customCSSs' => array('vendor/vuejs/vuedatepicker_css/main.css'),
'customJSs' => array('vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js'),
'customJSModules' => array('public/js/apps/Bismeldestichtag/Bismeldestichtag.js')
);
$this->load->view('templates/FHC-Header', $includesArray);
?>
<div id="main">
<!-- Navigation component -->
<core-navigation-cmpt></core-navigation-cmpt>
<!-- Fetch component -->
<core-fetch-cmpt
v-bind:api-function="fetchCmptApiFunction"
v-bind:api-function-parameters="fetchCmptApiFunctionParams"
v-bind:refresh="fetchCmptRefresh"
@data-fetched="fetchCmptDataFetched">
</core-fetch-cmpt>
<div id="content">
<!-- input fields -->
<div class="row">
<div class="col-5">
<datepicker v-model="meldestichtag"
v-bind:enable-time-picker="false"
v-bind:placeholder="'Meldestichtag'"
v-bind:text-input="true"
v-bind:auto-apply="true"
locale="de"
format="dd.MM.yyyy"
model-type="yyyy-MM-dd">
</datepicker>
</div>
<div class="col-4">
<select class="form-select" name="studiensemester_kurzbz" v-model="currSem">
<option v-for="sem in semList" :value="sem.studiensemester_kurzbz">
{{ sem.studiensemester_kurzbz }}
</option>
</select>
</div>
<div class="col-3">
<button type="button" class="btn btn-primary" @click="handlerAddBismeldestichtag">
<?php echo $this->p->t('bismeldestichtag', 'stichtagHinzufuegen') ?>
</button>
</div>
</div>
<br />
<!-- Filter component -->
<div class="row">
<div class="col">
<core-filter-cmpt
title="<?php echo $this->p->t('bismeldestichtag', 'stichtageVerwalten') ?>"
ref="bismeldestichtageTable"
:side-menu="false"
:tabulator-options="bismeldestichtagTabulatorOptions"
:tabulator-events="bismeldestichtagTabulatorEventHandlers"
:table-only="true">
</core-filter-cmpt>
</div>
</div>
</div>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
+3
View File
@@ -47,6 +47,9 @@ $saved = isset($saved) && $saved === true;
<p>
<?php echo $this->p->t('uhstat', 'uhstat1AnmeldungEinleitungstext') ?>
</p>
<p>
<?php echo $this->p->t('uhstat', 'uhstat1EinleitungSvnrtext') ?>
</p>
<br>
<?php if ($editPermission): ?>
<?php if (isset($successMessage) && !isEmptyString($successMessage)): ?>
+4 -4
View File
@@ -11,7 +11,7 @@ $sitesettings = array(
'customJSModules' => array('public/js/apps/lehre/Antrag.js'),
'customCSSs' => array(
'public/css/Fhc.css',
'vendor/vuepic/vue-datepicker-css/main.css'
'vendor/vuejs/vuedatepicker_css/main.css'
),
'customJSs' => array(
)
@@ -35,13 +35,13 @@ $this->load->view(
antrag-type="<?= $antrag_type; ?>"
studierendenantrag-id="<?= $studierendenantrag_id; ?>"
v-model:info-array="infoArray"
v-model:status-msg="statusMsg"
v-model:status-severity="statusSeverity"
v-model:status-msg="status.msg"
v-model:status-severity="status.severity"
>
</studierendenantrag-antrag>
</div>
<div class="col-sm-4 mb-3">
<studierendenantrag-status :msg="statusMsg" :severity="statusSeverity"></studierendenantrag-status>
<studierendenantrag-status :msg="status.msg" :severity="status.severity"></studierendenantrag-status>
<studierendenantrag-infoblock :infos="infoArray"></studierendenantrag-infoblock>
</div>
</div>
@@ -82,7 +82,7 @@ $this->load->view(
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<pre><?= $antrag->grund; ?></pre>
<textarea class="form-control" style="width: 100%; height: 250px;" readonly><?= $antrag->grund; ?></textarea>
</div>
</div>
</div>
@@ -110,8 +110,8 @@ $this->load->view(
<a class="ms-2" target="_blank" href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&uid=' . getAuthUID()); ?>"><i class="fa-solid fa-download" title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"></i></a>
<?php } ?>
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
<a class="ms-2" href="#modalgrund<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal"><?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?></a>
<lv-popup id="modalgrund<?= $antrag->studierendenantrag_id; ?>" antrag-id = "<?= $antrag->studierendenantrag_id; ?>">
<a class="ms-2" href="#modallv<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal"><?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?></a>
<lv-popup id="modallv<?= $antrag->studierendenantrag_id; ?>" antrag-id = "<?= $antrag->studierendenantrag_id; ?>">
<?= $this->p->t('studierendenantrag', 'my_lvs'); ?>
</lv-popup>
<?php } ?>
@@ -142,7 +142,7 @@ FROM
WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung)
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS "lv_oe_kurzbz",
TRUNC(lema.semesterstunden, 1) AS "stunden",
TRUNC(lema.semesterstunden, 2) AS "stunden",
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
@@ -232,7 +232,7 @@ FROM
SELECT
pa.lehreinheit_id,
lv.lehrveranstaltung_id,
pa.projektarbeit_id AS "projektarbeit_id",
pa.projektarbeit_id::text AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
@@ -375,9 +375,9 @@ $filterWidgetArray = array(
orgform_kurzbz: {visible: false, headerFilter:"input"},
person_id: {visible: false, headerFilter:"input"},
lv_oe_kurzbz: {visible: false, headerFilter:"input"},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:2},
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}
bottomCalc:"sum", bottomCalcParams:{precision:2}
},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
@@ -149,7 +149,7 @@ FROM
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS "lv_oe_kurzbz",
(person.nachname || \' \' || person.vorname) AS "lektor",
TRUNC(lema.semesterstunden, 1) AS "stunden",
TRUNC(lema.semesterstunden, 2) AS "stunden",
lema.stundensatz,
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag",
vertrag_id,
@@ -400,9 +400,9 @@ $filterWidgetArray = array(
person_id: {visible: false, headerFilter:"input"},
lv_oe_kurzbz: {visible: false, headerFilter:"input"},
lektor: {headerFilter:"input", widthGrow: 2},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:2},
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}},
bottomCalc:"sum", bottomCalcParams:{precision:2}},
stundensatz: {visible: true, align:"right", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
@@ -159,7 +159,7 @@ FROM
(
SELECT
/* lehrauftraege also planned with dummies, therefore personalnummer is needed */
ma.personalnummer,
ma.personalnummer::text,
lema.lehreinheit_id,
lv.lehrveranstaltung_id,
lv.bezeichnung AS "lv_bezeichnung",
@@ -179,7 +179,7 @@ FROM
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS "lv_oe_kurzbz",
(person.nachname || \' \' || person.vorname) AS "lektor",
TRUNC(lema.semesterstunden, 1) AS "stunden",
TRUNC(lema.semesterstunden, 2) AS "stunden",
lema.stundensatz,
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag",
vertrag_id,
@@ -219,7 +219,7 @@ FROM
(SELECT
uid
FROM
public.tbl_benutzer JOIN public.tbl_mitarbeiter ma
public.tbl_benutzer JOIN public.tbl_mitarbeiter ma
ON tbl_benutzer.uid = ma.mitarbeiter_uid
WHERE
person_id = tmp_projektbetreuung.person_id
@@ -272,7 +272,7 @@ FROM
pa.lehreinheit_id,
lv.lehrveranstaltung_id,
lv.bezeichnung AS "lv_bezeichnung",
pa.projektarbeit_id AS "projektarbeit_id",
pa.projektarbeit_id::text AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
@@ -414,7 +414,7 @@ $filterWidgetArray = array(
row_index: {visible: false},
personalnummer: {visible: false, headerFilter:"input"},
auftrag: {
headerFilter:"input", widthGrow: 2,
headerFilter:"input", widthGrow: 2,
bottomCalc:"count", bottomCalcFormatter:function(cell){return "'. ucfirst($this->p->t('global', 'anzahl')). ': " + cell.getValue();}
},
stg_typ_kurzbz: {headerFilter:"input"},
@@ -432,9 +432,9 @@ $filterWidgetArray = array(
person_id: {visible: false, headerFilter:"input"},
lv_oe_kurzbz: {headerFilter:"input"},
lektor: {headerFilter:"input", widthGrow: 2},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:2},
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}},
bottomCalc:"sum", bottomCalcParams:{precision:2}},
stundensatz: {visible: true, align:"right", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
+10 -3
View File
@@ -9,7 +9,6 @@
'jqueryui1' => true,
'ajaxlib' => true,
'tablesorter2' => true,
'tinymce4' => true,
'sbadmintemplate3' => true,
'addons' => true,
'navigationwidget' => true,
@@ -126,10 +125,18 @@
</table>
</div>
<div class="col-lg-4 table-responsive">
<form action="<?php echo base_url('soap/datenverbund_client.php?action=pruefeBPK');?>" method="POST" target="_blank">
<form
action="<?php echo base_url('soap/datenverbund_client.php?action=pruefeBPK');?>"
method="POST"
target="_blank"
>
<input type="hidden" name="vorname" value="<?php echo $stammdaten->vorname; ?>"/>
<input type="hidden" name="nachname" value="<?php echo $stammdaten->nachname; ?>"/>
<input type="hidden" name="geburtsdatum" value="<?php echo mb_str_replace('-', '',$stammdaten->gebdatum); ?>"/>
<input
type="hidden"
name="geburtsdatum"
value="<?php echo mb_str_replace('-', '', $stammdaten->gebdatum); ?>"
/>
<input type="hidden" name="geschlecht" value="<?php echo mb_strtoupper($stammdaten->geschlecht); ?>"/>
<input type="submit" value="Namenssuche starten" class="btn btn-default"/>
</form>
@@ -31,21 +31,35 @@ $query = '
ORDER BY l.log_id DESC
LIMIT 1
)
AND '. $LOGDATA_VON .' = (
AND ('. $LOGDATA_VON .' = (
SELECT l.insertvon
FROM system.tbl_log l
WHERE l.person_id = p.person_id
ORDER BY l.log_id DESC
LIMIT 1
)
OR
(
(
SELECT l.insertvon
FROM system.tbl_log l
WHERE l.person_id = p.person_id
ORDER BY l.log_id DESC
LIMIT 1
) IS NULL
)
)
AND l.zeitpunkt >= pss.insertamum
ORDER BY l.log_id DESC
LIMIT 1
) AS "Nachricht",
(
SELECT SUM(konto.betrag)
SELECT
CASE
WHEN COUNT(CASE WHEN konto.betrag != 0 THEN 1 END) = 0 THEN null
ELSE SUM(konto.betrag)
END AS "Kaution"
FROM public.tbl_konto konto
LEFT JOIN tbl_konto skonto ON (skonto.buchungsnr_verweis = konto.buchungsnr)
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
@@ -292,9 +292,12 @@
rueck.datum_bis AS "HoldDate",
rueck.bezeichnung AS "Rueckstellgrund",
(
SELECT SUM(konto.betrag)
SELECT
CASE
WHEN COUNT(CASE WHEN konto.betrag != 0 THEN 1 END) = 0 THEN null
ELSE SUM(konto.betrag)
END AS "Kaution"
FROM public.tbl_konto konto
LEFT JOIN tbl_konto skonto ON (skonto.buchungsnr_verweis = konto.buchungsnr)
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
@@ -8,7 +8,7 @@
'dialoglib' => true,
'ajaxlib' => true,
'tablesorter2' => true,
'tinymce4' => true,
'tinymce5' => true,
'sbadmintemplate3' => true,
'addons' => true,
'navigationwidget' => true,
@@ -267,9 +267,12 @@ $query = '
LIMIT 1
) AS "AktenId",
(
SELECT SUM(konto.betrag)
SELECT
CASE
WHEN COUNT(CASE WHEN konto.betrag != 0 THEN 1 END) = 0 THEN null
ELSE SUM(konto.betrag)
END AS "Kaution"
FROM public.tbl_konto konto
LEFT JOIN tbl_konto skonto ON (skonto.buchungsnr_verweis = konto.buchungsnr)
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
@@ -198,7 +198,11 @@ $query = '
LIMIT 1
) AS "InfoCenterMitarbeiter",
(
SELECT SUM(konto.betrag)
SELECT
CASE
WHEN COUNT(CASE WHEN konto.betrag != 0 THEN 1 END) = 0 THEN null
ELSE SUM(konto.betrag)
END AS "Kaution"
FROM public.tbl_konto konto
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
@@ -10,7 +10,7 @@
'dialoglib' => true,
'ajaxlib' => true,
'tablesorter2' => true,
'tinymce4' => true,
'tinymce5' => true,
'sbadmintemplate3' => true,
'addons' => true,
'navigationwidget' => true,
@@ -131,7 +131,11 @@
<?php echo $this->p->t('infocenter', 'zgvNichtErfuellt') ?>
</button>
<?php if ($studiengang_typ === 'm') : ?>
<button type="button" class="btn btn-default zgvAkzeptierenPruefung" id="zgvAkzeptierenPruefung_<?php echo $prestudent_id ?>">
<button
type="button"
class="btn btn-default zgvAkzeptierenPruefung"
id="zgvAkzeptierenPruefung_<?php echo $prestudent_id ?>"
>
<?php echo $this->p->t('infocenter', 'zgvErfuelltPruefung') ?>
</button>
<?php endif; ?>
@@ -447,7 +447,6 @@
<div class="form-inline">
<div class="input-group" id="absgstatusgrselect_<?php echo $zgvpruefung->prestudent_id ?>">
<select name="absgstatusgrund"
<?php echo $disabledStg ?>
<?php echo $disabledPer ?>
class="d-inline float-right"
required>
@@ -460,7 +459,7 @@
</select>
<span class="input-group-btn">
<button type="button"
class="btn btn-default absageBtn" <?php echo $disabledStg . ' ' . $disabledPer?> id="absagebtn_<?php echo $zgvpruefung->prestudent_id ?>">
class="btn btn-default absageBtn" <?php echo $disabledPer?> id="absagebtn_<?php echo $zgvpruefung->prestudent_id ?>">
<?php echo $this->p->t('ui', 'absagen') ?>
</button>
</span>
@@ -0,0 +1,197 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Write a new message or reply using templates',
'jquery3' => true,
'jqueryui1' => true,
'bootstrap3' => true,
'ajaxlib' => true,
'fontawesome4' => true,
'tinymce3' => true,
'sbadmintemplate3' => true,
'dialoglib' => true,
'widgets' => true,
'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/fasMessageWrite.js')
)
);
?>
<body>
<div id="wrapper">
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
<?php echo ucfirst($this->p->t('ui', 'nachrichtSenden')); ?>
</h3>
</div>
</div>
<form id="sendForm" method="post" action="<?php echo site_url('/system/messages/Messages/sendImplicitTemplate'); ?>">
<div class="row">
<div class="form-group">
<div class="col-lg-1 msgfieldcol-left">
<label>
<?php echo ucfirst($this->p->t('global', 'empfaenger')); ?>:
</label>
</div>
<div class="col-lg-11 msgfieldcol-right">
<?php echo $recipientsList; ?>
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-lg-1 msgfield msgfieldcol-left">
<label>
<?php echo ucfirst($this->p->t('global', 'betreff')); ?>:
</label>
</div>
&nbsp;
<div class="col-lg-7">
<input id="subject" class="form-control" type="text" value="<?php echo $subject; ?>" name="subject">
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-lg-9">
<label>
<?php echo ucfirst($this->p->t('global', 'nachricht')); ?>:
</label>
<textarea id="bodyTextArea" class="bodyTextArea" name="body">
<?php echo $body; ?>
</textarea>
</div>
<div class="col-lg-3">
<div class="form-group">
<label>
<?php echo ucfirst($this->p->t('ui', 'felder')); ?>:
</label>
<?php
$size = count($variables) > 19 ? 19 : count($variables);
echo $this->widgetlib->widget(
'MultipleDropdown_widget',
array('elements' => success($variables)),
array(
'name' => 'variables[]',
'id' => 'variables',
'size' => $size,
'multiple' => true
)
);
?>
</div>
<br>
<div class="form-group">
<label>
<?php echo ucfirst($this->p->t('ui', 'meineFelder')); ?>:
</label>
<?php
$size = count($user_fields) > 5 ? 5 : count($user_fields);
echo $this->widgetlib->widget(
'MultipleDropdown_widget',
array('elements' => success($user_fields)),
array(
'name' => 'user_fields[]',
'id' => 'user_fields',
'size' => $size,
'multiple' => true
)
);
?>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-xs-3">
<?php
echo $this->widgetlib->widget(
'Vorlage_widget',
array('oe_kurzbz' => $organisationUnits, 'isAdmin' => $senderIsAdmin),
array('name' => 'vorlage', 'id' => 'vorlageDnD')
);
?>
</div>
<div class="col-xs-6">
<button id="sendButton" class="btn btn-default pull-right" type="button">
<?php echo $this->p->t('ui', 'senden'); ?>
</button>
</div>
</div>
<br>
<hr>
<div class="row">
<div class="col-lg-12">
<label>
<?php echo ucfirst($this->p->t('global', 'vorschau')); ?>:
</label>
</div>
</div>
<div class="well" id="templatePreviewDiv">
<div class="row">
<div class="col-sm-12" style="display: inline">
<div class="form-group form-inline">
<div class="input-group">
<?php
echo $this->widgetlib->widget(
'Dropdown_widget',
array(
'elements' => success($recipientsArray),
'emptyElement' => ucfirst($this->p->t('global', 'empfaenger')).'...'
),
array(
'name' => 'recipients[]',
'id' => 'recipients'
)
);
?>
<span class="input-group-btn">
<a class="btn btn-default" href="#templatePreviewDiv" id="refresh">
<?php echo ucfirst($this->p->t('ui', 'refresh')); ?>
</a>
</span>
</div>
</div>
</div>
</div>
<br>
<textarea id="tinymcePreview" class="tinymcePreview"></textarea>
</div>
<?php echo $recipients_ids; ?>
<?php echo $relationmessage_id; ?>
<?php echo $type; ?>
</form>
</div>
</div>
</div>
</body>
<?php $this->load->view("templates/FHC-Footer"); ?>
@@ -12,7 +12,7 @@
'tabulator4' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tinymce4' => true,
'tinymce5' => true,
'phrases' => array('global', 'ui'),
'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/read.js')
@@ -10,7 +10,7 @@
'sbadmintemplate3' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tinymce4' => true,
'tinymce5' => true,
'phrases' => array('global', 'ui'),
'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/write.js')
@@ -10,7 +10,7 @@
'sbadmintemplate3' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tinymce4' => true,
'tinymce5' => true,
'phrases' => array('global', 'ui'),
'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/writeReply.js')
@@ -6,7 +6,7 @@
'jquery3' => true,
'bootstrap3' => true,
'fontawesome4' => true,
'tinymce4' => true,
'tinymce5' => true,
'sbadmintemplate3' => true,
'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/messageWriteReply.js')
@@ -8,7 +8,7 @@
'bootstrap3' => true,
'ajaxlib' => true,
'fontawesome4' => true,
'tinymce4' => true,
'tinymce5' => true,
'sbadmintemplate3' => true,
'dialoglib' => true,
'widgets' => true,
@@ -1,5 +1,5 @@
<?php
$this->load->view('templates/header', array('title' => 'VorlageEdit', 'tinymce4' => true, 'jsonforms' => true));
$this->load->view('templates/header', array('title' => 'VorlageEdit', 'tinymce5' => true, 'jsonforms' => true));
?>
<div class="row">
+1 -1
View File
@@ -23,7 +23,7 @@
$tablesorter2 = isset($tablesorter2) ? $tablesorter2 : false;
$tabulator4 = isset($tabulator4) ? $tabulator4 : false;
$tabulator5 = isset($tabulator5) ? $tabulator5 : false;
$tinymce4 = isset($tinymce4) ? $tinymce4 : false;
$tinymce3 = isset($tinymce3) ? $tinymce3 : false;
$tinymce5 = isset($tinymce5) ? $tinymce5 : false;
$vue3 = isset($vue3) ? $vue3 : false;
$primevue3 = isset($primevue3) ? $primevue3 : false;
+3 -3
View File
@@ -100,14 +100,14 @@
// Tabulator 5 JS
if ($tabulator5 === true) generateJSsInclude('vendor/olifolkerd/tabulator5/dist/js/tabulator.min.js');
// Tinymce 4 JS
if ($tinymce4 === true) generateJSsInclude('vendor/tinymce/tinymce4/tinymce.min.js');
// Tinymce 3 JS
if ($tinymce3 === true) generateJSsInclude('include/tiny_mce/tiny_mce.js');
// Tinymce 5 JS
if ($tinymce5 === true) generateJSsInclude('vendor/tinymce/tinymce5/tinymce.min.js');
// Vue 3 JS
if ($vue3 === true)
if ($vue3 === true)
{
generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js');
generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js');
+1 -4
View File
@@ -77,10 +77,7 @@
}
// Tabulator 5 CSS
if ($tabulator5 === true) generateCSSsInclude('vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css');
// Tinymce 4 CSS
if ($tinymce4 === true) generateCSSsInclude('public/css/TinyMCE4.css');
if ($tabulator5 === true) generateCSSsInclude('public/css/Tabulator5.css');
// Tinymce 5 CSS
if ($tinymce5 === true) generateCSSsInclude('public/css/TinyMCE5.css');
+1 -1
View File
@@ -95,7 +95,7 @@ if($jqueryV1 && $jqueryV2) show_error("Two JQuery versions used: composer and in
<?php endif ?>
<?php if($tinymce) : ?>
<script type="text/javascript" src="<?php echo base_url('vendor/tinymce/tinymce4/tinymce.min.js');?>"></script>
<script type="text/javascript" src="<?php echo base_url('vendor/tinymce/tinymce5/tinymce.min.js');?>"></script>
<?php endif ?>
<?php if($textile) : ?>
+3 -2
View File
@@ -5,5 +5,6 @@
plugins: [<?php echo $plugins; ?>],
toolbar: "<?php echo $toolbar; ?>"
});
</script>
<<?=$selector?> name="<?=$name?>" style="<?=$style?>"><?=$text?></<?=$selector?>>
</script>
<<?=$selector?> name="<?=$name?>" style="<?=$style?>"><?=$text?></<?=$selector?>>
+3 -3
View File
@@ -121,15 +121,15 @@ echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<td><input type="text" name="sprache" id="sprache" value="'.$db->convert_html_chars($row_zd->sprache).'" size="10" maxlength="8" readonly="readonly"></td>
</tr>
<tr>
<td width="30%"><b>'.$p->t('abgabetool/kontrollierteSchlagwoerter').':*</b></td>
<td width="30%"><b>'.$p->t('abgabetool/kontrollierteSchlagwoerter').':</b></td>
<td width="40%"><input type="text" name="kontrollschlagwoerter" id="kontrollschlagwoerter" value="'.$db->convert_html_chars($row_zd->kontrollschlagwoerter).'" size="60" maxlength="150" readonly="readonly"></td>
</tr>
<tr>
<td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').': </b></td>
<td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').':* </b></td>
<td><input type="text" name="schlagwoerter" value="'.$db->convert_html_chars($row_zd->schlagwoerter).'" size="60" maxlength="150" readonly="readonly"></td>
</tr>
<tr>
<td><b>'.$p->t('abgabetool/englischeSchlagwoerter').': </b></td>
<td><b>'.$p->t('abgabetool/englischeSchlagwoerter').':* </b></td>
<td><input type="text" name="schlagwoerter_en" value="'.$db->convert_html_chars($row_zd->schlagwoerter_en).'" size="60" maxlength="150" readonly="readonly"></td>
</tr>
<tr>
-1
View File
@@ -124,7 +124,6 @@ $sql_query = "SELECT (SELECT nachname FROM public.tbl_person WHERE person_id=tb
AND tbl_projektarbeit.student_uid=".$db->db_add_param($uid)."
ORDER BY studiensemester_kurzbz desc, tbl_lehrveranstaltung.kurzbz";
//AND tbl_projektarbeit.student_uid='$getuid' 'ie07m102';
if(!$erg=$db->db_query($sql_query))
{
$errormsg=$p->t('global/fehlerBeimLesenAusDatenbank');
+8 -31
View File
@@ -64,7 +64,6 @@ if(!isset($_POST['uid']))
$fixtermin = false;
$datum = '01.01.1980';
$kurzbz = '';
$kontrollschlagwoerter = '';
$schlagwoerter = '';
$schlagwoerter_en = '';
$abstract = '';
@@ -88,7 +87,6 @@ else
$kurzbz = (isset($_POST['kurzbz'])?$_POST['kurzbz']:'');
$betreuer = (isset($_POST['betreuer'])?$_POST['betreuer']:'-1');
$sprache = (isset($_POST['sprache'])?$_POST['sprache']:'German');
$kontrollschlagwoerter = (isset($_POST['kontrollschlagwoerter'])?$_POST['kontrollschlagwoerter']:'-1');
$schlagwoerter = (isset($_POST['schlagwoerter'])?$_POST['schlagwoerter']:'-1');
$schlagwoerter_en = (isset($_POST['schlagwoerter_en'])?$_POST['schlagwoerter_en']:'-1');
$abstract = (isset($_POST['abstract'])?$_POST['abstract']:'-1');
@@ -211,23 +209,7 @@ if($command=='add')
{
//zusätzliche Daten bearbeiten
//Check der Eingabedaten
if(strlen($kontrollschlagwoerter)<1)
{
$error=true;
}
if(mb_strlen($kontrollschlagwoerter)>=150)
{
$kontrollschlagwoerter = mb_substr($kontrollschlagwoerter, 0, 146).'...';
}
if(strlen($abstract)<1)
{
$error=true;
}
if(strlen($abstract_en)<1)
{
$error=true;
}
if($seitenanzahl<1)
if((strlen($schlagwoerter) < 1) || (strlen($schlagwoerter_en) < 1) || (strlen($abstract) < 1) || (strlen($abstract_en) < 1) || ($seitenanzahl < 1))
{
$error=true;
}
@@ -237,7 +219,6 @@ if($command=='add')
seitenanzahl = ".$db->db_add_param($seitenanzahl).",
abgabedatum = now(),
sprache = ".$db->db_add_param($sprache).",
kontrollschlagwoerter = ".$db->db_add_param($kontrollschlagwoerter).",
schlagwoerter_en = ".$db->db_add_param($schlagwoerter_en).",
schlagwoerter = ".$db->db_add_param($schlagwoerter).",
abstract = ".$db->db_add_param($abstract).",
@@ -413,19 +394,16 @@ if($command=="update" && $error!=true)
$htmlstr .= "</SELECT> \n";
}
$htmlstr .= "</td></tr>\n";
$htmlstr .= '<tr><td width="30%"><b>'.$p->t('abgabetool/kontrollierteSchlagwoerter').':*</b></td>
<td width="40%"><input type="text" name="kontrollschlagwoerter" id="kontrollschlagwoerter" value="'.$db->convert_html_chars($kontrollschlagwoerter).'" size="60" maxlength="150"></td>
<td width="30%" align="left"><input type="button" name="SWD" value=" SWD " onclick="window.open(\'swd.php\')"></td></tr>'."\n";
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').':</b></td>
<td><input type="text" name="schlagwoerter" value="'.$db->convert_html_chars($schlagwoerter).'" size="60" maxlength="150"></td></tr>'."\n";
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/englischeSchlagwoerter').':</b></td>
<td><input type="text" name="schlagwoerter_en" value="'.$db->convert_html_chars($schlagwoerter_en).'" size="60" maxlength="150"></td></tr>'."\n";
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').':*</b></td>
<td><input type="text" name="schlagwoerter" value="'.$db->convert_html_chars($schlagwoerter).'" size="60" maxlength="150" required></td></tr>'."\n";
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/englischeSchlagwoerter').':*</b></td>
<td><input type="text" name="schlagwoerter_en" value="'.$db->convert_html_chars($schlagwoerter_en).'" size="60" maxlength="150" required></td></tr>'."\n";
$htmlstr .= '<tr><td valign="top"><b>'.$p->t('abgabetool/abstract').' </b>'.$p->t('abgabetool/maxZeichen').':*</td>
<td><textarea name="abstract" cols="46" rows="7">'.$db->convert_html_chars($abstract).'</textarea></td></tr>'."\n";
<td><textarea name="abstract" cols="46" rows="7" required>'.$db->convert_html_chars($abstract).'</textarea></td></tr>'."\n";
$htmlstr .= '<tr><td valign="top"><b>'.$p->t('abgabetool/abstractEng').'</b>'.$p->t('abgabetool/maxZeichen').':*</td>
<td><textarea name="abstract_en" cols="46" rows="7">'.$db->convert_html_chars($abstract_en).'</textarea></td></tr>'."\n";
<td><textarea name="abstract_en" cols="46" rows="7" required>'.$db->convert_html_chars($abstract_en).'</textarea></td></tr>'."\n";
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/seitenanzahl').':*</b></td>
<td><input type="text" name="seitenanzahl" value="'.$db->convert_html_chars($seitenanzahl).'" size="5" maxlength="4"></td></tr>'."\n";
<td><input type="text" name="seitenanzahl" value="'.$db->convert_html_chars($seitenanzahl).'" size="5" maxlength="4" required></td></tr>'."\n";
$htmlstr .="<tr><td>&nbsp;</td></tr>\n";
// If there are info about the signed document
@@ -657,7 +635,6 @@ if($command!="add")
$htmlstr .= '<input type="hidden" name="uid" value="'.$db->convert_html_chars($uid).'">'."\n";
$htmlstr .= '<input type="hidden" name="betreuer" value="'.$db->convert_html_chars($betreuer).'">'."\n";
$htmlstr .= '<input type="hidden" name="command" value="update">'."\n";
$htmlstr .= '<input type="hidden" name="kontrollschlagwoerter" value="'.$db->convert_html_chars($kontrollschlagwoerter).'">'."\n";
$htmlstr .= '<input type="hidden" name="schlagwoerter" value="'.$db->convert_html_chars($schlagwoerter).'">'."\n";
$htmlstr .= '<input type="hidden" name="schlagwoerter_en" value="'.$db->convert_html_chars($schlagwoerter_en).'">'."\n";
$htmlstr .= '<input type="hidden" name="abstract" value="'.$db->convert_html_chars($abstract).'">'."\n";
-11
View File
@@ -1,11 +0,0 @@
<?php
$url = "https://ognd.bsz-bw.de/";
$zielfeld = "kontrollschlagwoerter";
$url = $url."?zielfeld=".$zielfeld;
header('Content-Type: text/html; charset=utf-8');
$content = file_get_contents($url);
if($content)
print $content;
else
echo "Der Schlagwortdienst ist derzeit nicht erreichbar. Bitte füllen Sie die Schlagwörter manuell aus um den Upload abzuschließen";
?>
+63 -40
View File
@@ -79,7 +79,12 @@ else if (defined('CIS_ZEITAUFZEICHNUNG_GESPERRT_BIS') && CIS_ZEITAUFZEICHNUNG_GE
else
$gesperrt_bis = '2015-08-31';
//echo $gesperrt_bis;
//Default-Wert für Max-Intervall in Tagen für Zeitsperre, über Config veränderbar
$maxDauerZS = 730;
if (defined('CIS_ZEITSPERREN_MAX_DAUER') && CIS_ZEITSPERREN_MAX_DAUER != '') {
$maxDauerZS = CIS_ZEITSPERREN_MAX_DAUER;
}
//Stundentabelleholen
if(! $result_stunde=$db->db_query("SELECT * FROM lehre.tbl_stunde ORDER BY stunde"))
@@ -204,66 +209,72 @@ function berechnen()
function checkdatum()
{
if(document.getElementById('vondatum').value.length<10)
if (document.getElementById('vondatum').value.length < 10)
{
alert('<?php echo $p->t('zeitsperre/vonDatumIstUngueltigNullenAngeben');?>');
return false;
}
if(document.getElementById('bisdatum').value.length<10)
if (document.getElementById('bisdatum').value.length < 10)
{
alert('<?php echo $p->t('zeitsperre/bisDatumIstUngueltigNullenAngeben');?>');
return false;
}
var Datum, Tag, Monat,Jahr,vonDatum,bisDatum, diff;
var Datum, Tag, Monat, Jahr, vonDatum, bisDatum, vonDatumDate, bisDatumDate, diff, diffTime, diffmax;
Datum=document.getElementById('vondatum').value;
Tag=Datum.substring(0,2);
Monat=Datum.substring(3,5);
if (parseInt(Monat,10)<1 || parseInt(Monat,10)>12)
{
alert('<?php echo $p->t('zeitsperre/vonDatumMonat');?>'+ document.getElementById('vondatum').value+ ' <?php echo $p->t('zeitsperre/istNichtRichtig');?>.');
Datum = document.getElementById('vondatum').value;
Tag = Datum.substring(0, 2);
Monat = Datum.substring(3, 5);
if (parseInt(Monat, 10) < 1 || parseInt(Monat, 10) > 12)
{
alert('<?php echo $p->t('zeitsperre/vonDatumMonat');?>' + document.getElementById('vondatum').value + ' <?php echo $p->t('zeitsperre/istNichtRichtig');?>.');
document.getElementById('vondatum').focus();
return false;
}
return false;
}
Jahr=Datum.substring(6,10);
Jahr = Datum.substring(6, 10);
vonDatum=Jahr+''+Monat+''+Tag;
vonDatum = Jahr + '' + Monat + '' + Tag;
vonDatumDate = Jahr + '-' + Monat + '-' + Tag;
Datum=document.getElementById('bisdatum').value;
Tag=Datum.substring(0,2);
Monat=Datum.substring(3,5);
if (parseInt(Monat,10)<1 || parseInt(Monat,10)>12)
{
alert('<?php echo $p->t('zeitsperre/bisDatumMonat');?>'+ document.getElementById('bisdatum').value+ ' <?php echo $p->t('zeitsperre/istNichtRichtig');?>.');
Datum = document.getElementById('bisdatum').value;
Tag = Datum.substring(0, 2);
Monat = Datum.substring(3, 5);
if (parseInt(Monat, 10) < 1 || parseInt(Monat, 10) > 12) {
alert('<?php echo $p->t('zeitsperre/bisDatumMonat');?>' + document.getElementById('bisdatum').value + ' <?php echo $p->t('zeitsperre/istNichtRichtig');?>.');
document.getElementById('bisdatum').focus();
return false;
}
return false;
}
Jahr=Datum.substring(6,10);
Jahr = Datum.substring(6, 10);
bisDatum = Jahr + '' + Monat + '' + Tag;
bisDatumDate = Jahr + '-' + Monat + '-' + Tag;
bisDatum=Jahr+''+Monat+''+Tag;
bisDatumDate = new Date(bisDatumDate);
vonDatumDate = new Date(vonDatumDate);
diff=bisDatum-vonDatum;
diffTime = bisDatumDate.getTime() - vonDatumDate.getTime();
diff = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
diffmax = <?php echo $maxDauerZS ;?>
if (vonDatum>bisDatum)
{
alert('<?php echo $p->t('zeitsperre/vonDatum');?> '+ document.getElementById('vondatum').value+ ' <?php echo $p->t('zeitsperre/istGroesserAlsBisDatum');?> '+document.getElementById('bisdatum').value);
if (vonDatum > bisDatum) {
alert('<?php echo $p->t('zeitsperre/vonDatum');?> ' + document.getElementById('vondatum').value + ' <?php echo $p->t('zeitsperre/istGroesserAlsBisDatum');?> ' + document.getElementById('bisdatum').value);
document.getElementById('vondatum').focus();
return false;
}
else if (diff>14)
{
Check = confirm('<?php echo $p->t('zeitaufzeichnung/zeitraumAuffallendHoch');?>');
return false;
}
else if (diff > 14 && diff < diffmax) {
Check = confirm('<?php echo $p->t('zeitaufzeichnung/zeitraumAuffallendHoch');?>');
document.getElementById('bisdatum').focus();
if (Check == false)
return false;
else
return true;
}
if (Check == false)
return false;
else
return true;
} else if (diff >= diffmax) {
alert('<?php echo $p->t('zeitsperre/bisDatumGroesserMax');?> ');
document.getElementById('bisdatum').focus();
return false;
}
return true;
}
@@ -445,7 +456,8 @@ if(isset($_GET['type']) && ($_GET['type']=='edit_sperre' || $_GET['type']=='new_
$date=explode('.',$_POST['bisdatum']);
if (@checkdate($date[1], $date[0], $date[2]))
{
$bisdatum=$date[2].$date[1].$date[0];
$bisdatum=$date[2].$date[1].$date[0];
$bisdatum_iso = $date[2].'-'.$date[1].'-'.$date[0];
}
else
{
@@ -464,6 +476,17 @@ if(isset($_GET['type']) && ($_GET['type']=='edit_sperre' || $_GET['type']=='new_
$error_msg .= $p->t('zeitsperre/vonDatumGroesserAlsBisDatum').'! ';
}
//check if bis-Datum zu weit in der Zukunft
$bis = new DateTime($bisdatum);
$von = new DateTime($vondatum);
$intervall = $bis->diff($von);
if ($intervall->days >= $maxDauerZS)
{
$error=true;
$error_msg = $p->t('zeitsperre/bisDatumGroesserMax');
}
//von-datum pruefen TODO
if($vondatum_iso < $gesperrt_bis && in_array($_POST['zeitsperretyp_kurzbz'],$typen_arr))
{
+16 -1
View File
@@ -229,6 +229,21 @@ $( document ).ready(function()
</script>
';
echo <<<EOSBJS
<script>
$(document).ready(function() {
const scrollDiv = document.createElement('div');
scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
document.body.appendChild(scrollDiv);
const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
document.body.removeChild(scrollDiv);
var marginright = Math.max((20 - scrollbarWidth), 0);
document.body.style.setProperty('width', 'calc(100% - ' + marginright + 'px)');
});
</script>
EOSBJS;
echo '
<script type="text/javascript">
$(document).ready(function()
@@ -1621,7 +1636,7 @@ if ($projekt->getProjekteMitarbeiter($user, true))
<td '.$style.' align="right"><b>'.$tagessaldo.$erstr.'</b><br>'.date('H:i', ($pausesumme-3600)).'</td>
<td '.$style.' colspan="3" align="right">';
if ($tag > $sperrdatum)
echo '<a href="?von_datum='.$datum->formatDatum($tag,'d.m.Y').'&bis_datum='.$datum->formatDatum($tag,'d.m.Y').'" class="item">&lt;-</a>';
echo '<a href="?von_datum='.$datum->formatDatum($tag,'d.m.Y').'&bis_datum='.$datum->formatDatum($tag,'d.m.Y').'" class="item">&larr;</a>';
echo '</td></tr>';
-8
View File
@@ -126,10 +126,6 @@ if (isset($_REQUEST['prestudent']))
$rt->getReihungstestPerson($ps->person_id);
if (isset($rt->result[0]))
$reihungstest_id = $rt->result[0]->reihungstest_id;
else
{
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestKannNichtGeladenWerden').'</div>';
}
}
else
{
@@ -138,10 +134,6 @@ if (isset($_REQUEST['prestudent']))
// TODO Was ist wenn da mehrere Zurueckkommen?!
if (isset($rt->result[0]))
$reihungstest_id = $rt->result[0]->reihungstest_id;
else
{
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestKannNichtGeladenWerden').'</div>';
}
}
else
{
+27 -39
View File
@@ -26,28 +26,6 @@
"wiki": "https://wiki.fhcomplete.info/doku.php"
},
"repositories": [
{
"type": "package",
"package": {
"name": "vuepic/vue-datepicker-js",
"version": "4.0.0",
"dist": {
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/vue-datepicker.iife.js",
"type": "file"
}
}
},
{
"type": "package",
"package": {
"name": "vuepic/vue-datepicker-css",
"version": "4.0.0",
"dist": {
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/main.css",
"type": "file"
}
}
},
{
"type": "package",
"package": {
@@ -252,9 +230,9 @@
"type": "package",
"package": {
"name": "olifolkerd/tabulator5",
"version": "5.2.1",
"version": "5.5.2",
"dist": {
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.2.1.zip",
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.5.2.zip",
"type": "zip"
}
}
@@ -292,17 +270,6 @@
}
}
},
{
"type": "package",
"package": {
"name": "tinymce/tinymce4",
"version": "4.9.11",
"dist": {
"url": "https://github.com/tinymce/tinymce-dist/archive/refs/tags/4.9.11.zip",
"type": "zip"
}
}
},
{
"type": "package",
"package": {
@@ -370,6 +337,28 @@
}
}
},
{
"type": "package",
"package": {
"name": "vuejs/vuedatepicker_js",
"version": "5.4.0",
"dist": {
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/vue-datepicker.iife.js",
"type": "file"
}
}
},
{
"type": "package",
"package": {
"name": "vuejs/vuedatepicker_css",
"version": "5.4.0",
"dist": {
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/main.css",
"type": "file"
}
}
},
{
"type": "composer",
"url": "https://asset-packagist.org"
@@ -426,7 +415,7 @@
"npm-asset/primeicons": "5.0.0",
"olifolkerd/tabulator4": "4.9.*",
"olifolkerd/tabulator5": "5.2.*",
"olifolkerd/tabulator5": "5.5.*",
"phpseclib/phpseclib": "2.0.*",
@@ -435,7 +424,6 @@
"scottjehl/respond": "1.4.2",
"tapmodo/jcrop": "2.0.4",
"tinymce/tinymce4": "4.9.*",
"tinymce/tinymce5": "5.10.*",
"tomazdragar/simplecropper": "1.0",
"twbs/bootstrap3": "3.4.*",
@@ -443,8 +431,8 @@
"vuejs/vuejs3": "3.2.33",
"vuejs/vuerouter4": "4.1.3",
"vuepic/vue-datepicker-js": "4.*",
"vuepic/vue-datepicker-css": "4.*"
"vuejs/vuedatepicker_js": "5.4.0",
"vuejs/vuedatepicker_css": "5.4.0"
},
"config": {
"bin-dir": "vendor/bin"
Generated
+73 -68
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "1105a07a83f98040eedbe34b23e11ee3",
"content-hash": "728ac4542ac39ac1efbcea15134a81f9",
"packages": [
{
"name": "afarkas/html5shiv",
@@ -614,16 +614,16 @@
},
{
"name": "components/jquery",
"version": "3.6.0",
"version": "v3.7.1",
"source": {
"type": "git",
"url": "https://github.com/components/jquery.git",
"reference": "6cf38ee1fd04b6adf8e7dda161283aa35be818c3"
"reference": "8edc7785239bb8c2ad2b83302b856a1d61de60e7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/components/jquery/zipball/6cf38ee1fd04b6adf8e7dda161283aa35be818c3",
"reference": "6cf38ee1fd04b6adf8e7dda161283aa35be818c3",
"url": "https://api.github.com/repos/components/jquery/zipball/8edc7785239bb8c2ad2b83302b856a1d61de60e7",
"reference": "8edc7785239bb8c2ad2b83302b856a1d61de60e7",
"shasum": ""
},
"type": "component",
@@ -659,7 +659,7 @@
"source": "https://github.com/jquery/jquery",
"wiki": "http://docs.jquery.com/"
},
"time": "2021-03-20T19:13:42+00:00"
"time": "2023-09-22T01:43:46+00:00"
},
{
"name": "components/jqueryui",
@@ -1511,25 +1511,25 @@
},
{
"name": "olifolkerd/tabulator5",
"version": "5.2.1",
"version": "5.5.2",
"dist": {
"type": "zip",
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.2.1.zip"
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.5.2.zip"
},
"type": "library"
},
{
"name": "phpseclib/phpseclib",
"version": "2.0.44",
"version": "2.0.45",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
"reference": "149f608243f8133c61926aae26ce67d2b22b37e5"
"reference": "28d8f438a0064c9de80857e3270d071495544640"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/149f608243f8133c61926aae26ce67d2b22b37e5",
"reference": "149f608243f8133c61926aae26ce67d2b22b37e5",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/28d8f438a0064c9de80857e3270d071495544640",
"reference": "28d8f438a0064c9de80857e3270d071495544640",
"shasum": ""
},
"require": {
@@ -1610,7 +1610,7 @@
],
"support": {
"issues": "https://github.com/phpseclib/phpseclib/issues",
"source": "https://github.com/phpseclib/phpseclib/tree/2.0.44"
"source": "https://github.com/phpseclib/phpseclib/tree/2.0.45"
},
"funding": [
{
@@ -1626,7 +1626,7 @@
"type": "tidelift"
}
],
"time": "2023-06-13T08:41:47+00:00"
"time": "2023-09-15T20:55:47+00:00"
},
{
"name": "rmariuzzo/jquery-checkboxes",
@@ -1734,15 +1734,6 @@
},
"type": "library"
},
{
"name": "tinymce/tinymce4",
"version": "4.9.11",
"dist": {
"type": "zip",
"url": "https://github.com/tinymce/tinymce-dist/archive/refs/tags/4.9.11.zip"
},
"type": "library"
},
{
"name": "tinymce/tinymce5",
"version": "5.10.3",
@@ -1848,6 +1839,24 @@
},
"time": "2020-02-11T05:59:23+00:00"
},
{
"name": "vuejs/vuedatepicker_css",
"version": "5.4.0",
"dist": {
"type": "file",
"url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/main.css"
},
"type": "library"
},
{
"name": "vuejs/vuedatepicker_js",
"version": "5.4.0",
"dist": {
"type": "file",
"url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/vue-datepicker.iife.js"
},
"type": "library"
},
{
"name": "vuejs/vuejs3",
"version": "3.2.33",
@@ -1865,24 +1874,6 @@
"url": "https://unpkg.com/vue-router@4.1.3/dist/vue-router.global.js"
},
"type": "library"
},
{
"name": "vuepic/vue-datepicker-css",
"version": "4.0.0",
"dist": {
"type": "file",
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/main.css"
},
"type": "library"
},
{
"name": "vuepic/vue-datepicker-js",
"version": "4.0.0",
"dist": {
"type": "file",
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/vue-datepicker.iife.js"
},
"type": "library"
}
],
"packages-dev": [
@@ -2025,16 +2016,16 @@
},
{
"name": "nikic/php-parser",
"version": "v4.16.0",
"version": "v4.18.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "19526a33fb561ef417e822e85f08a00db4059c17"
"reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17",
"reference": "19526a33fb561ef417e822e85f08a00db4059c17",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"shasum": ""
},
"require": {
@@ -2075,34 +2066,34 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0"
"source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0"
},
"time": "2023-06-25T14:52:30+00:00"
"time": "2023-12-10T21:03:43+00:00"
},
{
"name": "pdepend/pdepend",
"version": "2.14.0",
"version": "2.16.1",
"source": {
"type": "git",
"url": "https://github.com/pdepend/pdepend.git",
"reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1"
"reference": "66ceb05eaa8bf358574143c974b04463911bc700"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1",
"reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1",
"url": "https://api.github.com/repos/pdepend/pdepend/zipball/66ceb05eaa8bf358574143c974b04463911bc700",
"reference": "66ceb05eaa8bf358574143c974b04463911bc700",
"shasum": ""
},
"require": {
"php": ">=5.3.7",
"symfony/config": "^2.3.0|^3|^4|^5|^6.0",
"symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0",
"symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0"
"symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/polyfill-mbstring": "^1.19"
},
"require-dev": {
"easy-doc/easy-doc": "0.0.0|^1.2.3",
"gregwar/rst": "^1.0",
"phpunit/phpunit": "^4.8.36|^5.7.27",
"squizlabs/php_codesniffer": "^2.0.0"
},
"bin": [
@@ -2132,7 +2123,7 @@
],
"support": {
"issues": "https://github.com/pdepend/pdepend/issues",
"source": "https://github.com/pdepend/pdepend/tree/2.14.0"
"source": "https://github.com/pdepend/pdepend/tree/2.16.1"
},
"funding": [
{
@@ -2140,26 +2131,26 @@
"type": "tidelift"
}
],
"time": "2023-05-26T13:15:18+00:00"
"time": "2023-12-10T18:38:19+00:00"
},
{
"name": "phpmd/phpmd",
"version": "2.13.0",
"version": "2.15.0",
"source": {
"type": "git",
"url": "https://github.com/phpmd/phpmd.git",
"reference": "dad0228156856b3ad959992f9748514fa943f3e3"
"reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3",
"reference": "dad0228156856b3ad959992f9748514fa943f3e3",
"url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0",
"reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0",
"shasum": ""
},
"require": {
"composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0",
"ext-xml": "*",
"pdepend/pdepend": "^2.12.1",
"pdepend/pdepend": "^2.16.1",
"php": ">=5.3.9"
},
"require-dev": {
@@ -2168,8 +2159,7 @@
"ext-simplexml": "*",
"gregwar/rst": "^1.0",
"mikey179/vfsstream": "^1.6.8",
"phpunit/phpunit": "^4.8.36 || ^5.7.27",
"squizlabs/php_codesniffer": "^2.0"
"squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2"
},
"bin": [
"src/bin/phpmd"
@@ -2206,6 +2196,7 @@
"description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
"homepage": "https://phpmd.org/",
"keywords": [
"dev",
"mess detection",
"mess detector",
"pdepend",
@@ -2215,7 +2206,7 @@
"support": {
"irc": "irc://irc.freenode.org/phpmd",
"issues": "https://github.com/phpmd/phpmd/issues",
"source": "https://github.com/phpmd/phpmd/tree/2.13.0"
"source": "https://github.com/phpmd/phpmd/tree/2.15.0"
},
"funding": [
{
@@ -2223,7 +2214,7 @@
"type": "tidelift"
}
],
"time": "2022-09-10T08:44:15+00:00"
"time": "2023-12-11T08:22:20+00:00"
},
{
"name": "phpmetrics/phpmetrics",
@@ -2600,12 +2591,12 @@
"version": "3.6.2",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
"reference": "5e4e71592f69da17871dba6e80dd51bce74a351a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a",
"url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a",
"reference": "5e4e71592f69da17871dba6e80dd51bce74a351a",
"shasum": ""
},
@@ -2649,6 +2640,20 @@
"source": "https://github.com/squizlabs/PHP_CodeSniffer",
"wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
},
"funding": [
{
"url": "https://github.com/PHPCSStandards",
"type": "github"
},
{
"url": "https://github.com/jrfnl",
"type": "github"
},
{
"url": "https://opencollective.com/php_codesniffer",
"type": "open_collective"
}
],
"time": "2021-12-12T21:44:58+00:00"
},
{
-1
View File
@@ -294,5 +294,4 @@ define ('DEFAULT_ALLIN_DIENSTVERTRAG',[111]);
//Echter Dienstvertrag
define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,111]);
?>
+3
View File
@@ -47,6 +47,9 @@ define('CIS_PROFIL_STUDIENINFORMATION_ANZEIGEN',true);
// Zeitaufzeichnung gesperrt_bis Datum YYYY-MM-DD
define('CIS_ZEITAUFZEICHNUNG_GESPERRT_BIS','');
// maximale Dauer einer Zeitsperre in Tagen
define('CIS_ZEITSPERREN_MAX_DAUER', 730);
// Anzeige des Links zur Noteneingabe in der LVA Uebersicht
define('CIS_LVALISTE_NOTENEINGABE_ANZEIGEN',true);
+7 -1
View File
@@ -276,7 +276,13 @@ define('DOCSBOX_WAITING_SLEEP_TIME', 1);
// Bei folgenden Buchungstypen wird ein Anlegen geprüft ob bereits ein Eintrag für diesen Typ vorhanden ist im selben
// Semester und ggf ein Hinweis ausgegeben
define('FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK', serialize(
array('StudiengebuehrAnzahlung', 'Studiengebuehr', 'StudiengebuehrRestzahlung', 'OEH')
array(
'Studiengebuehr' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung', 'StudiengebuehrRestzahlung'),
'StudiengebuehrErhoeht' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung', 'StudiengebuehrRestzahlung'),
'StudiengebuehrAnzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung'),
'StudiengebuehrRestzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrRestzahlung'),
'OEH' => array('OEH')
))
));
// Spezialnoten die am Zeunigs und Diplomasupplement ignoriert werden
+49 -10
View File
@@ -74,6 +74,7 @@ require_once('../../include/reihungstest.class.php');
require_once('../../include/studienplan.class.php');
require_once('../../include/mobilitaet.class.php');
require_once('../../include/studienordnung.class.php');
require_once('../../include/bismeldestichtag.class.php');
$user = get_uid();
$db = new basis_db();
@@ -383,7 +384,7 @@ function isBuchungAllowedToChange($buchung_obj)
* @param $new_status_ausbildungssemester Ausbildungssemester des neuen/zu ändernen Status
* @param $old_status_studiensemester Studiensemester des alten Status, leer wenn neuer Status
* @param $old_status_ausbildungssemester Ausbildungssemester des alten Status, leer wenn neuer Status
* @return array
* @return array mit error = true und Fehlerbeschreibung wenn ungültig, andernfalls error = false
*/
function checkStatusaenderung(
$prestudent_id, $status_kurzbz, $new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester,
@@ -417,7 +418,7 @@ function checkStatusaenderung(
$studiensemester->load($new_status_studiensemester);
$new_status_semesterstart = new DateTime($studiensemester->start);
// Alle bisherigen prestudentstatus nach Datum sortiert
// Alle prestudentstatus nach Datum sortiert
$qry = "SELECT status_kurzbz, studiensemester_kurzbz, ausbildungssemester, datum, sem.start AS studiensemester_start
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz)
@@ -464,7 +465,7 @@ function checkStatusaenderung(
// Gültige Zeitabfolge, bestehenden Status hinzufügen
$statusArr[] = $row;
}
// oder Neuer/editierter Statuseintrag nach bestehendem Statuseintrag
// oder Neuer/editierter Statuseintrag vor bestehendem Statuseintrag
elseif ($new_status_datum <= $status_datum && $new_status_semesterstart <= $studiensemester_start)
{
// Gültige Zeitabfolge, bestehenden Status hinzufügen
@@ -475,8 +476,7 @@ function checkStatusaenderung(
// Zeitabfolge ungültig, Fehler
return array(
'error' => true,
'errormsg' => 'Datum des Statuseintrags muss nach dem Statusdatum,'
.' Semesterstartdatum nach Semesterstartdatum des vorherigen Statuseintrags sein'
'errormsg' => 'Ungültige Zeitabfolge der Statuseinträge (Statusdatum oder Semester)'
);
}
}
@@ -994,6 +994,18 @@ if(!$error)
{
$new_status_datum = isset($_POST['datum']) ? $_POST['datum'] : date('Y-m-d');
$bismeldestichtag = new bismeldestichtag();
$meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($new_status_datum);
if ($meldestichtag_erreicht === true)
{
$return = false;
$error = true;
$errormsg .= 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
$anzahl_fehler++;
}
$check_statusaenderung_result = checkStatusaenderung(
$prestudent_id,
$_POST['status_kurzbz'],
@@ -1204,13 +1216,24 @@ if(!$error)
if(isset($_POST['studiensemester_kurzbz']) && isset($_POST['status_kurzbz']) &&
isset($_POST['prestudent_id']) && is_numeric($_POST['prestudent_id']) &&
isset($_POST['ausbildungssemester']) && is_numeric($_POST['ausbildungssemester']))
isset($_POST['ausbildungssemester']) && is_numeric($_POST['ausbildungssemester']) &&
isset($_POST['datum']))
{
if($_POST['status_kurzbz']=='Student' && !$rechte->isBerechtigt('admin', null, 'suid') && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid'))
$erweiterteBerechtigungen = $rechte->isBerechtigt('admin', null, 'suid') || $rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid');
$bismeldestichtag = new bismeldestichtag();
$meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
if($_POST['status_kurzbz']=='Student' && !$erweiterteBerechtigungen)
{
$return = false;
$errormsg = 'Studentenrolle kann nur durch den Administrator geloescht werden';
}
elseif ($meldestichtag_erreicht && !$erweiterteBerechtigungen)
{
$return = false;
$errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht gelöscht werden.';
}
else
{
$qry = "SELECT count(*) as anzahl FROM public.tbl_prestudentstatus WHERE prestudent_id=".$db->db_add_param($_POST['prestudent_id'], FHC_INTEGER);
@@ -1530,6 +1553,17 @@ if(!$error)
$error = true;
$errormsg = isset($check_statusaenderung_result['errormsg']) ? $check_statusaenderung_result['errormsg'] : '';
}
// Prüfung, ob Meldestichtag erreicht ist
$bismeldestichtag = new bismeldestichtag();
$meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
if ($meldestichtag_erreicht === true)
{
$return = false;
$error = true;
$errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
}
}
if(!$error)
@@ -2502,10 +2536,15 @@ if(!$error)
{
$person_ids = explode(';',$_POST['person_ids']);
$exists = false;
if (defined('FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK') && (in_array($_POST['buchungstyp_kurzbz'], unserialize(FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK))))
if (defined('FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK'))
{
$konto = new konto();
$exists = $konto->checkDoppelteBuchung($person_ids, $_POST['studiensemester_kurzbz'], $_POST['buchungstyp_kurzbz']);
$buchungen = unserialize(FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK);
$buchung = $_POST['buchungstyp_kurzbz'];
if (isset($buchungen[$buchung]))
{
$konto = new konto();
$exists = $konto->checkDoppelteBuchung($person_ids, $_POST['studiensemester_kurzbz'], $buchungen[$buchung]);
}
}
if($exists)
+18 -18
View File
@@ -806,24 +806,24 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
<treechildren flex="1" >
<treeitem uri="rdf:*">
<treerow>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#status_kurzbz"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#studiensemester_kurzbz"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#ausbildungssemester"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#lehrverband"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#datum"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#orgform_kurzbz"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#prestudent_id"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#studienplan_id"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#studienplan_bezeichnung"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#anmerkung"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#bestaetigt_von"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#bestaetigt_am"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#bewerbung_abgeschicktamum"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#statusgrund"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#insertamum"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#insertvon"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updateamum"/>
<treecell label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#status_kurzbz"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#studiensemester_kurzbz"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#ausbildungssemester"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#lehrverband"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#datum"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#orgform_kurzbz"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#prestudent_id"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#studienplan_id"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#studienplan_bezeichnung"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#anmerkung"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#bestaetigt_von"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#bestaetigt_am"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#bewerbung_abgeschicktamum"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#statusgrund"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#insertamum"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#insertvon"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updateamum"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon"/>
</treerow>
</treeitem>
</treechildren>
+2 -1
View File
@@ -208,7 +208,8 @@ else
<menupopup id="student-filter-menu-popup" >
<menuitem id="student-toolbar-filter-dokumente" label="fehlende Dokumente" oncommand="InteressentDokumenteFilter()" disabled="false" tooltiptext="Liste aller Studenten mit Fehlenden Dokumenten"/>
<menuitem id="student-toolbar-filter-offenebuchungen" label="offene Buchungen" oncommand="StudentKontoFilterStudenten('konto')" disabled="false" tooltiptext="Liste aller Studenten mit offenen Buchungen"/>
<menuitem id="student-toolbar-filter-studiengebuehr" label="nicht gebuchte Studiengebuehr" oncommand="StudentKontoFilterStudenten('studiengebuehr')" disabled="false" tooltiptext="Liste aller Studenten die noch nicht mit Studienbebuehr belastet wurden" />
<menuitem id="student-toolbar-filter-studiengebuehr" label="nicht gebuchte Studiengebuehr" oncommand="StudentKontoFilterStudenten('studiengebuehr')" disabled="false" tooltiptext="Liste aller Studenten die noch nicht mit der Studiengebühr belastet wurden" />
<menuitem id="student-toolbar-filter-erhoehte-studiengebuehr" label="erhöhten Studienbeitrag" oncommand="StudentKontoFilterStudenten('StudiengebuehrErhoeht')" disabled="false" tooltiptext="Liste aller Studenten denen der erhöhte Studienbeitrag eingebucht wurde" />
<menuitem id="student-toolbar-filter-zgvohnedatum" label="ZGV eingetragen ohne Datum" oncommand="StudentKontoFilterStudenten('zgvohnedatum')" disabled="false" tooltiptext="Liste aller Studenten die ZGV eingetragen haben bei denen aber kein ZGV Datum gesetzt ist" />
<menu label="nach Statusgrund">
<menupopup id="student-filter-statusgrund-menu-popup">
+20 -3
View File
@@ -1876,7 +1876,6 @@ function StudentPrestudentDisableFields(val)
document.getElementById('student-prestudent-menulist-aufnahmeschluessel').disabled=val;
document.getElementById('student-prestudent-checkbox-facheinschlberuf').disabled=val;
document.getElementById('student-prestudent-checkbox-bismelden').disabled=val;
document.getElementById('student-prestudent-menulist-foerderrelevant').disabled=val;
document.getElementById('student-prestudent-checkbox-dual').disabled=val;
document.getElementById('student-prestudent-button-save').disabled=val;
@@ -1923,6 +1922,20 @@ function StudentPrestudentDisableFields(val)
document.getElementById('student-prestudent-menulist-zgvmastercode').disabled=true;
}
// bismelden checkbox deaktivieren wenn Recht nicht vorhanden ist
<?php
$editBismelden = $rechte->isBerechtigt('student/editBismelden') ? 'true' : 'false';
echo ' var editBismelden = '.$editBismelden.';';
?>
if (editBismelden == true)
{
document.getElementById('student-prestudent-checkbox-bismelden').disabled=val;
}
else
{
document.getElementById('student-prestudent-checkbox-bismelden').disabled=true;
}
//Status Tree leeren
rollentree = document.getElementById('student-prestudent-tree-rolle');
@@ -2080,6 +2093,7 @@ function StudentPrestudentRolleDelete()
var studiensemester_kurzbz = getTreeCellText(tree, 'student-prestudent-tree-rolle-studiensemester_kurzbz', tree.currentIndex);
var prestudent_id = getTreeCellText(tree, 'student-prestudent-tree-rolle-prestudent_id', tree.currentIndex);
var ausbildungssemester = getTreeCellText(tree, 'student-prestudent-tree-rolle-ausbildungssemester', tree.currentIndex);
var datum = getTreeCellText(tree, 'student-prestudent-tree-rolle-datum', tree.currentIndex);
studiengang_kz = document.getElementById('student-prestudent-menulist-studiengang_kz').value;
if(confirm('Diese Rolle wirklich loeschen?'))
@@ -2108,6 +2122,7 @@ function StudentPrestudentRolleDelete()
req.add('studiensemester_kurzbz', studiensemester_kurzbz);
req.add('ausbildungssemester', ausbildungssemester);
req.add('studiengang_kz', studiengang_kz);
req.add('datum', datum);
var response = req.executePOST();
@@ -2139,6 +2154,7 @@ function StudentPrestudentRolleDelete()
req.add('studiensemester_kurzbz', studiensemester_kurzbz);
req.add('ausbildungssemester', ausbildungssemester);
req.add('studiengang_kz', studiengang_kz);
req.add('datum', datum);
var response = req.executePOST();
@@ -2231,8 +2247,9 @@ function StudentRolleBearbeiten()
var studiensemester_kurzbz = getTreeCellText(tree, 'student-prestudent-tree-rolle-studiensemester_kurzbz', tree.currentIndex);
var prestudent_id = getTreeCellText(tree, 'student-prestudent-tree-rolle-prestudent_id', tree.currentIndex);
var ausbildungssemester = getTreeCellText(tree, 'student-prestudent-tree-rolle-ausbildungssemester', tree.currentIndex);
var datum = getTreeCellText(tree, 'student-prestudent-tree-rolle-datum', tree.currentIndex);
window.open('<?php echo APP_ROOT?>content/student/studentrolledialog.xul.php?prestudent_id='+prestudent_id+'&status_kurzbz='+status_kurzbz+'&studiensemester_kurzbz='+studiensemester_kurzbz+'&ausbildungssemester='+ausbildungssemester,"Status","status=no, width=500, height=450, centerscreen, resizable");
window.open('<?php echo APP_ROOT?>content/student/studentrolledialog.xul.php?prestudent_id='+prestudent_id+'&status_kurzbz='+status_kurzbz+'&studiensemester_kurzbz='+studiensemester_kurzbz+'&ausbildungssemester='+ausbildungssemester+'&datum='+datum,"Status","status=no, width=500, height=450, centerscreen, resizable");
}
// ****
@@ -2290,7 +2307,7 @@ function StudentRolleSpeichern(dialog, studiensemester_old, ausbildungssemester_
timepart_arr[i] = '00';
}
}
arr = datepart.split('.');
if(arr[0].length==1)
+34 -14
View File
@@ -31,6 +31,7 @@ require_once('../../include/person.class.php');
require_once('../../include/prestudent.class.php');
require_once('../../include/studienplan.class.php');
require_once('../../include/benutzerberechtigung.class.php');
require_once('../../include/bismeldestichtag.class.php');
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
@@ -58,8 +59,17 @@ if(isset($_GET['ausbildungssemester']))
else
$ausbildungssemester='';
if(isset($_GET['datum']))
$datum=$_GET['datum'];
else
$datum='';
$vorname = '';
$nachname = '';
$user=get_uid();
$db = new basis_db();
if($prestudent_id!='')
{
$prestudent = new prestudent();
@@ -67,9 +77,16 @@ if($prestudent_id!='')
$vorname = $prestudent->vorname;
$nachname = $prestudent->nachname;
// Prüfen, ob Studnetrolle vor dem aktuellen Meldestichtag ist. In diesem Fall darf die Rolle nicht mehr bearbeitet werden.
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
$bismeldestichtag = new bismeldestichtag();
$disabled = $bismeldestichtag->checkMeldestichtagErreicht($datum) && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid')
? ' disabled="true"'
: '';
}
$db = new basis_db();
$user=get_uid();
?>
<window id="student-rolle-dialog" title="Status"
@@ -83,6 +100,9 @@ $user=get_uid();
<vbox>
<textbox id="student-rolle-textbox-prestudent_id" value="" hidden="true" />
<groupbox id="student-rolle-groupbox" flex="1">
<?php if ($disabled): ?>
<label class="warning">Meldestichtag erreicht - Bearbeiten nicht mehr möglich</label>
<?php endif; ?>
<caption label="Details<?php echo ($nachname!=''?" $nachname $vorname":'');?>"/>
<grid id="student-rolle-grid-detail" style="margin:4px;" flex="1">
<columns >
@@ -112,7 +132,7 @@ $user=get_uid();
<label value="Studiensemester" control="student-rolle-menulist-studiensemester"/>
<menulist id="student-rolle-menulist-studiensemester"
datasources="<?php echo APP_ROOT ?>rdf/studiensemester.rdf.php?order=desc" flex="1"
ref="http://www.technikum-wien.at/studiensemester/liste" >
ref="http://www.technikum-wien.at/studiensemester/liste"<?php echo $disabled ?> >
<template>
<menupopup>
<menuitem value="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
@@ -124,7 +144,7 @@ $user=get_uid();
</row>
<row>
<label value="Ausbildungssemester" control="student-rolle-menulist-ausbildungssemester"/>
<menulist id="student-rolle-menulist-ausbildungssemester" >
<menulist id="student-rolle-menulist-ausbildungssemester"<?php echo $disabled ?> >
<menupopup>
<?php
@@ -163,7 +183,7 @@ $user=get_uid();
?>
<row hidden="<?php echo $hidden; ?>">
<label value="Organisationsform" control="student-rolle-menulist-orgform_kurzbz"/>
<menulist id="student-rolle-menulist-orgform_kurzbz" >
<menulist id="student-rolle-menulist-orgform_kurzbz"<?php echo $disabled ?> >
<menupopup>
<menuitem value="" label="-- keine Auswahl --"/>
<?php
@@ -181,13 +201,13 @@ $user=get_uid();
</row>
<row>
<label value="Datum" control="student-rolle-datum-datum"/>
<box class='Datum' id="student-rolle-datum-datum" />
<box class='Datum' id="student-rolle-datum-datum"<?php echo $disabled ?>/>
</row>
<row>
<label value="Bestätigt am" control="student-rolle-datum-bestaetigt_datum"/>
<box class='Datum' id="student-rolle-datum-bestaetigt_datum" />
<box class='Datum' id="student-rolle-datum-bestaetigt_datum"<?php echo $disabled ?> />
</row>
<?php
<?php
$readonly = 'readonly="true"';
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
@@ -196,11 +216,11 @@ $user=get_uid();
?>
<row>
<label value="Bewerbung abgeschickt am" control="student-rolle-datum-bewerbung_abgeschicktamum"/>
<textbox id="student-rolle-datum-bewerbung_abgeschicktamum" <?php echo $readonly ?>/>
<textbox id="student-rolle-datum-bewerbung_abgeschicktamum" <?php echo $readonly ?><?php echo $disabled ?>/>
</row>
<row>
<label value="Studienplan" control="student-rolle-menulist-studienplan"/>
<menulist id="student-rolle-menulist-studienplan" >
<menulist id="student-rolle-menulist-studienplan"<?php echo $disabled ?> >
<menupopup>
<menuitem value="" label="-- keine Auswahl --"/>
<?php
@@ -217,11 +237,11 @@ $user=get_uid();
</row>
<row>
<label value="Anmerkung"/>
<textbox id="student-rolle-textbox-anmerkung" multiline="true" />
<textbox id="student-rolle-textbox-anmerkung" multiline="true"<?php echo $disabled ?> />
</row>
<row>
<label value="Aufnahmestufe"/>
<menulist id="student-rolle-menulist-stufe" disabled="false">
<menulist id="student-rolle-menulist-stufe" <?php echo empty($disabled) ? 'disabled="false"' : $disabled ?>>
<menupopup>
<menuitem value="" label="-- keine Auswahl --"/>
<menuitem value="1" label="1"/>
@@ -234,7 +254,7 @@ $user=get_uid();
<label value="Grund"/>
<menulist id="student-rolle-menulist-statusgrund"
datasources="rdf:null" flex="1"
ref="http://www.technikum-wien.at/statusgrund" >
ref="http://www.technikum-wien.at/statusgrund"<?php echo $disabled ?> >
<template>
<menupopup>
<menuitem value="rdf:http://www.technikum-wien.at/statusgrund/rdf#statusgrund_id"
@@ -248,7 +268,7 @@ $user=get_uid();
</grid>
<hbox>
<spacer flex="1" />
<button id="student-rolle-button-speichern" oncommand="StudentRolleSpeichern()" label="Speichern" />
<button id="student-rolle-button-speichern" oncommand="StudentRolleSpeichern()" label="Speichern"<?php echo $disabled ?> />
</hbox>
</groupbox>
</vbox>
+185
View File
@@ -0,0 +1,185 @@
<?php
/* Copyright (C) 2007 Technikum-Wien
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Alexei Karpenko <karpenko@technikum-wien.at>,
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
require_once(dirname(__FILE__).'/studiensemester.class.php');
class bismeldestichtag extends basis_db
{
//Tabellenspalten
public $meldestichtag_id; // integer
public $meldestichtag; // date
public $studiensemester_kurzbz; // varchar(16)
public $insertamum; // timestamp
public $insertvon; // varchar(32)
public $updateamum; // timestamp
public $updatevon; // varchar(32)
// ErgebnisArray
public $result=array();
/**
* Konstruktor - Uebergibt die Connection und laedt optional einen Meldestichtag
* @param $meldestichtag_id Stichtag der geladen werden soll (default=null)
*/
public function __construct($meldestichtag_id=null)
{
parent::__construct();
if(!is_null($meldestichtag_id))
$this->load($meldestichtag_id);
}
/**
* Laedt Meldestichtag mit der uebergebenen ID
* @param $meldestichtag_id ID des Stichtags der geladen werden soll
*/
public function load($meldestichtag_id)
{
$qry = "SELECT * FROM bis.tbl_bismeldestichtag WHERE meldestichtag_id=".$this->db_add_param($meldestichtag_id, FHC_INTEGER);
if($this->db_query($qry))
{
if($row = $this->db_fetch_object())
{
$this->meldestichtag_id = $row->meldestichtag_id;
$this->meldestichtag = $row->meldestichtag;
$this->studiensemester_kurzbz = $row->studiensemester_kurzbz;
$this->insertamum = $row->insertamum;
$this->insertvon = $row->insertvon;
$this->updateamum = $row->updateamum;
$this->updatevon = $row->updatevon;
return true;
}
else
{
$this->errormsg = 'Kein Eintrag gefunden';
return false;
}
}
else
{
$this->errormsg = "Fehler beim Laden des Stichtags";
return false;
}
}
/**
* Prueft die Variablen vor dem Speichern
* auf Gueltigkeit.
* @return true wenn ok, false im Fehlerfall
*/
protected function validate()
{
return true;
}
/**
* Liefert zuletzt erreichten Meldestichtag
*
* @param $studiensemester_kurzbz
* @return boolean
*/
public function getLastReachedMeldestichtag($studiensemester_kurzbz = null)
{
$qry = "SELECT
meldestichtag_id, meldestichtag, studiensemester_kurzbz, insertamum, insertvon, updateamum, updatevon
FROM
bis.tbl_bismeldestichtag
WHERE
meldestichtag < NOW()";
if (isset($studiensemester_kurzbz))
{
$qry .= "
AND
studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz);
}
$qry .= "
ORDER BY
meldestichtag DESC
LIMIT 1;";
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
$obj = new bismeldestichtag();
$obj->meldestichtag_id = $row->meldestichtag_id;
$obj->meldestichtag = $row->meldestichtag;
$obj->studiensemester_kurzbz = $row->studiensemester_kurzbz;
$obj->insertamum = $row->insertamum;
$obj->insertvon = $row->insertvon;
$obj->updateamum = $row->updateamum;
$obj->updatevon = $row->updatevon;
$this->result[] = $obj;
}
return true;
}
else
{
$this->errormsg = 'Meldestichtag konnte nicht geladen werden';
return false;
}
}
/**
* Prüft, ob Meldestichtag für ein bestimmtes Statusdatum und Studiensemester erreicht ist.
*
* @param $status_datum
* @param $studiensemester_kurzbz
* @return boolean true wenn erreicht, oder false
*/
public function checkMeldestichtagErreicht($status_datum, $studiensemester_kurzbz = null)
{
$erreicht = false;
if (isset($studiensemester_kurzbz))
{
// Studiensemester ende holen
$studiensemester = new studiensemester();
if ($studiensemester->load($studiensemester_kurzbz))
$studiensemester_ende = new DateTime($studiensemester->ende);
}
// letztes erreichtes Bismeldedatum holen
if ($this->getLastReachedMeldestichtag() && isset($this->result[0]))
$lastReachedMeldestichtag = new DateTime($this->result[0]->meldestichtag);
$statusDatum = new DateTime($status_datum);
// Prüfen, ob Studentstatusdatum oder Studiensemester vor dem Stichtagsdatum liegen
if (isset($statusDatum))
{
if (isset($lastReachedMeldestichtag))
$erreicht = $statusDatum < $lastReachedMeldestichtag;
if (isset($studiensemester_ende))
$erreicht = $erreicht || $studiensemester_ende < $lastReachedMeldestichtag;
}
return $erreicht;
}
}
?>
+2 -3
View File
@@ -965,17 +965,16 @@ class konto extends basis_db
}
}
public function checkDoppelteBuchung($person_ids, $stsem, $typ)
public function checkDoppelteBuchung($person_ids, $stsem, $typen)
{
$qry = "SELECT person.vorname, person.nachname
FROM public.tbl_konto konto
JOIN public.tbl_person person USING(person_id)
WHERE konto.person_id IN (".$this->implode4SQL(array_filter($person_ids)).")
AND studiensemester_kurzbz = ".$this->db_add_param($stsem)."
AND buchungstyp_kurzbz = ".$this->db_add_param($typ)."
AND buchungstyp_kurzbz IN (".$this->implode4SQL($typen) .")
GROUP BY person.vorname, person.nachname
ORDER BY person.nachname, person.vorname";
if ($result = $this->db_query($qry))
{
$persons = array();
+39
View File
@@ -906,6 +906,45 @@ class prestudent extends person
AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)."
)";
break;
case "bewerberrtangemeldetteilgenommen":
$qry.=" AND a.rolle='Bewerber'
AND EXISTS (
SELECT
1
FROM
public.tbl_rt_person
JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id)
WHERE
person_id=a.person_id
AND studienplan_id IN (
SELECT studienplan_id FROM lehre.tbl_studienplan
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz
)
AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)."
)
AND reihungstestangetreten = true";
break;
case "bewerberrtangemeldetnichtteilgenommen":
$qry.=" AND a.rolle='Bewerber'
AND EXISTS (
SELECT
1
FROM
public.tbl_rt_person
JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id)
WHERE
person_id=a.person_id
AND studienplan_id IN (
SELECT studienplan_id FROM lehre.tbl_studienplan
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz
)
AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)."
)
AND reihungstestangetreten = false
";
break;
case "zgv":
$stg_obj = new studiengang();
$stg_obj->load($studiengang_kz);
+1 -1
View File
@@ -212,7 +212,7 @@
<!ENTITY menu-dokumente-diplsupplement.accesskey "S">
<!ENTITY menu-dokumente-antrag.key "N">
<!ENTITY menu-dokumente-antrag.label "Antrag">
<!ENTITY menu-dokumente-antrag.label "Verwaltung des Studierendenstatus">
<!ENTITY menu-dokumente-antrag.accesskey "N">
<!ENTITY menu-dokumente-antrag-abmeldung.key "A">
+1 -1
View File
@@ -17,7 +17,7 @@ $this->phrasen['testtool/basic']='Basic';
$this->phrasen['testtool/basisgebiete']='Basisgebiete';
$this->phrasen['testtool/semester']='Semester';
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='Der zuteilte Reihungstest ist noch nicht freigeschaltet';
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='Der Reihungstest dem Sie zugeteilt sind, kann nicht geladen werden';
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='Der Reihungstest dem Sie zugeteilt sind, kann nicht geladen werden. Melden Sie sich bitte bei der Reihungstestaufsicht.';
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Ihr Geburtsdatum stimmt nicht mit unseren Daten überein. Bitte wenden Sie sich an die Aufsichtsperson';
$this->phrasen['testtool/home']='Home';
$this->phrasen['testtool/teilnehmerIn']='TeilnehmerIn';
+1
View File
@@ -26,6 +26,7 @@ $this->phrasen['zeitsperre/vonDatumMonat']='Von-Datum Monat';
$this->phrasen['zeitsperre/bisDatumMonat']='Bis-Datum Monat';
$this->phrasen['zeitsperre/istGroesserAlsBisDatum']='ist größer als das Bis-Datum';
$this->phrasen['zeitsperre/vonDatum']='Von-Datum';
$this->phrasen['zeitsperre/bisDatumGroesserMax']='BisDatum liegt zu weit in der Zukunft, nicht zulässig!';
$this->phrasen['zeitsperre/resturlaubstage']='Resturlaubstage';
$this->phrasen['zeitsperre/aktuellerStand']='aktueller Stand';
+1 -1
View File
@@ -17,7 +17,7 @@ $this->phrasen['testtool/basic']='Basic';
$this->phrasen['testtool/basisgebiete']='Basic test';
$this->phrasen['testtool/semester']='Semester';
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='The entrance examination assigned has not yet been activated.';
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='The entrance examination assigned to you can not be loaded.';
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='The placement test you are assigned to could not be loaded. Please contact the placement test supervisior.';
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Your date of birth does not correspond to the data we have. Please speak to the supervisor. ';
$this->phrasen['testtool/home']='Home';
$this->phrasen['testtool/teilnehmerIn']='Participant';
+1
View File
@@ -26,6 +26,7 @@ $this->phrasen['zeitsperre/vonDatumMonat']='From-date month';
$this->phrasen['zeitsperre/bisDatumMonat']='To-date month';
$this->phrasen['zeitsperre/istGroesserAlsBisDatum']='is later than To-date';
$this->phrasen['zeitsperre/vonDatum']='From-date';
$this->phrasen['zeitsperre/bisDatumGroesserMax']='TO-Date value is too far in the future, action not permitted';
$this->phrasen['zeitsperre/resturlaubstage']='Carry-over days';
$this->phrasen['zeitsperre/aktuellerStand']='Available vacation';
+40
View File
@@ -0,0 +1,40 @@
@import '../../vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css';
/* Apply borders and background to Cell instead of the Row
* otherwise frozen columns won't look good (columns behind
* will be partial visible)
*/
.tabulator-row {
border-bottom: none;
}
.tabulator-row .tabulator-frozen,
.tabulator-row .tabulator-cell {
border-bottom: 1px solid #dee2e6;
}
.tabulator-row.tabulator-row-even {
background-color: transparent;
}
.tabulator-headers .tabulator-frozen,
.tabulator-row.tabulator-row-odd .tabulator-frozen,
.tabulator-row.tabulator-row-odd .tabulator-cell {
background-color: #fff;
}
.tabulator-row.tabulator-row-even .tabulator-frozen,
.tabulator-row.tabulator-row-even .tabulator-cell {
background-color: #f2f2f2;
}
.tabulator-row.tabulator-selectable:hover .tabulator-frozen,
.tabulator-row.tabulator-selectable:hover .tabulator-cell {
background-color: #ececec;
}
.tabulator-row.tabulator-selected .tabulator-frozen,
.tabulator-row.tabulator-selected .tabulator-cell {
background-color: #9abcea;
}
.tabulator-row.tabulator-selected:hover .tabulator-frozen,
.tabulator-row.tabulator-selected:hover .tabulator-cell {
background-color: #769bcc;
}
.tabulator .tabulator-col-resize-handle:last-of-type {
z-index: 999999;
}
+72
View File
@@ -0,0 +1,72 @@
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {CoreRESTClient} from '../../RESTClient.js';
//
const CORE_BISMELDESTICHTAG_CMPT_TIMEOUT = 2000;
/**
*
*/
export const BismeldestichtagAPIs = {
/**
*
*/
getStudiensemester: function() {
return CoreRESTClient.get(
'codex/Bismeldestichtag/getStudiensemester',
null,
{
timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
}
);
},
getBismeldestichtage: function() {
return CoreRESTClient.get(
'codex/Bismeldestichtag/getBismeldestichtage',
null,
{
timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
}
);
},
addBismeldestichtag: function(wsParams) {
return CoreRESTClient.post(
'codex/Bismeldestichtag/addBismeldestichtag',
{
meldestichtag: wsParams.meldestichtag,
studiensemester_kurzbz: wsParams.studiensemester_kurzbz
},
{
timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
}
);
},
deleteBismeldestichtag: function(wsParams) {
return CoreRESTClient.post(
'codex/Bismeldestichtag/deleteBismeldestichtag',
{
meldestichtag_id: wsParams.meldestichtag_id
},
{
timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
}
);
}
};
@@ -0,0 +1,190 @@
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {BismeldestichtagTabulatorOptions} from './TabulatorSetup.js';
import {BismeldestichtagTabulatorEventHandlers} from './TabulatorSetup.js';
import {CoreFilterCmpt} from '../../components/filter/Filter.js';
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
import {CoreRESTClient} from '../../RESTClient.js';
import {CoreFetchCmpt} from '../../components/Fetch.js';
import {BismeldestichtagAPIs} from './API.js';
const bismeldestichtagApp = Vue.createApp({
data: function() {
return {
bismeldestichtagTabulatorOptions: BismeldestichtagTabulatorOptions,
bismeldestichtagTabulatorEventHandlers: BismeldestichtagTabulatorEventHandlers,
meldestichtag: null, // date of Meldestichtag
semList: null, // all Studiensemester for dropdown
currSem: null, // selected Studiensemester
fetchCmptApiFunction: {}, // api function call
fetchCmptApiFunctionParams: null, // parameters for api function call
fetchCmptDataFetched: null, // function to execute after call
fetchCmptRefresh: true // for refreshing
};
},
components: {
CoreNavigationCmpt,
CoreFilterCmpt,
BismeldestichtagAPIs,
CoreFetchCmpt,
"datepicker": VueDatePicker
},
created() {
this.handlerStudiensemester();
},
methods: {
/**
* Define Studiensemester call and method to be executed after the call
*/
handlerStudiensemester: function() {
this.startFetchCmpt(
BismeldestichtagAPIs.getStudiensemester,
null,
this.fetchCmptDataFetchedStudiensemester
);
},
/**
* Define Studiensemester call and method to be executed after the call
*/
handlerBismeldestichtage: function() {
this.startFetchCmpt(
BismeldestichtagAPIs.getBismeldestichtage,
null,
this.fetchCmptDataFetchedBismeldestichtage
);
},
/**
* Define add Bismeldestichtag call and method to be executed after the call
*/
handlerAddBismeldestichtag: function(event) {
this.startFetchCmpt(
BismeldestichtagAPIs.addBismeldestichtag,
{
meldestichtag: this.meldestichtag,
studiensemester_kurzbz: this.currSem
},
this.fetchCmptDataFetchedAddBismeldestichtag
);
},
/**
* Define delete Bismeldestichtag call and method to be executed after the call
*/
handlerDeleteBismeldestichtag: function(meldestichtag_id) {
this.startFetchCmpt(
BismeldestichtagAPIs.deleteBismeldestichtag,
{
meldestichtag_id: meldestichtag_id
},
this.fetchCmptDataFetchedDeleteBismeldestichtag
);
},
/**
* Called after Studiensemester response is received
*/
fetchCmptDataFetchedStudiensemester: function(data) {
if (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));
if (CoreRESTClient.hasData(data))
{
let semRes = CoreRESTClient.getData(data);
this.semList = semRes.semList;
this.currSem = semRes.currSem;
this.handlerBismeldestichtage();
}
else
alert("No Studiensemester data");
},
/**
* Called after Bismeldestichtage response is received
*/
fetchCmptDataFetchedBismeldestichtage: function(data) {
if (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));
if (CoreRESTClient.hasData(data))
{
// set the Meldestichtagedata
this.$refs.bismeldestichtageTable.tabulator.setData(CoreRESTClient.getData(data));
// save delete Bismeldestichtag function
let funcDeleteBismeldestichtag = this.handlerDeleteBismeldestichtag;
let btns = document.getElementsByClassName('delete-btn');
// add click events for deletion
for (let btn in btns)
{
if (btns[btn].addEventListener)
{
btns[btn].addEventListener('click',
function(){
funcDeleteBismeldestichtag(btns[btn].getAttribute('data-meldestichtag-id'));
}
);
}
}
}
else
this.$refs.bismeldestichtageTable.tabulator.setData([]);
},
/**
* Called after Add Bismeldestichtag response is received
*/
fetchCmptDataFetchedAddBismeldestichtag: function(data) {
if (CoreRESTClient.isError(data))
alert(CoreRESTClient.getError(data));
else if (CoreRESTClient.hasData(data))
{
this.handlerBismeldestichtage();
}
else
alert("No response data");
},
/**
* Called after Add Bismeldestichtag response is received
*/
fetchCmptDataFetchedDeleteBismeldestichtag: function(data) {
if (CoreRESTClient.isError(data))
alert(CoreRESTClient.getError(data));
else if (CoreRESTClient.hasData(data))
{
this.handlerBismeldestichtage();
}
else
alert("No response data");
},
/**
* Used to start/refresh the FetchCmpt
*/
startFetchCmpt: function(apiFunction, apiFunctionParameters, dataFetchedCallback) {
// Assign the function api of the FetchCmpt binded property
this.fetchCmptApiFunction = apiFunction;
// In case a null value is provided set the parameters as an empty object
if (apiFunctionParameters == null) apiFunctionParameters = {};
// Assign parameters to the FetchCmpt binded properties
this.fetchCmptApiFunctionParams = apiFunctionParameters;
// Assign data fetch callback to the FetchCmpt binded properties
this.fetchCmptDataFetched = dataFetchedCallback;
// Set the FetchCmpt binded property refresh to have the component to refresh
// NOTE: this should be the last one to be called because it triggers the FetchCmpt to start to refresh
this.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true;
}
}
});
bismeldestichtagApp.mount('#main');
@@ -0,0 +1,75 @@
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
*
*/
export const BismeldestichtagTabulatorOptions = {
maxHeight: "100%",
minHeight: 50,
layout: 'fitColumns',
index: 'meldestichtag_id',
columns: [
{title: 'Meldestichtag',field: 'meldestichtag', headerFilter: true, formatter: function(cell){
return BismeldestichtagTabulatorHelperFunctions._formatDate(cell.getValue());
}
},
{title: 'Studiensemester', field: 'studiensemester_kurzbz', headerFilter: true, sorter:function(a, b, aRow, bRow, column, dir, sorterParams) {
//aRow, bRow - the row components for the values being compared
let semesterStartA = new Date(aRow.getData().semester_start);
let semesterStartB = new Date(bRow.getData().semester_start);
return semesterStartA - semesterStartB; // difference between studiensemester start dates
}
},
{title: 'Semesterstart',field: 'semester_start', headerFilter: true, visible: false, formatter: function(cell){
return BismeldestichtagTabulatorHelperFunctions._formatDate(cell.getValue());
}
},
{title: 'ID', field: 'meldestichtag_id', headerFilter: true, visible: false},
{title: 'Insertamum', field: 'insertamum', headerFilter: true, visible: false},
{title: 'Insertvon', field: 'insertvon', headerFilter: true, visible: false},
{title: 'Löschen', field: 'loeschen', headerFilter: false, formatter:function(cell){
return '<button class="btn btn-outline-secondary delete-btn" data-meldestichtag-id="'+cell.getRow().getIndex()+'">'+
'<i class="fa fa-xmark"></i>'+
'</button>';
}
}
]
};
/**
*
*/
export const BismeldestichtagTabulatorEventHandlers = [
{
event: "rowClick",
handler: function(e, row) {
if (e.target.nodeName == 'DIV') {
let data = row.getData();
alert(data.studiensemester_kurzbz + ': ' + BismeldestichtagTabulatorHelperFunctions._formatDate(data.meldestichtag));
}
}
}
];
let BismeldestichtagTabulatorHelperFunctions = {
_formatDate: function(date) {
return date.replace(/(.*)-(.*)-(.*)/, '$3.$2.$1');
}
}
+8 -3
View File
@@ -2,6 +2,7 @@ import StudierendenantragAntrag from "../../components/Studierendenantrag/Antrag
import StudierendenantragStatus from "../../components/Studierendenantrag/Status.js";
import StudierendenantragInfoblock from "../../components/Studierendenantrag/Infoblock.js";
import VueDatePicker from "../../components/vueDatepicker.js.php";
import Phrasen from '../../plugin/Phrasen.js';
const app = Vue.createApp({
components: {
@@ -12,10 +13,14 @@ const app = Vue.createApp({
},
data() {
return {
statusMsg: "",
statusSeverity: "",
status: {
msg: '',
severity: ''
},
infoArray: []
};
}
});
app.mount('#wrapper');
app
.use(Phrasen)
.mount('#wrapper');
+5 -1
View File
@@ -1,8 +1,12 @@
import StudierendenantragLeitung from '../../../components/Studierendenantrag/Leitung.js';
import Phrasen from '../../../plugin/Phrasen.js';
const app = Vue.createApp({
components: {
StudierendenantragLeitung
}
});
app.use(primevue.config.default,{zIndex: {overlay: 9999}}).mount('#wrapper');
app
.use(Phrasen)
.use(primevue.config.default,{zIndex: {overlay: 9999}})
.mount('#wrapper');
+4 -1
View File
@@ -1,4 +1,5 @@
import LvZuweisung from '../../../components/Studierendenantrag/Lvzuweisung.js';
import Phrasen from '../../../plugin/Phrasen.js';
const app = Vue.createApp({
components: {
@@ -10,4 +11,6 @@ const app = Vue.createApp({
}
}
});
app.mount('#wrapper');
app
.use(Phrasen)
.mount('#wrapper');
+4 -1
View File
@@ -1,8 +1,11 @@
import LvPopup from '../../../components/Studierendenantrag/Leitung/LvPopup.js';
import Phrasen from '../../../plugin/Phrasen.js';
const app = Vue.createApp({
components: {
LvPopup
}
});
app.mount('#wrapper');
app
.use(Phrasen)
.mount('#wrapper');
+3
View File
@@ -1,3 +1,5 @@
import Phrasen from '../../plugin/Phrasen.js';
export default {
data: () => ({
modal: null
@@ -86,6 +88,7 @@ export default {
}
});
const wrapper = document.createElement("div");
instance.use(Phrasen); // TODO(chris): find a more dynamic way
instance.mount(wrapper);
document.body.appendChild(wrapper);
});
@@ -2,7 +2,6 @@ import StudierendenantragAbmeldung from './Form/Abmeldung.js';
import StudierendenantragAbmeldungStgl from './Form/AbmeldungStgl.js';
import StudierendenantragUnterbrechung from './Form/Unterbrechung.js';
import StudierendenantragWiederholung from './Form/Wiederholung.js';
import Phrasen from '../../mixins/Phrasen.js';
export default {
components: {
@@ -11,9 +10,6 @@ export default {
StudierendenantragUnterbrechung,
StudierendenantragWiederholung
},
mixins: [
Phrasen
],
emits: [
'update:infoArray',
'update:statusMsg',
@@ -37,13 +33,13 @@ export default {
return 'Studierendenantrag' + this.antragType;
},
infoText() {
return this.p.t('studierendenantrag/info_' + this.antragType + '_' + this.status);
return this.$p.t('studierendenantrag/info_' + this.antragType + '_' + this.status);
}
},
template: `
<div class="studierendenantrag-antrag card">
<div class="card-header">
{{p.t('studierendenantrag', 'title_' + antragType)}}
{{$p.t('studierendenantrag', 'title_' + antragType)}}
</div>
<div v-if="infoText && infoText.substr(0, 9) != '<< PHRASE'" class="alert alert-primary m-3" role="alert" v-html="infoText">
</div>
@@ -1,5 +1,4 @@
import {CoreFetchCmpt} from '../../Fetch.js';
import Phrasen from '../../../mixins/Phrasen.js';
var _uuid = 0;
@@ -7,9 +6,6 @@ export default {
components: {
CoreFetchCmpt
},
mixins: [
Phrasen
],
emits: [
'setInfos',
'setStatus'
@@ -56,7 +52,7 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
@@ -67,7 +63,7 @@ export default {
createAntrag() {
bootstrap.Modal.getOrCreateInstance(this.$refs.modal).hide();
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
severity: 'warning'
});
this.saving = true;
@@ -93,7 +89,7 @@ export default {
this.errors.default.push(result.data.retval[k]);
}
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
severity: 'danger'
});
}
@@ -104,13 +100,13 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
else
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_open')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_open')})),
severity:'success'
});
}
@@ -120,7 +116,7 @@ export default {
},
cancelAntrag() {
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelling')})),
severity: 'warning'
});
this.saving = true;
@@ -144,7 +140,7 @@ export default {
this.errors.default.push(result.data.retval[k]);
}
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
severity:'danger'
});
}
@@ -156,13 +152,13 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
else
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelled')})),
severity: 'danger'
});
}
@@ -183,37 +179,37 @@ export default {
</div>
<table class="table">
<tr>
<th>{{p.t('lehre', 'studiengang')}}</th>
<th>{{$p.t('lehre', 'studiengang')}}</th>
<td align="right">{{data.bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'organisationsform')}}</th>
<th>{{$p.t('lehre', 'organisationsform')}}</th>
<td align="right">{{data.orgform_bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<td align="right">{{data.name}}</td>
</tr>
<tr>
<th>{{p.t('person', 'personenkennzeichen')}}</th>
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
<td align="right">{{data.matrikelnr}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'studienjahr')}}</th>
<th>{{$p.t('lehre', 'studienjahr')}}</th>
<td align="right">{{data.studienjahr_kurzbz}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'studiensemester')}}</th>
<th>{{$p.t('lehre', 'studiensemester')}}</th>
<td align="right">{{data.studiensemester_kurzbz}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'semester')}}</th>
<th>{{$p.t('lehre', 'semester')}}</th>
<td align="right">{{data.semester}}</td>
</tr>
</table>
</div>
<div v-if="data.grund" class="mb-3">
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
<h5>{{$p.t('studierendenantrag', 'antrag_grund')}}:</h5>
<pre>{{data.grund}}</pre>
</div>
<div v-else class="col-sm-6 mb-3">
@@ -239,7 +235,7 @@ export default {
@click="cancelAntrag"
:disabled="saving"
>
{{p.t('studierendenantrag', 'btn_cancel')}}
{{$p.t('studierendenantrag', 'btn_cancel')}}
</button>
<button
v-else-if="!data.studierendenantrag_id"
@@ -249,7 +245,7 @@ export default {
:data-bs-target="'#studierendenantrag-form-abmeldung-' + uuid + '-modal'"
:disabled="saving"
>
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
</button>
<div
@@ -266,18 +262,18 @@ export default {
class="modal-title"
:id="'studierendenantrag-form-abmeldung-' + uuid + '-modal-label'"
>
{{p.t('studierendenantrag', 'title_Abmeldung')}}
{{$p.t('studierendenantrag', 'title_Abmeldung')}}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui', 'schliessen')"></button>
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="$p.t('ui', 'schliessen')"></button>
</div>
<div class="modal-body" v-html="p.t('studierendenantrag', 'warning_Abmeldung')">
<div class="modal-body" v-html="$p.t('studierendenantrag', 'warning_Abmeldung')">
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-primary"
@click="createAntrag">
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
</button>
</div>
</div>
@@ -1,5 +1,4 @@
import {CoreFetchCmpt} from '../../Fetch.js';
import Phrasen from '../../../mixins/Phrasen.js';
var _uuid = 0;
@@ -7,9 +6,6 @@ export default {
components: {
CoreFetchCmpt
},
mixins: [
Phrasen
],
emits: [
'setInfos',
'setStatus'
@@ -30,7 +26,7 @@ export default {
},
computed: {
statusSeverity() {
switch (this.data.status)
switch (this.data?.status)
{
case 'Erstellt': return 'info';
case 'Genehmigt': return 'success';
@@ -56,7 +52,7 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
@@ -67,7 +63,7 @@ export default {
createAntrag() {
bootstrap.Modal.getOrCreateInstance(this.$refs.modal).hide();
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
severity: 'warning'
});
this.saving = true;
@@ -93,7 +89,7 @@ export default {
this.errors.default.push(result.data.retval[k]);
}
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
severity: 'danger'
});
}
@@ -104,13 +100,13 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
else
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_open')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_open')})),
severity:'success'
});
}
@@ -123,7 +119,7 @@ export default {
if(event.target.value)
{
let templateT= this.p.t('studierendenantrag', event.target.value);
let templateT= this.$p.t('studierendenantrag', event.target.value);
templateText.value = templateT;
}
else
@@ -140,40 +136,40 @@ export default {
<div class="col-12">
<table class="table">
<tr>
<th>{{p.t('lehre', 'studiengang')}}</th>
<th>{{$p.t('lehre', 'studiengang')}}</th>
<td align="right">{{data.bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'organisationsform')}}</th>
<th>{{$p.t('lehre', 'organisationsform')}}</th>
<td align="right">{{data.orgform_bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<td align="right">{{data.name}}</td>
</tr>
<tr>
<th>{{p.t('person', 'personenkennzeichen')}}</th>
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
<td align="right">{{data.matrikelnr}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'studienjahr')}}</th>
<th>{{$p.t('lehre', 'studienjahr')}}</th>
<td align="right">{{data.studienjahr_kurzbz}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'studiensemester')}}</th>
<th>{{$p.t('lehre', 'studiensemester')}}</th>
<td align="right">{{data.studiensemester_kurzbz}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'semester')}}</th>
<th>{{$p.t('lehre', 'semester')}}</th>
<td align="right">{{data.semester}}</td>
</tr>
</table>
</div>
<div v-if="data.grund" class="mb-3">
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
<h5>{{$p.t('studierendenantrag', 'antrag_grund')}}:</h5>
<pre class="text-prewrap">{{data.grund}}</pre>
<pre class="text-prewrap">{{data?.grund}}</pre>
</div>
<div v-else class="col-sm-6 mb-3">
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-grund'" class="form-label">Grund:</label>
@@ -181,18 +177,20 @@ export default {
<select name="grundAv" @change="appendDropDownText
($event)">
<option value="" > --- bitte auswählen, sofern zutreffend ---- </option>
<option value="textLong_NichtantrittStudium">{{p.t('studierendenantrag', 'dropdown_NichtantrittStudium')}}
<option value="textLong_NichtantrittStudium">{{$p.t('studierendenantrag', 'dropdown_NichtantrittStudium')}}
</option>
<option value="textLong_ungenuegendeLeistung">{{p.t('studierendenantrag', 'dropdown_ungenuegendeLeistung')}}
<option value="textLong_ungenuegendeLeistung">{{$p.t('studierendenantrag', 'dropdown_ungenuegendeLeistung')}}
</option>
<option value="textLong_studentNichtAnwesend">{{p.t('studierendenantrag', 'dropdown_nichtAnwesend')}}
<option value="textLong_studentNichtAnwesend">{{$p.t('studierendenantrag', 'dropdown_nichtAnwesend')}}
</option>
<option value="textLong_PruefunstermineNichtEingehalten">{{p.t('studierendenantrag', 'dropdown_PruefunstermineNichtEingehalten')}}
<option value="textLong_PruefunstermineNichtEingehalten">{{$p.t('studierendenantrag', 'dropdown_PruefunstermineNichtEingehalten')}}
</option>
<option value="textLong_studentNichtGezahlt">{{p.t('studierendenantrag', 'dropdown_nichtGezahlt')}}
<option value="textLong_studentNichtGezahlt">{{$p.t('studierendenantrag', 'dropdown_nichtGezahlt')}}
</option>
<option value="textLong_plageat">{{p.t('studierendenantrag', 'dropdown_plageat')}}
<option value="textLong_plageat">{{$p.t('studierendenantrag', 'dropdown_plageat')}}
</option>
<option value="textLong_MissingZgv">{{$p.t('studierendenantrag', 'dropdown_MissingZgv')}}
</option>
</select>
</div>
<textarea
@@ -211,14 +209,14 @@ export default {
<div class="col-12 text-end">
<button
v-if="!data.studierendenantrag_id"
v-if="!data?.studierendenantrag_id"
type="button"
class="btn btn-primary"
data-bs-toggle="modal"
:data-bs-target="'#studierendenantrag-form-abmeldung-' + uuid + '-modal'"
:disabled="saving"
>
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
</button>
<div
ref="modal"
@@ -234,18 +232,18 @@ export default {
class="modal-title"
:id="'studierendenantrag-form-abmeldung-' + uuid + '-modal-label'"
>
{{p.t('studierendenantrag', 'title_Abmeldung')}}
{{$p.t('studierendenantrag', 'title_Abmeldung')}}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui', 'schliessen')"></button>
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="$p.t('ui', 'schliessen')"></button>
</div>
<div class="modal-body" v-html="p.t('studierendenantrag', 'warning_AbmeldungStgl')">
<div class="modal-body" v-html="$p.t('studierendenantrag', 'warning_AbmeldungStgl')">
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-primary"
@click="createAntrag">
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
</button>
</div>
</div>
@@ -1,6 +1,5 @@
import {CoreFetchCmpt} from '../../Fetch.js';
import VueDatepicker from '../../vueDatepicker.js.php';
import Phrasen from '../../../mixins/Phrasen.js';
var _uuid = 0;
@@ -9,9 +8,6 @@ export default {
CoreFetchCmpt,
VueDatepicker
},
mixins: [
Phrasen
],
emits: [
'setInfos',
'setStatus'
@@ -79,7 +75,7 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
@@ -89,7 +85,7 @@ export default {
},
createAntrag() {
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
severity: 'warning'
});
this.saving = true;
@@ -126,7 +122,7 @@ export default {
this.errors.default.push(result.data.retval[k]);
}
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
severity: 'danger'
});
}
@@ -137,13 +133,13 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
else
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_created')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_created')})),
severity: 'info'
});
}
@@ -153,7 +149,7 @@ export default {
},
cancelAntrag() {
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelling')})),
severity: 'warning'
});
this.saving = true;
@@ -177,7 +173,7 @@ export default {
this.errors.default.push(result.data.retval[k]);
}
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
severity: 'danger'
});
}
@@ -189,13 +185,13 @@ export default {
this.data = result.data.retval;
if (this.data.status) {
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
else
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelled')})),
severity: 'danger'
});
}
@@ -216,28 +212,28 @@ export default {
</div>
<table class="table">
<tr>
<th>{{p.t('lehre', 'studiengang')}}</th>
<th>{{$p.t('lehre', 'studiengang')}}</th>
<td align="right">{{data.bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'organisationsform')}}</th>
<th>{{$p.t('lehre', 'organisationsform')}}</th>
<td align="right">{{data.orgform_bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<td align="right">{{data.name}}</td>
</tr>
<tr>
<th>{{p.t('person', 'personenkennzeichen')}}</th>
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
<td align="right">{{data.matrikelnr}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'studienjahr')}}</th>
<th>{{$p.t('lehre', 'studienjahr')}}</th>
<td align="right" v-if="data.studierendenantrag_id">{{data.studienjahr_kurzbz}}</td>
<td align="right" v-else>{{stsem === null ? '' : data.studiensemester[stsem].studienjahr_kurzbz}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'semester')}}</th>
<th>{{$p.t('lehre', 'semester')}}</th>
<td align="right" v-if="data.studierendenantrag_id">{{data.semester}}</td>
<td align="right" v-else>{{stsem === null ? '' : data.studiensemester[stsem].semester}}</td>
</tr>
@@ -246,7 +242,7 @@ export default {
<div class="col-sm-6 mb-3">
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-stsem'" class="form-label">
{{p.t('lehre', 'studiensemester')}}
{{$p.t('lehre', 'studiensemester')}}
</label>
<div v-if="data.studierendenantrag_id">
{{data.studiensemester_kurzbz}}
@@ -271,7 +267,7 @@ export default {
</div>
<div class="col-sm-6 mb-3">
<label class="form-label">
{{p.t('studierendenantrag', 'antrag_datum_wiedereinstieg')}}
{{$p.t('studierendenantrag', 'antrag_datum_wiedereinstieg')}}
</label>
<div v-if="data.studierendenantrag_id">
@@ -279,7 +275,7 @@ export default {
</div>
<div v-else-if="stsem === null">
<select class="form-select" disabled>
<option selected>{{p.t('ui/select_studiensemester')}}</option>
<option selected>{{$p.t('ui/select_studiensemester')}}</option>
</select>
</div>
<div v-else>
@@ -295,8 +291,8 @@ export default {
</div>
</div>
<div v-if="data.studierendenantrag_id" class="mb-3">
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
<pre>{{data.grund}}</pre>
<h5>{{$p.t('studierendenantrag', 'antrag_grund')}}:</h5>
<textarea class="form-control" rows="5" readonly>{{data.grund}}</textarea>
</div>
<div v-else class="col-sm-6 mb-3">
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-grund'" class="form-label">Grund:</label>
@@ -316,14 +312,14 @@ export default {
<div class="col-12 mb-3">
<div v-if="data.studierendenantrag_id">
<a v-if="data.dms_id" target="_blank" :href="siteUrl + '/lehre/Antrag/Attachment/Show/' + data.dms_id"> {{p.t('studierendenantrag', 'antrag_dateianhaenge')}} </a>
<span v-else>{{p.t('studierendenantrag', 'no_attachments')}}</span>
<a v-if="data.dms_id" target="_blank" :href="siteUrl + '/lehre/Antrag/Attachment/Show/' + data.dms_id"> {{$p.t('studierendenantrag', 'antrag_dateianhaenge')}} </a>
<span v-else>{{$p.t('studierendenantrag', 'no_attachments')}}</span>
</div>
<div v-else>
<label
:for="'studierendenantrag-form-abmeldung-' + uuid + '-attachment'"
class="form-label">
{{p.t('studierendenantrag', 'antrag_dateianhaenge')}}
{{$p.t('studierendenantrag', 'antrag_dateianhaenge')}}
</label>
<input
class="form-control"
@@ -341,7 +337,7 @@ export default {
@click="createAntrag"
:disabled="saving"
>
{{p.t('studierendenantrag', 'btn_create_Unterbrechung')}}
{{$p.t('studierendenantrag', 'btn_create_Unterbrechung')}}
</button>
<button
v-else-if="data.status == 'Erstellt'"
@@ -350,7 +346,7 @@ export default {
@click="cancelAntrag"
:disabled="saving"
>
{{p.t('studierendenantrag', 'btn_cancel')}}
{{$p.t('studierendenantrag', 'btn_cancel')}}
</button>
</div>
</div>
@@ -1,6 +1,5 @@
import {CoreFetchCmpt} from '../../Fetch.js';
import VueDatepicker from '../../vueDatepicker.js.php';
import Phrasen from '../../../mixins/Phrasen.js';
var _uuid = 0;
@@ -9,9 +8,6 @@ export default {
CoreFetchCmpt,
VueDatepicker
},
mixins: [
Phrasen
],
emits: [
'setInfos',
'setStatus',
@@ -67,11 +63,11 @@ export default {
this.data = result.data.retval;
if (!this.data.status || this.data.status == 'ErsteAufforderungVersandt' || this.data.status == 'ZweiteAufforderungVersandt') {
this.data.status = 'Offen';
this.data.statustyp = this.p.t('studierendenantrag', 'status_open');
this.data.statustyp = this.$p.t('studierendenantrag', 'status_open');
}
this.$emit('update:status', this.data.status);
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
return result;
@@ -89,7 +85,7 @@ export default {
let nextState = repeat ? 'Erstellt' : 'Verzichtet';
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
severity: 'warning'
});
this.saving = true;
@@ -116,7 +112,7 @@ export default {
this.errors.default.push(result.data.retval[k]);
}
this.$emit('setStatus', {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
severity: 'danger'
});
}
@@ -129,7 +125,7 @@ export default {
this.data.status = nextState;
this.$emit('update:status', this.data.status);
this.$emit("setStatus", {
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
severity: this.statusSeverity
});
}
@@ -143,7 +139,7 @@ export default {
},
mounted() {
this.infos = [...Array(5).keys()].map(n => ({
body: this.p.t_ref('studierendenantrag', 'infotext_Wiederholung_' + n)
body: Vue.computed(() => this.$p.t('studierendenantrag', 'infotext_Wiederholung_' + n))
}));
this.$emit('setInfos', this.infos);
},
@@ -156,27 +152,27 @@ export default {
</div>
<table class="table">
<tr>
<th>{{p.t('lehre', 'studiengang')}}</th>
<th>{{$p.t('lehre', 'studiengang')}}</th>
<td align="right">{{data.bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('lehre', 'organisationsform')}}</th>
<th>{{$p.t('lehre', 'organisationsform')}}</th>
<td align="right">{{data.orgform_bezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
<td align="right">{{data.name}}</td>
</tr>
<tr>
<th>{{p.t('person', 'personenkennzeichen')}}</th>
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
<td align="right">{{data.matrikelnr}}</td>
</tr>
<tr>
<th>{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung')}}</th>
<th>{{$p.t('studierendenantrag', 'antrag_Wiederholung_pruefung')}}</th>
<td align="right">{{data.lvbezeichnung}}</td>
</tr>
<tr>
<th>{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung_date')}}</th>
<th>{{$p.t('studierendenantrag', 'antrag_Wiederholung_pruefung_date')}}</th>
<td align="right">{{datumPruefungFormatted}}</td>
</tr>
</table>
@@ -190,7 +186,7 @@ export default {
@click="createAntrag"
:disabled="saving"
>
{{p.t('studierendenantrag/antrag_Wiederholung_button_yes')}}
{{$p.t('studierendenantrag/antrag_Wiederholung_button_yes')}}
</button>
<!-- <button
v-if="!data.studierendenantrag_id || data.status == 'Offen'"
@@ -199,7 +195,7 @@ export default {
@click="cancelAntrag"
:disabled="saving"
>
{{p.t('studierendenantrag/antrag_Wiederholung_button_no')}}
{{$p.t('studierendenantrag/antrag_Wiederholung_button_no')}}
</button>-->
</div>
</div>
@@ -5,7 +5,6 @@ import GrundPopup from './Leitung/GrundPopup.js';
import LvPopup from './Leitung/LvPopup.js';
import BsAlert from '../Bootstrap/Alert.js';
import FhcLoader from '../Loader.js';
import Phrasen from '../../mixins/Phrasen.js';
export default {
components: {
@@ -14,7 +13,6 @@ export default {
LeitungActions,
FhcLoader
},
mixins: [Phrasen],
props: {
stgL: Array,
stgA: Array
@@ -31,12 +29,12 @@ export default {
stgkzL() {
if (!this.stgL)
return [];
return this.stgL.map(stg => stg.studiengang_kz);
return this.stgL.map(stg => parseInt(stg));
},
stgkzA() {
if (!this.stgA)
return [];
return this.stgA.map(stg => stg.studiengang_kz);
return this.stgA.map(stg => parseInt(stg));
}
},
methods: {
@@ -46,17 +44,18 @@ export default {
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/components/Antrag/Leitung/getActiveStgs'
).then(result => {
this.stgs = Object.values(result.data.retval).sort((a,b) => a.bezeichnung == b.bezeichnung ? (a.orgform == b.orgform ? 0 : (a.orgform > b.orgform ? 1 : -1)) : (a.bezeichnung > b.bezeichnung ? 1 : -1));
this.stgs = result.data.retval;
}).catch(error => {
console.error(error);
});
},
changeFilter(evt) {
this.filter = evt.target.value || undefined;
changeFilter(filter) {
this.filter = filter || undefined;
this.reload();
},
reload() {
this.$refs.table.reload(this.filter);
if (this.$refs.table)
this.$refs.table.reload(this.filter);
this.loadFilter();
},
download() {
@@ -79,7 +78,7 @@ export default {
{
let countAntrage = 0;
LvPopup
.popup(this.p.t('studierendenantrag','title_show_lvs', currentAntrag), {
.popup(this.$p.t('studierendenantrag','title_show_lvs', currentAntrag), {
antragId: currentAntrag.studierendenantrag_id,
footer: true,
dialogClass: 'modal-lg',
@@ -128,7 +127,7 @@ export default {
var currentAntrag = antraege.pop();
if (currentAntrag) {
GrundPopup
.popup(this.p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
.popup(this.$p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
countRemaining: antraege.length
})
.then(result => {
@@ -211,7 +210,7 @@ export default {
var currentAntrag = antraege.pop();
if (currentAntrag) {
GrundPopup
.popup(this.p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
.popup(this.$p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
countRemaining : antraege.length,
optional: true
})
@@ -338,6 +337,7 @@ export default {
ref="table"
:stg-a="stgkzA"
:stg-l="stgkzL"
:filter="filter"
v-model:columnData="columns"
v-model:selectedData="selectedData"
@action:approve="actionApprove"
@@ -1,13 +1,11 @@
import ActionsNew from './Actions/New.js';
import ActionsColumns from './Actions/Columns.js';
import Phrasen from '../../../mixins/Phrasen.js';
export default {
components: {
ActionsNew,
ActionsColumns
},
mixins: [Phrasen],
props: {
selectedData: Array,
columns: Array,
@@ -67,17 +65,17 @@ export default {
<div class="studierendenantrag-leitung-actions fhc-table-actions d-flex flex-wrap justify-content-between mb-2">
<div class="d-flex align-items-center gap-2">
<actions-new @reload="$emit('reload')"></actions-new>
<button type="button" class="btn btn-outline-secondary" @click="$emit('reload')" :title="p.t('table','reload')">
<button type="button" class="btn btn-outline-secondary" @click="$emit('reload')" :title="$p.t('table','reload')">
<i class="fa-solid fa-rotate-right"></i>
</button>
<span>{{p.t('table', 'with_selected', {count: selectedData.length})}}</span>
<button v-if="stgL.length" :disabled="!selectedCanBeApproved" type="button" class="btn btn-outline-secondary" @click="$emit('action:approve')">{{p.t('studierendenantrag', 'btn_approve')}}</button>
<button v-if="stgL.length" :disabled="!selectedCanBeRejected" type="button" class="btn btn-outline-secondary" @click="$emit('action:reject')">{{p.t('studierendenantrag', 'btn_reject')}}</button>
<button v-if="stgA.length" :disabled="!selectedCanBeReopened" type="button" class="btn btn-outline-secondary" @click="$emit('action:reopen')">{{p.t('studierendenantrag', 'btn_reopen')}}</button>
<span>{{$p.t('table', 'with_selected', {count: selectedData.length})}}</span>
<button v-if="stgL.length" :disabled="!selectedCanBeApproved" type="button" class="btn btn-outline-secondary" @click="$emit('action:approve')">{{$p.t('studierendenantrag', 'btn_approve')}}</button>
<button v-if="stgL.length" :disabled="!selectedCanBeRejected" type="button" class="btn btn-outline-secondary" @click="$emit('action:reject')">{{$p.t('studierendenantrag', 'btn_reject')}}</button>
<button v-if="stgA.length" :disabled="!selectedCanBeReopened" type="button" class="btn btn-outline-secondary" @click="$emit('action:reopen')">{{$p.t('studierendenantrag', 'btn_reopen')}}</button>
</div>
<div>
<button type="button" class="btn btn-link" data-bs-toggle="collapse" href="#columns" :title="p.t('table','spaltenEinAusblenden')"><i class="fa fa-table-columns"></i></button>
<button type="button" class="btn btn-link" @click="$emit('download')" :title="p.t('table','download')"><i class="fa fa-download"></i></button>
<button type="button" class="btn btn-link" data-bs-toggle="collapse" href="#columns" :title="$p.t('table','spaltenEinAusblenden')"><i class="fa fa-table-columns"></i></button>
<button type="button" class="btn btn-link" @click="$emit('download')" :title="$p.t('table','download')"><i class="fa fa-download"></i></button>
</div>
<div class="col-12">
<actions-columns id="columns" class="collapse" :columns="columns"></actions-columns>
@@ -6,9 +6,6 @@ export default {
toggleColumn(col) {
col.visible = !col.visible;
col.original.toggle()
},
show() {
}
},
template: `
@@ -1,15 +1,11 @@
import BsAlert from '../../../Bootstrap/Alert.js';
import BsModal from '../../../Bootstrap/Modal.js';
import Phrasen from '../../../../mixins/Phrasen.js';
export default {
components: {
BsModal,
AutoComplete: primevue.autocomplete
},
mixins: [
Phrasen
],
emits: [
'reload'
],
@@ -33,7 +29,7 @@ export default {
class: 'position-absolute top-0 start-0 w-100 h-100'
}), {
dialogClass: 'modal-fullscreen'
}, this.p.t('studierendenantrag', 'antrag_header')).then(() => {
}, this.$p.t('studierendenantrag', 'antrag_header')).then(() => {
this.$emit('reload');
this.student = '';
});
@@ -67,17 +63,17 @@ export default {
<div class="studierendenantrag-leitung-actions-new" v-if="data">
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#newAntragModal">
<i class="fa fa-plus"></i>
{{p.t('studierendenantrag','btn_new')}}
{{$p.t('studierendenantrag','btn_new')}}
</button>
<div ref="modal" class="modal fade" id="newAntragModal" tabindex="-1" aria-labelledby="newAntragModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="newAntragModalLabel">{{p.t('studierendenantrag','title_new_Abmeldung')}}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui','schliessen')"></button>
<h5 class="modal-title" id="newAntragModalLabel">{{$p.t('studierendenantrag','title_new_Abmeldung')}}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="$p.t('ui','schliessen')"></button>
</div>
<div class="modal-body">
<label for="newAntragModalAutoComplete">{{p.t('person','studentIn')}}</label>
<label for="newAntragModalAutoComplete">{{$p.t('person','studentIn')}}</label>
<div>
<auto-complete
class="w-100"
@@ -102,7 +98,7 @@ export default {
class="btn btn-primary"
:disabled="!this.student"
@click.prevent="openForm">
{{p.t('studierendenantrag','btn_create')}}
{{$p.t('studierendenantrag','btn_create')}}
</button>
</div>
</div>
@@ -1,11 +1,8 @@
import BsAlert from '../../Bootstrap/Alert.js';
import Phrasen from '../../../mixins/Phrasen.js';
export default {
mixins: [
BsAlert,
Phrasen
],
props: {
placeholder: String,
@@ -46,17 +43,17 @@ export default {
<div>
<textarea ref="input" class="form-control" :class="{'is-invalid' : isInvalid}" v-model="value"></textarea>
<div v-if="isInvalid" class="invalid-feedback">
{{p.t('kvp','new.error.required')}}
{{$p.t('kvp','new.error.required')}}
</div>
</div>
</template>
<template v-slot:footer>
<div v-if="countRemaining > 0" class="form-check flex-grow-1">
<input ref="check" type="checkbox" class="form-check-input" id="cbid" v-model="check">
<label class="form-check-label" for="cbid">{{p.t('studierendenantrag','fuer_alle_uebernehmen')}}</label>
<label class="form-check-label" for="cbid">{{$p.t('studierendenantrag','fuer_alle_uebernehmen')}}</label>
</div>
<button type="button" class="btn btn-primary" @click="submit">{{p.t('ui','ok')}}</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{p.t('ui','cancel')}}</button>
<button type="button" class="btn btn-primary" @click="submit">{{$p.t('ui','ok')}}</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{$p.t('ui','cancel')}}</button>
</template>
</bs-modal>`
}
@@ -1,23 +1,73 @@
import Phrasen from '../../../mixins/Phrasen.js';
const LOCAL_STORAGE_ID = 'studierendenantrag_leitung_2023-11-14_header_filter';
export default {
mixins: [Phrasen],
props: {
stgs: Array
},
emits: [
'input'
],
data() {
return {
todo_value: '',
stg_value: ''
}
},
computed: {
value() {
const a = [];
if (this.todo_value)
a.push(this.todo_value);
if (this.stg_value)
a.push(this.stg_value);
return a.join('/');
}
},
watch: {
value(n) {
window.localStorage.setItem(LOCAL_STORAGE_ID, n);
this.$emit('input', n);
}
},
created() {
var values = 'todo';
const savedPath = window.localStorage.getItem(LOCAL_STORAGE_ID);
if (savedPath !== null) {
values = savedPath;
}
values = values.split('/');
if (values.length) {
if (values.length == 1) {
if (values[0] == 'todo')
values.push('');
else
values.unshift('');
}
this.stg_value = values.pop();
this.todo_value = values.pop();
}
},
template: `
<div class="studierendenantrag-leitung-header fhc-table-header d-flex align-items-center mb-2 gap-2">
<h3 class="h5 col m-0">{{p.t('studierendenantrag', 'studierendenantraege')}}</h3>
<div v-if="stgs.length > 1" class="col-auto">
<select ref="stg_select" class="form-select" @input="$emit('input', $event)">
<option value="">{{p.t('global', 'alle')}}</option>
<option v-for="stg in stgs" :key="stg.studiengang_kz" :value="stg.studiengang_kz">
{{stg.bezeichnung}} ({{stg.orgform}})
</option>
</select>
<h3 class="h5 col m-0">{{$p.t('studierendenantrag', 'studierendenantraege')}}</h3>
<div class="col-auto row row-cols-lg-auto g-3 align-items-center">
<div class="col-12">
<select class="form-select" v-model="todo_value">
<option value="todo">{{$p.t('studierendenantrag', 'filter_todo')}}</option>
<option value="">{{$p.t('studierendenantrag', 'filter_all')}}</option>
</select>
</div>
<div class="col-12">
<select v-if="stgs.length > 1" class="form-select" v-model="stg_value">
<option value="">{{$p.t('global', 'alle')}}</option>
<option v-for="stg in stgs" :key="stg.studiengang_kz" :value="stg.studiengang_kz">
{{stg.bezeichnung}}
</option>
</select>
</div>
</div>
</div>
`
@@ -1,14 +1,12 @@
import BsAlert from '../../Bootstrap/Alert.js';
import {CoreFetchCmpt} from "../../Fetch.js";
import Phrasen from '../../../mixins/Phrasen.js';
export default {
components: {
CoreFetchCmpt
},
mixins: [
BsAlert,
Phrasen
BsAlert
],
props: {
footer: Boolean,
@@ -18,6 +16,7 @@ export default {
data(){
return {
lvs: null,
repeat_last: false,
refresh: true,
result: false,
check: false
@@ -37,13 +36,16 @@ export default {
},
methods: {
setlvs(param) {
if(param.error)
{
if(param.error) {
this.$refs.fetchCompt.error = true;
this.$refs.fetchCompt.errorMessage = param.retval;
}
else
} else {
this.repeat_last = !!param.retval.repeat_last;
if (this.repeat_last) {
delete param.retval.repeat_last;
}
this.lvs = param.retval;
}
},
loadlvs() {
if (!this.antragId)
@@ -79,29 +81,29 @@ export default {
@data-fetched="setlvs">
<template #default>
<div v-if="lvzugelassenLength == 0">
{{p.t('studierendenantrag','error_no_lvs')}}
{{$p.t('studierendenantrag','error_no_lvs')}}
</div>
<table v-else class="table caption-top" v-for="(lv_arr, sem) in lvzugelassen" :key="sem">
<caption>
<span class="d-flex justify-content-between">
<span>{{ p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][sem.substr(0,1)-1]) }}</span>
<span>{{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][repeat_last ? 1 : sem.substr(0,1)-1]) }}</span>
<span>{{sem.substr(1)}}</span>
</span>
</caption>
<thead v-if="lv_arr !== null">
<tr>
<th scope="col">{{p.t('ui','bezeichnung')}}</th>
<th scope="col">{{p.t('lehre','lehrform')}}</th>
<th scope="col">{{$p.t('ui','bezeichnung')}}</th>
<th scope="col">{{$p.t('lehre','lehrform')}}</th>
<th scope="col">ECTS</th>
<th scope="col">{{p.t('lehre','note')}}</th>
<th scope="col">{{$p.t('lehre','note')}}</th>
<th scope="col">
{{p.t('global','anmerkung')}}
{{$p.t('global','anmerkung')}}
</th>
</tr>
</thead>
<tbody>
<tr v-if="lv_arr === null" class="table-warning">
<td colspan="5">{{p.t('studierendenantrag/error_stg_last_semester')}}</td>
<td colspan="5">{{$p.t('studierendenantrag/error_stg_last_semester')}}</td>
</tr>
<template v-else>
<tr v-for="lv in lv_arr">
@@ -140,10 +142,10 @@ export default {
<template v-if="footer" v-slot:footer>
<div v-if="countRemaining > 0" class="form-check flex-grow-1">
<input ref="check" type="checkbox" class="form-check-input" id="cbid" v-model="check">
<label class="form-check-label" for="cbid">{{p.t('studierendenantrag','fuer_x_uebernehmen', {count: countRemaining})}}</label>
<label class="form-check-label" for="cbid">{{$p.t('studierendenantrag','fuer_x_uebernehmen', {count: countRemaining})}}</label>
</div>
<button type="button" class="btn btn-primary" @click="submit(true)">{{p.t('studierendenantrag','btn_approve')}}</button>
<button v-if="countRemaining > 0" type="button" class="btn btn-secondary" @click="submit(false)">{{p.t('ui','skip')}}</button>
<button type="button" class="btn btn-primary" @click="submit(true)">{{$p.t('studierendenantrag','btn_approve')}}</button>
<button v-if="countRemaining > 0" type="button" class="btn btn-secondary" @click="submit(false)">{{$p.t('ui','skip')}}</button>
</template>
</bs-modal>`
}
@@ -1,7 +1,6 @@
import BsModal from '../../Bootstrap/Modal.js';
import {CoreFetchCmpt} from '../../Fetch.js';
import LvPopup from './LvPopup.js';
import Phrasen from '../../../mixins/Phrasen.js';
import { dateFilter } from '../../../tabulator/filters/Dates.js';
export default {
@@ -10,12 +9,12 @@ export default {
CoreFetchCmpt,
LvPopup
},
mixins: [Phrasen],
props: {
selectedData: Array,
columnData: Array,
stgL: Array,
stgA: Array
stgA: Array,
filter: String
},
emits: [
'update:columnData',
@@ -41,10 +40,13 @@ export default {
},
methods: {
reload(stg) {
this.table.replaceData(this.ajaxUrl + (stg || ''));
this.table.setData(this.ajaxUrl + (stg || ''));
},
download() {
this.table.download("csv", "data.csv");
this.table.download("csv", "data.csv", {
delimiter: ';',
bom: true
});
},
getHistory() {
if (this.lastHistoryClickedId === null)
@@ -73,12 +75,13 @@ export default {
this.$refs.lvList.show();
}
},
mounted() {
async mounted() {
await this.$p.loadCategory(['lehre', 'studierendenantrag', 'person', 'global', 'ui']);
function dateFormatter(cell)
{
let val = cell.getValue();
if (!val)
return '';
return '&nbsp;';
let date = new Date(val);
return date.toLocaleDateString();
}
@@ -88,7 +91,7 @@ export default {
movableColumns: true,
maxHeight: '50vh',
layout: "fitDataFill",
ajaxURL: this.ajaxUrl,
ajaxURL: this.ajaxUrl + (this.filter || ''),
persistence: { // NOTE(chris): do not store column titles
sort: true, //persist column sorting
filter: true, //persist filters
@@ -97,7 +100,7 @@ export default {
page: true, //persist page
columns: ["width", "visible"], //persist columns
},
persistenceID: 'studierendenantrag_leitung',
persistenceID: 'studierendenantrag_leitung_2023-11-14',
columns: [{
formatter: 'rowSelection',
titleFormatter: 'rowSelection',
@@ -111,7 +114,7 @@ export default {
title: '#'
}, {
field: 'bezeichnung',
title: this.p.t('lehre', 'studiengang'),
title: this.$p.t('lehre', 'studiengang'),
headerFilter: 'list',
headerFilterParams: {
valuesLookup: true,
@@ -120,7 +123,7 @@ export default {
}
}, {
field: 'orgform',
title: this.p.t('lehre', 'organisationsform'),
title: this.$p.t('lehre', 'organisationsform'),
headerFilter: 'list',
headerFilterParams: {
valuesLookup: true,
@@ -129,7 +132,7 @@ export default {
}
}, {
field: 'typ',
title: this.p.t('studierendenantrag', 'antrag_typ'),
title: this.$p.t('studierendenantrag', 'antrag_typ'),
headerFilter: 'list',
headerFilterParams: {
valuesLookup: true,
@@ -137,11 +140,11 @@ export default {
autocomplete: true,
},
formatter: (cell, formatterParams, onRendered) => {
return this.p.t('studierendenantrag','antrag_typ_' + cell.getValue());
return this.$p.t('studierendenantrag','antrag_typ_' + cell.getValue());
}
}, {
field: 'statustyp',
title: this.p.t('studierendenantrag', 'antrag_status'),
title: this.$p.t('studierendenantrag', 'antrag_status'),
headerFilter: 'list',
headerFilterParams: {
valuesLookup: true,
@@ -163,59 +166,65 @@ export default {
}
}, {
field: 'matrikelnr',
title: this.p.t('person', 'personenkennzeichen'),
title: this.$p.t('person', 'personenkennzeichen'),
headerFilter: 'input'
}, {
field: 'prestudent_id',
title: this.p.t('lehre', 'prestudent'),
title: this.$p.t('lehre', 'prestudent'),
headerFilter: 'input'
}, {
field: 'name',
title: this.p.t('global', 'name'),
title: this.$p.t('global', 'name'),
mutator: (value, data) => (data.vorname + ' ' + data.nachname).replace(/^\s*(.*)\s*$/, '$1'),
headerFilter: 'input'
}, {
field: 'datum',
title: this.p.t('global', 'datum'),
title: this.$p.t('global', 'datum'),
formatter: dateFormatter,
headerFilterFunc: 'dates',
headerFilter: dateFilter
}, {
field: 'datum_wiedereinstieg',
title: this.p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'),
title: this.$p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'),
formatter: dateFormatter,
headerFilterFunc: 'dates',
headerFilter: dateFilter
}, {
field: 'grund',
title: this.p.t('studierendenantrag', 'antrag_grund'),
title: this.$p.t('studierendenantrag', 'antrag_grund'),
formatter: (cell, formatterParams, onRendered) => {
let link = document.createElement('a'),
val = cell.getValue();
link.href = "#modal-grund";
link.setAttribute('data-bs-toggle', 'modal');
link.innerHTML = this.p.t('studierendenantrag', 'antrag_grund');
link.innerHTML = this.$p.t('studierendenantrag', 'antrag_grund');
link.addEventListener('click', () => {
this.$refs.modalGrundPre.innerHTML = val;
});
return val ? link : '';
return val ? link : '&nbsp;';
}
}, {
field: 'dms_id',
title: this.p.t('studierendenantrag', 'antrag_dateianhaenge'),
title: this.$p.t('studierendenantrag', 'antrag_dateianhaenge'),
formatter: (cell, formatterParams, onRendered) => {
let val = cell.getValue();
if (!val)
return '';
return '<a href="' + FHC_JS_DATA_STORAGE_OBJECT.app_root +
return '&nbsp;';
let link = document.createElement('a');
link.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/lehre/Antrag/Attachment/show/' + val + '" target="_blank"><i class="fa fa-paperclip" aria-hidden="true"></i> ' + this.p.t('studierendenantrag', 'antrag_anhang') + '</a>';
'/lehre/Antrag/Attachment/show/' +
val;
link.setAttribute('target', '_blank');
link.innerHTML = '<i class="fa fa-paperclip" aria-hidden="true"></i>';
link.append(this.$p.t('studierendenantrag/antrag_anhang'));
return link;
}
}, {
field: 'actions',
frozen: true,
title: this.p.t('ui', 'aktion'),
title: this.$p.t('ui', 'aktion'),
headerFilter: false,
headerSort: false,
formatter: (cell, formatterParams, onRendered) => {
@@ -227,7 +236,9 @@ export default {
if ((data.typ == 'Abmeldung' || data.typ == 'AbmeldungStgl' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt' || data.status == 'Beeinsprucht' || data.status == 'EinspruchAbgelehnt' || data.status == 'EmailVersandt')) {
// NOTE(chris): Download PDF
let button = document.createElement('a');
button.innerHTML = '<i class="fa-solid fa-download" title="' + this.p.t('studierendenantrag', 'btn_download_antrag') + '"></i>';
// NOTE(chris): phrasen in attribues don't work if they are not preloaded
// it work in this case because the category has already been loaded before
button.innerHTML = '<i class="fa-solid fa-download" title="' + this.$p.t('studierendenantrag', 'btn_download_antrag') + '"></i>';
button.className = "btn btn-outline-secondary";
button.target = "_blank";
button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
@@ -237,7 +248,7 @@ export default {
if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') {
// NOTE(chris): Object
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_object');
button.append(this.$p.t('studierendenantrag', 'btn_object'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:object', [cell.getData()]));
container.append(button);
@@ -246,14 +257,14 @@ export default {
if (data.typ == 'AbmeldungStgl' && data.status == 'Beeinsprucht') {
// NOTE(chris): Deny Objection
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_deny');
button.append(this.$p.t('studierendenantrag', 'btn_objection_deny'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:objectionDeny', [cell.getData()]));
container.append(button);
// NOTE(chris): Approve Objection
button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_approve');
button.append(this.$p.t('studierendenantrag', 'btn_objection_approve'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:objectionApprove', [cell.getData()]));
container.append(button);
@@ -263,7 +274,7 @@ export default {
// NOTE(chris): Reopen
if (data.typ == 'Wiederholung' && data.status == 'Verzichtet') {
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_reopen');
button.append(this.$p.t('studierendenantrag', 'btn_reopen'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:reopen', [cell.getData()]));
container.append(button);
@@ -271,7 +282,7 @@ export default {
// NOTE(chris): Lv Zuweisen
if (data.typ == 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'Lvszugewiesen')) {
let button = document.createElement('a');
button.innerHTML = this.p.t('studierendenantrag', 'btn_lvzuweisen');
button.append(this.$p.t('studierendenantrag', 'btn_lvzuweisen'));
button.className = "btn btn-outline-secondary";
button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
@@ -284,7 +295,7 @@ export default {
class: 'position-absolute top-0 start-0 w-100 h-100'
}), {
dialogClass: 'modal-fullscreen'
}, this.p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => {
}, this.$p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => {
this.$emit('reload');
});
};
@@ -293,7 +304,7 @@ export default {
// NOTE(chris): Cancel
if (data.typ == 'AbmeldungStgl' && (data.status == 'Erstellt' || data.status == 'Genehmigt' )) {
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_cancel');
button.append(this.$p.t('studierendenantrag', 'btn_cancel'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click',() => this.$emit('action:cancel', [cell.getData()]));
container.append(button);
@@ -304,7 +315,7 @@ export default {
// NOTE(chris): Approve
if ((data.typ == 'Wiederholung' && data.status == 'Lvszugewiesen') || (data.typ != 'Wiederholung' && data.status == 'Erstellt')) {
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_approve');
button.append(this.$p.t('studierendenantrag', 'btn_approve'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:approve', [cell.getData()]));
container.append(button);
@@ -312,7 +323,7 @@ export default {
// NOTE(chris): Reject (Unterbrechung braucht grund)
if (data.status == 'Erstellt' && data.typ == 'Unterbrechung') {
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_reject');
button.append(this.$p.t('studierendenantrag', 'btn_reject'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:reject', [cell.getData()]));
container.append(button);
@@ -322,12 +333,15 @@ export default {
// NOTE(chris): Show LVs
if (data.typ == 'Wiederholung' && (data.status == 'Lvszugewiesen' || data.status == 'Genehmigt')) {
let button = document.createElement('button');
button.innerHTML = this.p.t('studierendenantrag', 'btn_show_lvs');
button.append(this.$p.t('studierendenantrag', 'btn_show_lvs'));
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.showLVs(cell.getData()));
container.append(button);
}
if (container.innerHTML == '')
container.innerHTML = '&nbsp;';
return container;
}
}]
@@ -355,11 +369,11 @@ export default {
<div class="studierendenantrag-leitung-table">
<div ref="table"></div>
<bs-modal ref="modalGrund" id="modal-grund" class="fade">
<template #title>{{p.t('studierendenantrag', 'antrag_grund')}}</template>
<pre ref="modalGrundPre"></pre>
<template #title>{{$p.t('studierendenantrag', 'antrag_grund')}}</template>
<textarea class="form-control" ref="modalGrundPre" style="width: 100%; height: 250px;" readonly></textarea>
</bs-modal>
<bs-modal ref="history" class="fade">
<template #title>{{p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}</template>
<template #title>{{$p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}</template>
<core-fetch-cmpt ref="historyLoader" :api-function="getHistory">
<table v-if="historyData.length" class="table">
<tr v-for="status in historyData" :key="status.studierendenantrag_status_id">
@@ -368,7 +382,7 @@ export default {
<td>{{status.typ}}</td>
<td>
<a v-if="status.grund" href="#modal-grund" data-bs-toggle="modal" @click="showHistoryGrund(status.grund)">
{{p.t('studierendenantrag', 'antrag_grund')}}
{{$p.t('studierendenantrag', 'antrag_grund')}}
</a>
</td>
</tr>
@@ -376,7 +390,7 @@ export default {
</core-fetch-cmpt>
</bs-modal>
<lv-popup ref="lvList" class="fade" :antrag-id="lvsData ? lvsData.studierendenantrag_id : null">
{{p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }}
{{$p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }}
</lv-popup>
</div>
`
@@ -1,11 +1,9 @@
import StudierendenantragStatus from './Status.js';
import Phrasen from '../../mixins/Phrasen.js';
export default {
components: {
StudierendenantragStatus
},
mixins: [Phrasen],
props: {
antragId: Number,
initialStatusCode: String,
@@ -43,10 +41,11 @@ export default {
methods: {
save() {
this.isloading = true;
const forbiddenLvs = this.lvs1.filter(lv => lv.antrag_zugelassen && !lv._children).map(lv => ({
const forbiddenLvs = this.lvs1.filter(lv => (lv.antrag_zugelassen || this.lvs.repeat_last)
&& !lv._children).map(lv => ({
studierendenantrag_id: this.antragId,
lehrveranstaltung_id: lv.lehrveranstaltung_id,
zugelassen: 0,
zugelassen: this.lvs.repeat_last ? (lv.antrag_zugelassen ? 1 : 2) : 0,
anmerkung: lv.antrag_anmerkung || "",
studiensemester_kurzbz: this.lvs1sem
}));
@@ -64,7 +63,7 @@ export default {
this.statusCode = response.data.retval[0].studierendenantrag_statustyp_kurzbz;
this.statusMsg = response.data.retval[0].typ;
} else {
this.addAlert(response.data.retval, 'alert-danger');
this.addAlert(response.data.retval.message || response.data.retval, 'alert-danger');
this.statusCode = 0;
this.statusMsg = 'Error';
}
@@ -107,119 +106,131 @@ export default {
else
{
let res = {};
for (var k in result.data.retval) {
if (result.data.retval[k] === null) {
const alert = document.createElement('div');
alert.innerHTML = this.p.t('studierendenantrag', 'error_stg_last_semester');
alert.className = 'alert alert-warning';
alert.role = 'alert';
this.$refs["lvtable" + k.substr(0,1)].append(alert);
continue;
}
let lvs = result.data.retval[k].reduce((obj,lv) => {
obj[lv.studienplan_lehrveranstaltung_id] = lv;
return obj;
}, {});
for (var lv of Object.values(lvs)) {
if (!lv.studienplan_lehrveranstaltung_id_parent)
continue;
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent])
console.error('parent not available');
else {
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children)
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = [];
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv);
}
}
res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent);
let current = res[k];
let index = k.substr(0,1);
var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], {
data: current,
dataTree: true,
dataTreeStartExpanded: true, //start with an expanded tree
dataTreeChildIndent: 15,
layout: "fitDataStretch",
columns: [
{title: this.p.t('ui','bezeichnung'), field: "bezeichnung"},
{title: this.p.t('lehre','lehrform'), field: "lehrform_kurzbz"},
{title: "ECTS", field: "ects"},
{title: this.p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"},
{title: (index==1) ? this.p.t('studierendenantrag','lv_nicht_zulassen') : this.p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => {
let data = cell.getData();
if(data._children || !data.zeugnis)
return "";
let input = document.createElement('input');
input.className = "form-check-input";
input.type = "checkbox";
input.role = "switch";
input.checked = cell.getValue();
input.addEventListener('input', () => {
lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked;
cell.getRow().reformat();
});
if (this.disabled) {
input.disabled = true;
}
let div = document.createElement('div');
div.className = 'form-check form-switch';
div.append(input);
return div;
}},
{
title: this.p.t('global','anmerkung'),
field: "antrag_anmerkung",
headerSort:false,
titleFormatter:(cell, formatterParams, onRendered)=>{
let link = document.createElement('a');
link.addEventListener('click', (e) => {
e.preventDefault();
});
link.href ="#";
link.title = this.p.t('studierendenantrag','anmerkung_tooltip');
new bootstrap.Tooltip(link);
let tooltip = document.createElement('span');
tooltip.innerHTML = this.p.t('global','anmerkung') + " ";
tooltip.append(link);
let icon = document.createElement('i');
link.append(icon);
icon.className = "fa fa-info-circle";
icon.setAttribute("aria-hidden", "true");
icon.style.minWidth = '1em';
return tooltip;
},
formatter: (cell, formatterParams, onRendered) => {
if (this.disabled) {
return cell.getValue() || "";
}
var data = cell.getData();
if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen)
{
let input = document.createElement('input');
input.className = "form-control";
input.type = "text";
input.value = cell.getValue() || "";
input.addEventListener('input', () => {
lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value;
});
return input;
}
else
{
return "";
}
this.$p
.loadCategory(['ui', 'lehre', 'studierendenantrag', 'global'])
.then(() => {
for (var k in result.data.retval) {
if (k === 'repeat_last')
continue;
if (result.data.retval[k] === null) {
const alert = document.createElement('div');
alert.innerHTML = this.$p.t('studierendenantrag', 'error_stg_last_semester');
alert.className = 'alert alert-warning';
alert.role = 'alert';
this.$refs["lvtable" + k.substr(0,1)].append(alert);
continue;
}
let lvs = result.data.retval[k].reduce((obj,lv) => {
obj[lv.studienplan_lehrveranstaltung_id] = lv;
return obj;
}, {});
for (var lv of Object.values(lvs)) {
if (!lv.studienplan_lehrveranstaltung_id_parent)
continue;
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent])
console.error('parent not available');
else {
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children)
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = [];
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv);
}
}
]
res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent);
let current = res[k];
let index = k.substr(0,1);
const options = {
data: current,
dataTree: true,
dataTreeStartExpanded: true, //start with an expanded tree
dataTreeChildIndent: 15,
layout: "fitDataStretch",
columns: [
{title: this.$p.t('ui', 'bezeichnung'), field: "bezeichnung"},
{title: this.$p.t('lehre','lehrform'), field: "lehrform_kurzbz"},
{title: "ECTS", field: "ects"},
{title: this.$p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"},
{
title: index == 1 && !result.data.retval.repeat_last ? this.$p.t('studierendenantrag','lv_nicht_zulassen') : this.$p.t('studierendenantrag','lv_wiederholen'),
field: "antrag_zugelassen",
formatter: (cell, formatterParams, onRendered) => {
let data = cell.getData();
if(data._children || !data.zeugnis)
return "";
let input = document.createElement('input');
input.className = "form-check-input";
input.type = "checkbox";
input.role = "switch";
input.checked = cell.getValue();
input.addEventListener('input', () => {
lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked;
cell.getRow().reformat();
});
if (this.disabled) {
input.disabled = true;
}
let div = document.createElement('div');
div.className = 'form-check form-switch';
div.append(input);
return div;
}
},
{
title: this.$p.t('global','anmerkung'),
field: "antrag_anmerkung",
headerSort:false,
titleFormatter:(cell, formatterParams, onRendered)=>{
let link = document.createElement('a');
link.addEventListener('click', (e) => {
e.preventDefault();
});
link.href ="#";
link.title = this.$p.t('studierendenantrag','anmerkung_tooltip');
new bootstrap.Tooltip(link);
let tooltip = document.createElement('span');
tooltip.innerHTML = this.$p.t('global','anmerkung') + " ";
tooltip.append(link);
let icon = document.createElement('i');
link.append(icon);
icon.className = "fa fa-info-circle";
icon.setAttribute("aria-hidden", "true");
icon.style.minWidth = '1em';
return tooltip;
},
formatter: (cell, formatterParams, onRendered) => {
if (this.disabled) {
return cell.getValue() || "";
}
var data = cell.getData();
if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen)
{
let input = document.createElement('input');
input.className = "form-control";
input.type = "text";
input.value = cell.getValue() || "";
input.addEventListener('input', () => {
lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value;
});
return input;
}
else
{
return "";
}
}
}
]
};
var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], options);
}
this.lvs = result.data.retval;
});
}
this.lvs = result.data.retval;
}
}
);
@@ -229,20 +240,20 @@ export default {
<div ref="alertbox"></div>
<span class="d-flex justify-content-between h4">
<span>{{p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
<span>{{lvs.repeat_last ? $p.t('studierendenantrag', 'title_lv_wiederholen') : $p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
<span>{{lvs1sem}}</span>
</span>
<div ref="lvtable1" class="mb-3">
</div>
<span class="d-flex justify-content-between h4">
<span>{{p.t('studierendenantrag', 'title_lv_wiederholen')}}</span>
<span>{{$p.t('studierendenantrag', 'title_lv_wiederholen')}}</span>
<span>{{lvs2sem}}</span>
</span>
<div ref="lvtable2">
</div>
<button type="button" @click="save" :disabled="isloading || disabled" class="btn btn-primary my-3">{{p.t('studierendenantrag', 'btn_save_lvs')}}</button>
<button type="button" @click="save" :disabled="isloading || disabled" class="btn btn-primary my-3">{{$p.t('studierendenantrag', 'btn_save_lvs')}}</button>
</div>
<div class="col-sm-2">
<studierendenantrag-status :msg="statusMsg" :severity="statusSeverity"></studierendenantrag-status>

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