Compare commits

..

1742 Commits

Author SHA1 Message Date
cgfhtw f269960adc FHC_Lang core class 1st draft 2024-08-02 14:13:41 +02:00
Harald Bamberger d0f3cee7de add permissions for vw_oe_path 2024-07-29 18:11:13 +02:00
Harald Bamberger e6684a0116 add db view that contains oe path 2024-07-29 17:41:24 +02:00
Harald Bamberger 965e23dba7 Merge branch 'feature-40743/Anrechnung_Config-fuer-zusaetzliche-Felder' 2024-07-17 14:08:55 +02:00
Harald Bamberger f064a29efc Merge branch 'master' into feature-40743/Anrechnung_Config-fuer-zusaetzliche-Felder 2024-07-17 08:02:55 +02:00
Harald Bamberger 6dd1dc62bf Merge branch 'feature-39592/vereinfachte_Sicht_fuer_Assistenz' 2024-07-16 20:59:48 +02:00
Harald Bamberger fcacd2a660 Merge branch 'master' into feature-39592/vereinfachte_Sicht_fuer_Assistenz 2024-07-16 14:23:16 +02:00
Harald Bamberger 8c9ed2c52c Textaenderung 2024-07-16 14:19:32 +02:00
Harald Bamberger 36aab1b579 Merge branch 'feature-36555/Studstatus_HinweistextFAS_Pruefungsdatum' 2024-07-16 14:11:34 +02:00
Harald Bamberger 3c50ffd945 remove unnecessary style 2024-07-16 14:07:44 +02:00
Harald Bamberger bf1f0428ea use textbox to retain layout 2024-07-15 19:06:19 +02:00
Harald Bamberger f49161420d try to improve layout 2024-07-15 18:18:53 +02:00
Harald Bamberger 464dbba457 add missing api js files 2024-07-11 18:43:31 +02:00
Harald Bamberger 9d455c35d0 Betriebsmittel.js: use arrow function for dynamic ajaxParams, Filter.js: remove required from filterType 2024-07-11 18:32:47 +02:00
Harald Bamberger 3f84024ce8 uncomment null check, layout of hint 2024-07-11 17:35:18 +02:00
Harald Bamberger 16ab9998b0 Merge branch 'master' into feature-39592/vereinfachte_Sicht_fuer_Assistenz 2024-07-11 14:44:44 +02:00
Harald Bamberger 115151473a backport recent changes of Betriebsmittel component and phrases from feature-30660/FHC4_StudierendenGUI_Prototyp Branch 2024-07-11 11:57:45 +02:00
Cris a23b133217 Adapted requestAnrechnung.js to handle submit data and events on Begruendung-zur-Gleichwertigkeit fields
...depending on $config['explain_equivalence']
2024-07-11 10:54:43 +02:00
Cris 1139b251ef Adapted Views to handle display of Begruendung-zur-Gleichwertigkeit fields
...depending on $config['explain_equivalence']
2024-07-11 10:52:51 +02:00
Cris 8c3b85066a Adapted Controller RequestAnrechnung.php to handle Begruendung-zur-Gleichwertigkeit fields
...depending on $config['explain_equivalence']
2024-07-11 10:49:05 +02:00
Cris 0b48e94d3c Added config variable $config['explain_equivalence'] (Begruendung zu Gleichwertigkeit)
...to display and enable 'Begründung zu Gleichwertigkeit'-fields
2024-07-11 10:44:12 +02:00
Harald Bamberger 46ea054bac change text, add config to show hint or not, styling 2024-07-10 15:52:57 +02:00
Cris 03205674aa Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-07-10 15:51:51 +02:00
Harald Bamberger 8b254b3967 Merge branch 'master' into feature-36555/Studstatus_HinweistextFAS_Pruefungsdatum 2024-07-09 11:52:07 +02:00
Harald Bamberger c4ef0f998c Merge branch 'feature-40285/Studstatus_Datum_der_Abmeldung_auf_den_3_Abmeldungsdokumenten' 2024-07-09 11:49:41 +02:00
Harald Bamberger 37fb9dd851 use date that seems more stable than one that depends on a config entry that may change over time and then change the date in previous documents 2024-07-09 11:38:16 +02:00
Harald Bamberger 2a537df687 Merge branch 'master' into feature-40285/Studstatus_Datum_der_Abmeldung_auf_den_3_Abmeldungsdokumenten 2024-07-09 10:35:40 +02:00
Harald Bamberger dd0bdddbc6 backport recent changes of Betriebsmittel component and phrases from feature-30660/FHC4_StudierendenGUI_Prototyp Branch 2024-07-01 14:12:48 +02:00
Cris e8fe3c2eff Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-06-26 11:53:28 +02:00
Andreas Österreicher b56e8c5f9f Im Abschlusspruefung Karteireiter wird in der Liste bei der Beurteilung jetzt die
Bezeichnung der Note angezeigt anstatt der Kurzbz
2024-06-21 13:02:55 +02:00
cgfhtw 9c53a7a75b PDF Download Button während Einspruchsfrist verbergen 2024-06-19 14:02:20 +02:00
Harald Bamberger 1f36a08f05 Merge branch 'merge_37107_37133_39212' 2024-06-19 11:41:11 +02:00
cgfhtw 631a552708 Datum bei Abmeldung d Stud PDF 2024-06-19 10:55:48 +02:00
Harald Bamberger ea9c35a64b Merge branch 'feature-37107/Fristenmanagement' into merge_37107_37133_39212 2024-06-19 10:28:39 +02:00
Harald Bamberger 04c006a733 do not create dummy manual events 2024-06-19 10:28:03 +02:00
Harald Bamberger aff1f9126f Merge branch 'master' into merge_37107_37133_39212 2024-06-19 09:45:05 +02:00
cgfhtw a8acf91980 Datum bei Abmeldung Fristablauf d WH PDF 2024-06-19 09:21:13 +02:00
Andreas Österreicher fb77ab67e7 Prüfungshonorare im Notenkarteireiter zeigen nur aktive Mitarbeiter an 2024-06-19 09:05:08 +02:00
Harald Bamberger d3a277f9fb Merge branch 'feature-39212/PV21-Grund_beim_Beenden_eines_DV' into merge_37107_37133_39212 2024-06-19 08:52:03 +02:00
Harald Bamberger 0aa53f64ff db Aenderungen Gegenpruefung hinzugefuegt 2024-06-19 08:51:34 +02:00
cgfhtw 3e0c15e18f Datum bei Abmeldung d StgL PDF 2024-06-18 11:12:12 +02:00
Cris 538c2e09ce Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-06-17 14:20:43 +02:00
Harald Bamberger e05fa0f4d8 Merge branch 'master' into merge_37107_37133_39212 2024-06-14 11:50:32 +02:00
Harald Bamberger c3278ad30f add app softwarebereitstellung to prevent checksystem errors when adding phrases for softwarebereitstellung while not having installed the extension 2024-06-14 11:49:43 +02:00
Harald Bamberger e4326e00e4 Merge branch 'feature-39212/PV21-Grund_beim_Beenden_eines_DV' into merge_37107_37133_39212 2024-06-14 11:02:25 +02:00
Harald Bamberger 93d0f88b0d function getDVByPersonUID: add dvendegrund_kurzbz and dvendegrund_anmerkung to select 2024-06-14 10:48:43 +02:00
Harald Bamberger 1c385d22cd Merge branch 'feature-37133/Gehaltsbaender' into merge_37107_37133_39212 2024-06-14 10:41:48 +02:00
Harald Bamberger 24786c6ae6 Merge branch 'feature-37107/Fristenmanagement' into merge_37107_37133_39212 2024-06-13 13:30:38 +02:00
Harald Bamberger 0e5d4b30ed Merge branch 'master' into feature-37133/Gehaltsbaender 2024-06-13 13:26:48 +02:00
Harald Bamberger 4e233f760d Merge branch 'master' into feature-37107/Fristenmanagement 2024-06-13 13:26:02 +02:00
Harald Bamberger fd2474cc38 Merge branch 'master' into feature-39212/PV21-Grund_beim_Beenden_eines_DV 2024-06-13 11:51:10 +02:00
Andreas Österreicher 20eee62c19 Merge branch 'sonstiges-40279/SWB-Lizenzserverport' 2024-06-13 11:13:30 +02:00
Werner Masik eb327c3adc update Handyverwaltung filter 2024-06-12 14:52:22 +02:00
Harald Bamberger 1e56707e5a Merge branch 'feature-40415/Studstatus-UID_in_Sancho_Message_Abmeldung_StG_Ablauf_Einspruchsfrist' 2024-06-12 08:13:11 +02:00
Harald Bamberger 6816a300f6 Beschriftung korrigiert 2024-06-11 16:39:20 +02:00
Harald Bamberger 0b8191a435 Beschriftung zu IDs in Sancho Message hinzugefuegt 2024-06-11 16:26:52 +02:00
Harald Bamberger f8d8a44a3c student_uid zu sancho message Abmeldung StG Ablauf Einspruchsfrist 2024-06-11 14:47:54 +02:00
Cris cd0eacf947 Updated phrases: Added phrases 'lizenzserverPort' and 'raumSwZuordnung' 2024-06-11 13:52:03 +02:00
Cris dd47cd2a7c Updated filter: Added lizenzserver_kurzbz and lizenzserver_port to SoftwareManagement filter 2024-06-11 13:51:03 +02:00
Cris a4b77fc43f Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-06-11 11:32:47 +02:00
Andreas Österreicher f943ae7566 Merge branch 'feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' 2024-06-10 14:05:49 +02:00
Cris f1547b069d Merge branch 'feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' of https://github.com/FH-Complete/FHC-Core into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2024-06-10 13:37:46 +02:00
Cris ac7dc1599c Corrected path to init.js.php 2024-06-10 13:37:14 +02:00
Andreas Österreicher 46b7dc1ce7 Dauer für die Anzeige von abgelaufenen Projekten in der Zeitaufzeichnung
auf 2 Monate verlängert
2024-06-07 10:19:12 +02:00
Werner Masik cd8fffd2f7 added filter update for Handyverwaltung 2024-06-04 16:20:43 +02:00
Cris 125a2da9b3 Merge branch 'feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' of https://github.com/FH-Complete/FHC-Core into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2024-06-04 16:16:49 +02:00
Cris 884d930e71 Merge branch 'master' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2024-06-04 16:05:33 +02:00
Cris 49045c06af Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-06-04 16:04:19 +02:00
Harald Bamberger 7b148b1a39 Merge branch 'master' into feature-39212/PV21-Grund_beim_Beenden_eines_DV 2024-06-03 17:21:50 +02:00
Harald Bamberger 0cbb8997e2 migratecontract config und config check auch in MigrateHourlyRate verwenden 2024-06-03 17:14:55 +02:00
Cris 512002c0e8 Created init.js file and changed link url in stpl_week to open Software-Raumsuche by OrtKurzbz 2024-06-03 16:40:35 +02:00
Cris 9652f48044 Added phrases 'zugeklappt', 'softwareliste', 'raumverfuegbarkeit' 2024-06-03 16:27:31 +02:00
Harald Bamberger 9454bde14a backport Betriebsmittel Component from feature-30660/FHC4_StudierendenGUI_Prototyp Branch 2024-05-29 15:19:23 +02:00
Harald Bamberger a924c9d2bb backport Betriebsmittel Component from feature-30660/FHC4_StudierendenGUI_Prototyp Branch 2024-05-29 11:49:11 +02:00
Andreas Österreicher 5453579c7b Merge branch 'feature-36963/BIS_check_duales_Studium' 2024-05-28 09:29:44 +02:00
KarpAlex d8ba92e343 Merge branch 'master' into feature-36963/BIS_check_duales_Studium 2024-05-27 19:42:48 +02:00
cgfhtw d5e8227918 Bugfix: api/frontend/fas controller do not inherit from FHCAPI_Controller 2024-05-27 12:45:10 +02:00
Harald Bamberger 8cba0aec5a vertragsarten dvbund, dvanderegk und dvanderebet hinzugefuegt, MigrateContract default oe und ba1code mapping in config verschoben und config check implementiert 2024-05-22 15:32:28 +02:00
Cris aab198e355 Merge branch 'master' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2024-05-22 11:03:34 +02:00
Cris 559a6b317d Fixed multiple display of child software 2024-05-21 14:44:41 +02:00
Cris 66a80697c2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-05-21 14:21:34 +02:00
Werner Masik 706dad6df6 added DV Ende 2024-05-16 21:58:34 +02:00
Harald Bamberger f2a2469e6e MigrateContract: keine ZeitaufzeichnungsVbs erstellen wenn za oder azg flag null ist. MigrateHourlyRate: kalkulatorische Stundensaetze nur migrieren wenn SAP Sync Tabelle existiert. 2024-05-15 17:25:26 +02:00
Cris c4c17f69c7 Added phrase softwaretypKurzbz 2024-05-14 13:41:33 +02:00
Cris 8a0d2a2f10 Refactored Tabs title assignment to utilize computed property
This is necessary to render language phrases correctly
2024-05-13 14:02:05 +02:00
Cris 6d728ae0e7 Merge branch 'master' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software
# Conflicts:
#	public/js/components/Tabs.js
#	public/js/components/filter/Filter.js
2024-05-13 12:07:37 +02:00
Cris 58f52dfaae Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-05-13 11:07:16 +02:00
Cris 5643607845 Added phrases 'statusErfolgreichUebertragen' and 'statusUebertragenMsg' to Softwarebereitstellung app 2024-05-13 11:06:32 +02:00
Harald Bamberger 93b111af93 fix handleSystemError is not a function 2024-05-06 16:48:38 +02:00
Harald Bamberger 6a8a96b748 fix long lasting request getPrestudents to block browser when timedout once 2024-05-06 16:04:45 +02:00
Harald Bamberger 69b0b3601d Merge branch 'master' into feature-39212/PV21-Grund_beim_Beenden_eines_DV 2024-05-03 13:08:12 +02:00
Andreas Österreicher 40c0393bc0 Voller Name der Kritikalität des Services wird angezeigt im
Servicekatalog
2024-05-02 16:31:34 +02:00
Andreas Österreicher c6193530db Merge branch 'feature-39288/Servicekatalog_Kritikalitaet' 2024-05-02 16:27:09 +02:00
Harald Bamberger 3a3d28e9e6 Merge branch 'feature-37246/APIs_Konsolidierung' 2024-04-30 21:45:48 +02:00
Harald Bamberger 3b8776f947 Merge branch 'master' into feature-37246/APIs_Konsolidierung 2024-04-30 16:26:15 +02:00
Andreas Österreicher 23255ed84f Merge branch 'feature-17727/FasDefaultStundensatzProjektbetreuungAnzeigen' 2024-04-30 16:17:00 +02:00
Andreas Österreicher a3b5996c50 Stundensatz wird abhängig vom Studiensemester der Projektarbeit /
Lehreinheit ermittelt
2024-04-30 16:16:03 +02:00
Andreas Österreicher a606add6eb Merge branch 'master' into feature-17727/FasDefaultStundensatzProjektbetreuungAnzeigen 2024-04-30 10:55:58 +02:00
KarpAlex 18dabf26e4 service uebersicht in cis: loading only one moodle config instead of all addon configs to avoid php notices 2024-04-29 14:00:30 +02:00
Harald Bamberger ef5040557d Merge branch 'master' into feature-37246/APIs_Konsolidierung 2024-04-29 09:37:06 +02:00
Andreas Österreicher 8999b59f4e Renamed Field 2024-04-26 13:41:33 +02:00
Harald Bamberger 2ea3597a10 Merge branch 'master' into feature-39212/PV21-Grund_beim_Beenden_eines_DV 2024-04-25 15:11:41 +02:00
Harald Bamberger 08dd6a7783 add dvendegrund_kurzbz and dvendegrund_anmerkung when reading dvs from db 2024-04-25 15:11:16 +02:00
Andreas Österreicher d55cb56a1a Merge branch 'bug-39609/automatischer_abgewiesener_status_setzen' 2024-04-25 14:24:43 +02:00
ma0048 8bac75ae52 - bug behoben, damit keine leeren "Status Abgewiesen gesetzt" Mails verschickt werden 2024-04-25 14:20:18 +02:00
Werner Masik 3b06519f2f updated phrases for salary range 2024-04-24 15:25:42 +02:00
Werner Masik c15a350392 moved dbUpdate for gehaltsband to extension 2024-04-24 14:55:22 +02:00
Harald Bamberger c33a11e952 Merge branch 'master' into feature-37246/APIs_Konsolidierung 2024-04-24 08:30:25 +02:00
Harald Bamberger 844c07be9c Merge branch 'feature-39174/Studstatus_AbmeldungStglFuerUnterbrecher' 2024-04-24 08:25:51 +02:00
Harald Bamberger 5175dcdbe4 Merge branch 'master' into feature-37246/APIs_Konsolidierung 2024-04-23 15:57:50 +02:00
Andreas Österreicher 0655118f2b Merge branch 'feature-39349/tdb_phrasen' 2024-04-19 10:38:39 +02:00
Alexei Karpenko 412bb10a06 Servicekatalog: renamed Kategorie column to Kritikalität in vilesci, added column Kritikalitaet in cis overview 2024-04-18 15:38:22 +02:00
Andreas Österreicher 3a4492671d Fixed Signing Documents via CIS 2024-04-18 08:53:22 +02:00
Werner Masik b2deea6962 added db schema for Gehaltsbaender 2024-04-17 16:40:12 +02:00
Andreas Österreicher 8a115626ba CDATA bei Lernergebnisse hinzugefügt 2024-04-16 10:33:27 +02:00
Andreas Österreicher 20aba9aa90 Merge branch 'feature-27349/DiplomaSupplementQuereinstiegerRahmenvertrag' 2024-04-16 10:22:48 +02:00
Andreas Österreicher 8057ecbc60 Merge branch 'feature-15490/lehrauftragsliste_stammkostenstelle_bei_fix_angestellten' 2024-04-15 15:41:53 +02:00
cgfhtw e0c7691e04 missing catch 2024-04-11 15:14:15 +02:00
Andreas Österreicher c03e6deb95 Removed useless code 2024-04-10 16:45:46 +02:00
ma0068 941dce6032 Diplomasupplement: Adaptierung Wording Niveau 2024-04-10 14:48:04 +02:00
Harald Bamberger 94224f7ef7 dvendegrund Ablauf durch Zeit added 2024-04-10 14:28:07 +02:00
Cris f51f006377 Corrected phrase anmerkungIntern 2024-04-10 14:07:41 +02:00
Andreas Österreicher 637392c844 Merge branch 'master' into feature-15490/lehrauftragsliste_stammkostenstelle_bei_fix_angestellten 2024-04-10 09:56:58 +02:00
Harald Bamberger e11dd21a1e add parameter dvendegrund_kurzbz and dvendegrund_anmerkung 2024-04-09 16:35:00 +02:00
Harald Bamberger 1a1cd76bc4 add grant on hr.tbl_dvendegrund to user vilesci 2024-04-09 15:42:00 +02:00
Harald Bamberger a9818e1f63 add initial values to hr.tbl_dvendegrund 2024-04-09 15:27:47 +02:00
Harald Bamberger 56900e31db add table hr.tbl_dvendegrund, add columns dvendegrund_kurzbz and dvendegrund_anmerkung to hr.tbl_dienstverhaeltnis 2024-04-09 15:08:32 +02:00
Andreas Österreicher e41eada893 Removed unused Code 2024-04-09 14:08:58 +02:00
Andreas Österreicher a32e78c9b8 Merge branch 'master' into feature-27349/DiplomaSupplementQuereinstiegerRahmenvertrag 2024-04-09 13:53:37 +02:00
Cris 1d0c2be449 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-04-09 11:33:38 +02:00
Andreas Österreicher bdb0a5702d Fehler behoben wodurch keine Note im Freigabemail angezeigt wurde
Fehler behoben wodurch keine Punkteübernahme bie Nachprüfungen möglich
war
2024-04-09 11:24:44 +02:00
Harald Bamberger 026a276c02 add grant on frist_id sequence 2024-04-09 11:11:03 +02:00
Harald Bamberger 3b41df5ddc Merge branch 'master' into feature-37107/Fristenmanagement 2024-04-09 10:44:02 +02:00
Andreas Österreicher 8a9477eaf0 Fixed PHP7.4 Warning 2024-04-08 12:54:05 +02:00
Werner Masik f2ba0fd469 update phrases and added events for fristenmanagement 2024-04-07 00:33:25 +02:00
Andreas Österreicher 257c7a5aac Projektzeitenexport für Administration/HR im Vilesci hinzugefügt 2024-04-05 14:14:13 +02:00
ma0048 753a193be1 - added phrases for bpks details 2024-04-04 15:41:18 +02:00
KarpAlex 2132fe76ae added Plausicheck: students in DUAL Studiengang should have set boolean value dual to true, plausicheck bugfixes (loading model, remove unnecessary property) 2024-04-03 17:39:00 +02:00
Cris cfe73b361e Sorted project phases by start date and bezeichnung in Zeitaufzeichnung
Sorted within dropdown
2024-04-03 15:13:32 +02:00
Cris a2791fecd1 Sorted projects in alphabetical order in Zeitaufzeichnung
Sorted within dropdown and in project cvs export file.
2024-04-03 13:10:30 +02:00
Cris d2a8d59f6d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-04-03 12:59:00 +02:00
Cris 9907ee2267 Added phrase global/zeilenAuswaehlen 2024-04-03 11:45:43 +02:00
Werner Masik 5cabac62d7 add frist events for befristung 2024-04-02 18:33:37 +02:00
cgfhtw 8ffc8a20d3 s&d 2024-03-29 14:27:45 +01:00
cgfhtw d34ce78c94 s&d 2024-03-29 13:00:54 +01:00
kindlm 5d49516b77 Merge branch 'ReportingFilterParameter' 2024-03-28 13:56:07 +01:00
kindlm 538264e577 Merge branch 'master' into ReportingFilterParameter 2024-03-28 13:55:29 +01:00
kindlm 2f99457283 GET-Parameter auch für Text übernehmen 2024-03-28 13:54:45 +01:00
Cris ba1fa6add4 Merge branch 'master' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2024-03-28 13:20:51 +01:00
Cris 8d8e45b6de Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-03-28 13:20:16 +01:00
Cris 05516f2952 Fixed: issue with component tabs not recognizing loaded phrases
Vue.computed ensures loading phrase reactively when phrases are loaded
2024-03-28 13:19:31 +01:00
Cris d34f5b92f4 Added new phrases for softwarebereitstellung- and for core app 2024-03-28 13:14:34 +01:00
Andreas Österreicher 4ccf2aebcc Prüfungstyp Termin3 wird nicht automatisch angelegt 2024-03-27 12:57:17 +01:00
Manfred 21b05394c8 Merge branch 'master' into ReportingFilterParameter 2024-03-26 17:24:07 +01:00
kindlm 7240a97d6e Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-03-26 17:16:57 +01:00
kindlm e469f54901 Typ "Text" bei vordefinierten Filtern ergänzt 2024-03-26 17:16:44 +01:00
Andreas Österreicher 42ddea9f51 Fixed Typ in Variable Name 2024-03-26 16:37:13 +01:00
Andreas Österreicher 058ed94c2b Merge branch 'feature-36196/DVUH_Meldestatus_beruecksichtigen' 2024-03-26 11:34:26 +01:00
Harald Bamberger a95c2fe47e studstatus switch fullname to have surname first 2024-03-26 11:27:44 +01:00
Andreas Österreicher 1e9a681c9a Gegencheck für tbl_tmp_store und tbl_audit_log entfernt da dies Tabellen
aus der Personalveraltung Extension sind
Gegencheck für Habiliation hinzugefügt
2024-03-26 09:19:36 +01:00
Harald Bamberger aabc10d1fc Merge branch 'master' of github.com:FH-Complete/FHC-Core 2024-03-25 16:54:00 +01:00
Harald Bamberger d4bc5148a7 fix disappearing searchbar when session expires, add functions to fetch dvs at a certain duedate for valorisation 2024-03-25 16:53:03 +01:00
Andreas Österreicher fe1ea63496 Merge branch 'feature-33294/StudienerfolgsbestaetigungAbbrecher' 2024-03-25 15:59:12 +01:00
Harald Bamberger 2a26765ff6 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' 2024-03-25 15:05:46 +01:00
Harald Bamberger 5413292529 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-03-25 14:55:46 +01:00
Harald Bamberger 8a86bce567 Merge branch 'feature-33003/BIS_Meldung_Personal' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-03-25 14:55:11 +01:00
Harald Bamberger ad415ad665 deactivateDienstverhaeltnis: only set user to inactive if no other dv is active 2024-03-25 14:04:21 +01:00
Andreas Österreicher 6a6db4292f Merge branch 'feature-18571/EntwicklungsteamBisMeldung' 2024-03-25 13:54:42 +01:00
Andreas Österreicher 5fd4ded184 Merge branch 'master' into feature-18571/EntwicklungsteamBisMeldung 2024-03-25 13:12:35 +01:00
Harald Bamberger 9f2dd82009 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-03-25 13:08:10 +01:00
cgfhtw 06b0529813 Autocomplete: empty message 2024-03-22 09:10:13 +01:00
cgfhtw c4942cc70e Studstatus => FhcApi 2024-03-21 15:45:55 +01:00
Cris bc798bd0b4 Added uniqueId prop to Filter.js to fix URL using apiFunctionParameters.filterUniqueId 2024-03-20 09:58:25 +01:00
Cris f6eceb892d Added label property 'class' to Input.js
...which fixes style issues when creating input-group buttons using the Input.js component
2024-03-20 09:52:26 +01:00
Cris 6eae83f4eb Added primevues autocomplete slot template to Input.js
Now, when using the Input Component with type 'autocomplete', it is possible to add also primevues built in slot templates there
2024-03-20 09:50:03 +01:00
Cris 842e62b0dd Fixed Input.js error causing to keep last entries' first letter in form inputs, even when formdata was emptied 2024-03-20 09:42:23 +01:00
Cris 10e57dae2d Adapted style of .tabulator-cell .btn to be squared and increased padding 2024-03-20 09:38:08 +01:00
cgfhtw 69803cdb0d Phrasen: Bugfix - correct function for multiple categories 2024-03-20 08:27:26 +01:00
Werner Masik 426a439552 added sort column to frist 2024-03-20 00:13:55 +01:00
cgfhtw 4e6b7a845b FhcApi: use errorHeader for multiple calls 2024-03-19 16:54:14 +01:00
cgfhtw 30efd55d6c FhcApi: settle handled Promises & discard them in FhcAlert 2024-03-19 16:53:36 +01:00
Manfred e1b5a86390 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-03-19 15:55:00 +01:00
Manfred be0d73cd22 Sortierung der Studiensemester absteigend; Ziel-Studiensemester passt sich automatisch an 2024-03-19 15:54:54 +01:00
cgfhtw 8f0e837fb7 Phrasen Plugin: Bugfix this 2024-03-19 08:45:10 +01:00
cgfhtw b147f73954 Merge branch 'master' into feature-37246/APIs_Konsolidierung 2024-03-18 09:51:29 +01:00
Andreas Österreicher 2cce61ca6a Korrekturen für Gehaltsimport 2024-03-15 13:37:07 +01:00
kindlm 1d81a4c2e8 Buttonbeschriftung geändert um barrierefreier zu sein 2024-03-14 17:08:03 +01:00
kindlm 79a1e6a7fd Merge branch 'benutzerberechtigungGUIneu' 2024-03-14 16:41:53 +01:00
kindlm 7bec921018 Merge branch 'master' into benutzerberechtigungGUIneu 2024-03-14 16:40:07 +01:00
kindlm d9caf746a1 Rechte-GUI verbesserungen
- Inaktive und WaWi-Einträge ausgblenden
- Kopie-Anmerkung verkürzt
- Inaktive OE Kennzeichnen
- Link ins CIS-Profil
- Shortcut zum einfügen von Datum und Kürzel
- "Mitarbeiter" ist default bei Benutzersuche
- GUI-Verbesserungen bei Rollenvergleich
2024-03-14 16:39:01 +01:00
Harald Bamberger bacfbd33f3 Merge branch 'feature-36016/Studstatus_QMB' 2024-03-14 12:37:21 +01:00
Harald Bamberger 77221e507f set tabulator to fixed height, fix missing grund when editing unterbrechung 2024-03-14 11:42:39 +01:00
cgfhtw bc5d42b310 Studstatus: ausbildungssemester in getAllPrestudentsWhereCommitteeExamFailed 2024-03-14 08:52:55 +01:00
cgfhtw cba4c8e365 Studstatus: Fallback for antrag details 2024-03-13 16:46:10 +01:00
Harald Bamberger af79736d67 documents use ausbildungssemester from prestudentstatus in semester of antrag, fix missing grund when editing unterbrechung 2024-03-13 16:16:23 +01:00
cgfhtw f5bc8bdcb2 Studstatus: Unterbrechung: get semester for current status on new Antrag 2024-03-13 10:40:32 +01:00
cgfhtw 673fd889fe Studstatus: get details without whitelist 2024-03-13 10:39:51 +01:00
cgfhtw ab7a5bac68 Unterbrechung studienjahr und semester anzeige 2024-03-13 08:37:40 +01:00
Werner Masik e28627a676 removed verantwortlich column from tbl_frist 2024-03-12 17:34:13 +01:00
Harald Bamberger 4c8486af22 use correct config property 2024-03-12 14:36:27 +01:00
Harald Bamberger d05df01178 move load lib from function handleAbmeldungenStglDeadline to constructor as its also used in handleWiederholerDeadline 2024-03-12 13:22:01 +01:00
Harald Bamberger 7bdf5b832b Merge branch 'master' into feature-36016/Studstatus_QMB 2024-03-12 11:32:25 +01:00
Harald Bamberger 9504b713fc add missing insertvon to phrases definition 2024-03-12 11:31:12 +01:00
Andreas Österreicher 8d2d1c049a Removed wrong Semicolon 2024-03-12 08:28:16 +01:00
cgfhtw ac39ce8e71 Studstatus create view: fallback for studierendenantrag_id 2024-03-11 15:27:34 +01:00
cgfhtw 6acf65b49f Form Component: expose _defaultErrorHandlers 2024-03-11 15:24:48 +01:00
cgfhtw 40c98b1dcc FHCAPI Controller: optional status param for error function 2024-03-11 15:23:54 +01:00
cgfhtw b359a77a8d Comments 2024-03-11 09:56:34 +01:00
cgfhtw d259c0d35c Fetch: more robust error handling 2024-03-11 09:46:59 +01:00
cgfhtw 011b4a83eb Filter => FhcApi 2024-03-11 09:46:39 +01:00
Harald Bamberger 664fe3830f Merge branch 'master' into feature-33003/BIS_Meldung_Personal 2024-03-08 11:39:02 +01:00
Harald Bamberger b17f253273 Tabs component: add flex-grow-1 class to use available space 2024-03-08 11:37:23 +01:00
Harald Bamberger d9e44c8c23 Merge branch 'master' into feature-33003/BIS_Meldung_Personal 2024-03-08 11:08:40 +01:00
cgfhtw 85f9b14326 Comments 2024-03-07 16:56:37 +01:00
cgfhtw 5f77bdd6fc Spelling 2024-03-07 16:56:30 +01:00
cgfhtw d2eadb98ce Navigation => FhcApi 2024-03-07 16:56:14 +01:00
cgfhtw 291f32bfe2 Tabs => FhcApi 2024-03-07 14:35:29 +01:00
cgfhtw f539ed8977 Depricated comment 2024-03-07 08:54:28 +01:00
cgfhtw 20619311e3 Use fhcApi in Searchbar 2024-03-07 08:50:27 +01:00
cgfhtw 4ac46d19e9 Testsearch view: naming convention 2024-03-07 08:23:29 +01:00
cgfhtw dad459e023 Testsearch: Codequality 2024-03-07 08:18:49 +01:00
cgfhtw 8f6fbda4cf Testsearch: Bugfixes 2024-03-07 08:11:58 +01:00
Andreas Österreicher b753a05f0e Anpassungen am Import Script für Gemeinden von FHB übernommen 2024-03-07 08:10:17 +01:00
cgfhtw b6723e92d8 Code Quality 2024-03-07 08:01:11 +01:00
cgfhtw 1344ab987e Options for custom FhcApiFactory 2024-03-06 16:52:42 +01:00
cgfhtw 1dcece8563 Use Factory for Phrasen 2024-03-06 16:52:10 +01:00
cgfhtw f2ebf25640 Use new FhcApiFactory Folder 2024-03-06 16:51:25 +01:00
cgfhtw f6427f57b8 Use FHCAPI Controller for Phrasen 2024-03-06 16:49:35 +01:00
cgfhtw 68459e086a Auth_Controller special permissions 2024-03-06 16:15:04 +01:00
Cris 03e166dc89 Merge branch 'master' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software
# Conflicts:
#	public/js/components/filter/Filter.js
#	public/js/plugin/FhcAlert.js
#	system/filtersupdate.php
2024-03-06 14:07:19 +01:00
Cris 0940ea77de Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-03-06 13:59:06 +01:00
cgfhtw 872ef7c31c Move Phrasen API 2024-03-06 13:02:34 +01:00
cgfhtw e89aa824d2 FHCAPI_Controller extends Auth_Controller + auth error handling in FhcApi 2024-03-06 11:48:15 +01:00
cgfhtw 1b65378d6c Auth_Controller private functions 2024-03-06 11:47:34 +01:00
Werner Masik 77666e5210 added column verantwortlich_uid 2024-03-06 08:27:39 +01:00
KarpAlex 1085b9243d Merge branch 'master' into feature-33003/BIS_Meldung_Personal 2024-03-05 17:07:17 +01:00
Harald Bamberger 3d6b2eb202 add app fhctemplate if it does not exist 2024-03-05 17:04:43 +01:00
Harald Bamberger 5ad3510af6 add use of phrasen plugin to apps 2024-03-05 16:47:29 +01:00
Harald Bamberger d5d190777a Merge branch 'feature-34543/UX_Template' 2024-03-05 16:46:48 +01:00
Cris 7f735e9a10 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-03-05 13:05:03 +01:00
Andreas Österreicher 7524d054db Merge branch 'feature-36530/bis_internationalisierung_codextabelle_neuerungen' 2024-03-05 13:04:25 +01:00
Andreas Österreicher 6869c147ef Beim deaktivieren von Benutzern wird Updateaktivam und Updateaktivvon
gesetzt
2024-03-05 11:32:30 +01:00
Werner Masik c60f7ed8b0 dbUpdate for fristenmanagement completed 2024-03-01 15:43:15 +01:00
Manfred e32d464b7f Merge branch 'master' into benutzerberechtigungGUIneu 2024-03-01 15:28:10 +01:00
Manfred 2e4f2709ed Merge branch 'RechteAnpassen' into benutzerberechtigungGUIneu 2024-03-01 15:27:11 +01:00
SimonGschnell 474c4ad34f removes file that belongs to CIS_Profil 2024-03-01 10:53:06 +01:00
Werner Masik 7a6d095b78 create db tables for fristenmanagement 2024-02-29 17:09:59 +01:00
kindlm 621429798c Abschlussgrad in Studienblatt erst aus Studienordnung ermitteln 2024-02-29 09:50:58 +01:00
cgfhtw 6500708f90 Code Quality 2024-02-29 09:02:20 +01:00
cgfhtw 2d2098984a Pause feature 2024-02-29 08:34:58 +01:00
Harald Bamberger c4d4f55d06 use tabulator5 simple theme to get smaller tables 2024-02-28 18:22:35 +01:00
Andreas Österreicher a4a06507dc Merge branch 'feature-229015/SAPByD_EBCL_Buchungen_sollen_auf_eigene_Kostenstelle_zugeordnet_werden' 2024-02-28 15:08:57 +01:00
Andreas Österreicher 23b1a76190 Merge branch 'feature-36148/tdb_uebersicht_erweitert_und_job_bug' 2024-02-28 13:43:19 +01:00
Cris f94b1700e7 Renamed filter- and phrases app for Fhc-Core-Extension
Renamed from extension to fhctemplate
2024-02-28 13:38:59 +01:00
Harald Bamberger 45f2593b13 fix bug with excel showing file error when switching to editmode 2024-02-27 13:54:58 +01:00
Andreas Österreicher e243980ae6 Merge branch 'master' into feature-18571/EntwicklungsteamBisMeldung 2024-02-26 15:58:49 +01:00
Andreas Österreicher 4862168b8d Merge branch 'feature-36986/fas_filter_reihungstest_dual' 2024-02-26 14:49:46 +01:00
Andreas Österreicher 93f1bc752b Merge branch 'feature-36744/uebersetzungen_payments_karteireiter' 2024-02-26 12:57:18 +01:00
cgfhtw 4bbac35540 Status colors 2024-02-26 11:56:29 +01:00
ma0048 aa6c5c50c2 - fas filter gefixt 2024-02-26 09:03:06 +01:00
Alexei Karpenko d9ec506c86 Codextabelle Mobilitaetsprogramm Neuerungen: changed name of some programs, set correct sichtbar and sichtbar_outgoing booleans 2024-02-23 16:54:51 +01:00
Cris 296741b584 Merge branch 'feature-34543/UX_Template' of https://github.com/FH-Complete/FHC-Core into feature-34543/UX_Template 2024-02-22 11:17:38 +01:00
Cris c232eddf89 Added filter and phrases for Fhc-Core-Extension 2024-02-22 11:17:27 +01:00
Werner Masik fff0e937cc added Method to end DV and deactivate Benutzer 2024-02-21 16:23:39 +01:00
SimonGschnell 2d1e8a829d userdata changes 2024-02-21 13:50:38 +01:00
cgfhtw c034efb8b0 Unterbrechung bei laufender Unterbrechung 2024-02-21 09:19:56 +01:00
ma0048 6f92698631 - bewerbungstool payments uebersetzungen anpassungen 2024-02-20 17:01:49 +01:00
Werner Masik cd64df28bb added phrase for habilitation 2024-02-20 15:02:14 +01:00
cgfhtw 72d166a050 FHCAPI Controller: multipart upload 2024-02-20 08:38:29 +01:00
KarpAlex dfe0434cce added new mobilitaetsprogramm codes 2024-02-19 17:59:20 +01:00
cgfhtw 013664db70 FhcApi Controller: new helper functions 2024-02-19 15:23:43 +01:00
cgfhtw 469b3e9833 Form Input: auto classes 2024-02-19 15:23:13 +01:00
cgfhtw 8ad2908ca9 UploadDms: Delete Button styles 2024-02-19 15:23:00 +01:00
cgfhtw 6aebbada06 Form Input: only setFeedback on last radio/checkbox in production mode 2024-02-19 10:39:18 +01:00
Andreas Österreicher e433ca3d9b Fehlende Gegenpruefungen im DB Check hinzugefuegt 2024-02-19 09:22:54 +01:00
Andreas Österreicher 7962e181df Merge branch 'feature-21620/Neues_Feld_zum_Erfassen_des_ESI' 2024-02-19 08:58:49 +01:00
Andreas Österreicher 126defadb7 Link hinzugefügt beim Zusammenlegen von Personen wenn beide Personen
UHSTAT ausgefüllt haben damit diese direkt verglichen und gelöscht
werden können.
Fehlende DB checks hinzugefügt
2024-02-16 14:59:53 +01:00
Andreas Österreicher 01c3a67762 Merge branch 'master' into feature-21620/Neues_Feld_zum_Erfassen_des_ESI 2024-02-16 14:11:02 +01:00
cgfhtw 658212a6eb Show Antrag to Student when finished 2024-02-16 13:28:26 +01:00
cgfhtw ab2fc11797 PDF Download Wiederholung Deadline 2024-02-16 11:44:27 +01:00
Andreas Österreicher cbf71a416f Deprecated Spalte Gesamtstunden aus Projektarbeitsexport entfernt 2024-02-16 11:23:20 +01:00
cgfhtw 75e05d6eed PDF Download korrektur 2024-02-16 09:27:42 +01:00
cgfhtw 70386a58f3 Tabs Component: removed TODOs 2024-02-16 08:53:34 +01:00
Cris caa7ad6cc4 Merge remote-tracking branch 'origin/feature-34543/UX_Template' into feature-34543/UX_Template 2024-02-15 09:54:51 +01:00
cgfhtw 3322f5115a FhcApi: Clean return value 2024-02-15 09:41:11 +01:00
cgfhtw f5b5f39689 FhcApi: return value 2024-02-14 16:00:48 +01:00
Cris 8f81426fa4 Corrected error when using alertMultiple and handleSystemMessage 2024-02-13 14:54:42 +01:00
cgfhtw 091d8509f0 Send E-Mails after Wiederholer deadline 2024-02-13 14:53:58 +01:00
Cris 6140e15139 Removed unused tabulatorAdditionalColumns property. Instead additional cols like 'action buttons' are now checked by index. 2024-02-13 14:53:01 +01:00
Cris acb29c5c69 Merge branch 'master' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software
# Conflicts:
#	application/views/templates/FHC-Footer.php
#	composer.json
#	public/js/components/Bootstrap/Modal.js
#	public/js/components/filter/Filter.js
#	public/js/plugin/FhcAlert.js
2024-02-13 11:54:55 +01:00
Cris 91f43665fd Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-02-13 10:54:14 +01:00
Cris 4d8dbb2e78 Created Core BaseLayout Component 2024-02-13 10:52:11 +01:00
Cris 565f89c884 Added phrases anrechnung, geloescht and aenderungGespeichert 2024-02-13 10:51:37 +01:00
Cris e6774024b9 Merge branch 'feature-34543/UX_Template' of https://github.com/FH-Complete/FHC-Core into feature-34543/UX_Template 2024-02-12 11:25:07 +01:00
Andreas Österreicher b4d6a46426 Fixed Typo in phrase 2024-02-09 15:18:14 +01:00
Andreas Österreicher bffaea8dda Merge branch 'feature-36028/uebersetzungen_zahlungen' 2024-02-09 12:50:45 +01:00
Andreas Österreicher f5dacefbbe Merge branch 'master' into feature-36028/uebersetzungen_zahlungen 2024-02-09 12:50:00 +01:00
Andreas Österreicher 752408aa3a Fixed LineEndings 2024-02-09 12:49:14 +01:00
Andreas Österreicher e34ff8819c Merge branch 'feature-33981/testtool_text_kopieren_verhindern_erschweren' 2024-02-09 11:11:41 +01:00
cgfhtw ce9ebee57d CSS: fhc-header w/o bottom border 2024-02-09 11:10:03 +01:00
Andreas Österreicher 0a8a17e49f Merge branch 'feature-36197/reihungstest_auswertung_bewerberstatus_setzen' 2024-02-09 10:48:51 +01:00
cgfhtw 8c6c2b7e11 FilterCmpt: defaults & Bugfix 2024-02-09 09:32:02 +01:00
cgfhtw 6e85b37b0f Tabs: optional border 2024-02-09 09:31:26 +01:00
cgfhtw c3ec909448 CSS improvements 2024-02-09 09:30:59 +01:00
Manfred ba972c1d8a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-02-08 16:36:52 +01:00
Manfred ddfe0843de Defaultwert "aggregators "aus Statistik entfernt, weil Fehler wenn leer 2024-02-08 16:36:45 +01:00
Harald Bamberger 5279a7d45a Merge branch 'feature-35768/Studstatus_Status_Abgebrochen_fuer_Wiederholerdeadline_verwenden' 2024-02-08 08:48:26 +01:00
Harald Bamberger 7dfb0429ae Merge branch 'master' into feature-35768/Studstatus_Status_Abgebrochen_fuer_Wiederholerdeadline_verwenden 2024-02-08 08:25:11 +01:00
Harald Bamberger f67a106357 Merge branch 'feature-35637/Studstatus-Wiederholungsdeadline_abbrecher_status_current_semester' 2024-02-08 08:15:19 +01:00
Andreas Österreicher 1d300a604f Funktion zum Migrieren der Habiliation hinzugefügt 2024-02-08 08:03:34 +01:00
Andreas Österreicher 912f62dc01 Merge branch 'master' into feature-33003/BIS_Meldung_Personal 2024-02-08 08:03:00 +01:00
Harald Bamberger 32ed034ad2 Merge branch 'master' into feature-35637/Studstatus-Wiederholungsdeadline_abbrecher_status_current_semester 2024-02-08 08:00:22 +01:00
kindlm 36d4879b90 Hinweistext für Lehrauftragsannahme ergänzt 2024-02-07 16:35:21 +01:00
Cris bc0f7f7087 Merge branch 'feature-34543/UX_Template' of https://github.com/FH-Complete/FHC-Core into feature-34543/UX_Template 2024-02-07 15:50:50 +01:00
kindlm 72197bf993 Merge branch 'master' into RechteAnpassen 2024-02-07 12:58:43 +01:00
kindlm e01d97849a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-02-07 12:58:13 +01:00
cgfhtw 2f79ae1ece Form/Validation bugfix: dismiss cache problem (correct solution) 2024-02-07 09:19:19 +01:00
cgfhtw a2c5ebb291 Fhc.css: fhc-header 2024-02-07 09:13:21 +01:00
cgfhtw 1f3e283d3c Code cleanup 2024-02-07 09:12:47 +01:00
cgfhtw eb69f77113 Form/Validation bugfix: dismiss cache problem 2024-02-07 09:12:06 +01:00
cgfhtw 6bc6c7c074 Form/Input: Injection defaults 2024-02-07 09:11:20 +01:00
Andreas Österreicher 3b97d8d93f Merge branch 'bug-36275/vertrag_oezuordnung' 2024-02-06 12:42:44 +01:00
Andreas Österreicher 1b70d70edd - Pruefung hinzugefuegt ob eine Person Vorgesetzte oder indirekt
Vorgesetzte einer anderen Person ist
- Bei mehreren OEZuordnungen wird bevorzugt die nicht karenzierte
  ermittelt
2024-02-06 12:40:11 +01:00
Andreas Österreicher b5024b86ea OEZuordnung wird priorisiert ermittelt bei Karenzen 2024-02-05 18:54:33 +01:00
kindlm 238208f252 Zeitwünsche mit mitarbeiter/zeitwuensche einsehen 2024-02-05 16:39:53 +01:00
KarpAlex 1c2c12f0a5 Bismeldestichtag Model: added getByStudiensemester method 2024-02-02 18:41:18 +01:00
cgfhtw dfbd67c52b Form/Input: Multiple radios/checkboxes 2024-02-01 15:43:36 +01:00
cgfhtw fe798506a6 raw_input_stream as array instead of stdobj & terminateWithSuccess 2024-02-01 08:59:35 +01:00
cgfhtw 51e556a731 Remove textarea+ & Form.send()
Add $clearValidationForName()
2024-02-01 08:58:32 +01:00
Andreas Österreicher a193a7a1c8 Naming Convention korrigiert fuer DBUpdate File 2024-02-01 08:50:06 +01:00
Andreas Österreicher 53fc8fc807 Berechtigungen für Entwicklungsteam ins Studiengangsverwaltungs Addon
verschoben
2024-02-01 08:38:55 +01:00
Andreas Österreicher ef64aa7da2 - Fehler behoben wodurch Entwicklugnsteam nicht gespeichert werden konnte
wenn das Endedatum leer ist.
- Entwicklungsteam update aus alten DB-Update entfernt
2024-02-01 08:20:10 +01:00
kindlm ac9b36cc1a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-01-31 16:02:41 +01:00
kindlm 1b3c509ee8 Rechte in Rollen kopieren 2024-01-31 16:02:29 +01:00
Andreas Österreicher fae185958b Merge branch 'master' into feature-18571/EntwicklungsteamBisMeldung 2024-01-31 13:27:58 +01:00
Cris 02f0c54f10 Adapted Filter.js to ensure displaying tabulator 'formatter' columns not provided by filtersupdate filter definition
...like rowSelection checkboxes or custom formatted action buttons
2024-01-31 13:25:44 +01:00
Andreas Österreicher 559835becd Merge branch 'feature-35653/personensuche_deaktivieren' 2024-01-31 12:50:30 +01:00
Andreas Österreicher 603ef170ba Merge branch 'feature-34728/notenauswahl_im_fas_deaktivierte_noten_durchstreichen' 2024-01-31 12:33:02 +01:00
Andreas Österreicher cd7478539d Merge branch 'master' into feature-34728/notenauswahl_im_fas_deaktivierte_noten_durchstreichen 2024-01-31 12:29:23 +01:00
ma0048 ef3c680e91 - auswertung_fhtw funktionen "Zu Bewerber machen" entfernt 2024-01-31 12:28:03 +01:00
cgfhtw 2dbdf41086 FHC-Api: finetuning 2024-01-31 09:39:51 +01:00
Cris 7e14fff7f3 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-01-30 17:18:55 +01:00
Cris 6bd834c509 Added filter AnrechnungTable (for testing) 2024-01-30 17:05:03 +01:00
Cris aa06a97eb3 Corrected alertMultiple to display all messages
Before it stucked with only the first message. Now all messages are displayed.
2024-01-30 17:04:02 +01:00
Cris b868024175 Corrected wrong variable name in FhcAlert handleSystemMessage 2024-01-30 17:00:49 +01:00
Andreas Österreicher bea14724b0 Phrasen für Anrechnungen korrigiert 2024-01-30 16:56:19 +01:00
cgfhtw ef3ee76fa1 Form Validation 2024-01-30 11:39:17 +01:00
cgfhtw 272c4d5ccc FhcApi cleanup 2024-01-30 11:39:08 +01:00
cgfhtw 30bd6ea6a4 FhcApi Plugin + Form updates 2024-01-30 10:42:48 +01:00
cgfhtw b010cbb35d FhcAlert: CSS 2024-01-30 10:42:12 +01:00
cgfhtw ea9e58a640 Bugfix: Typo 2024-01-30 10:41:45 +01:00
ma0048 5e99ff9c8b - uebersicht erweitert
- job angepasst
2024-01-29 14:29:39 +01:00
Andreas Österreicher 1d779feb4b Merge branch 'feature-35202/internationalisierungsmassnahmen_wording_anpassen_fuer_akzeptieren' 2024-01-26 10:50:59 +01:00
cgfhtw 1fec3543cd FHCAPI Controller 2024-01-25 16:41:05 +01:00
ma0048 cd37972cad - ubersetzuengen hinzugefuegt 2024-01-25 12:54:57 +01:00
Harald Bamberger cf40f33fc6 prevent returning html entities in sanitizeProblemChars helper 2024-01-25 12:44:20 +01:00
Harald Bamberger 72bcb919aa prevent returning html entities in sanitizeProblemChars helper 2024-01-25 12:41:32 +01:00
Cris 4706b16a99 Merge branch 'feature-34543/UX_Template' of https://github.com/FH-Complete/FHC-Core into feature-34543/UX_Template 2024-01-25 10:40:09 +01:00
cgfhtw afc995b4bd Form Input modelValue dummy 2024-01-25 10:29:19 +01:00
Andreas Österreicher 70303dbec6 CI Environment im CIS Config hinzugefügt 2024-01-25 10:19:40 +01:00
Andreas Österreicher 89f5613373 Fehler behoben wodurch die Homeoffice Checkbox nicht angezeigt wurde
wenn die Person keinen Projekten zugeordnet ist
Fehler behoben wodurch die Homeoffice Checkbox am ersten Tag der
Homeofficegültigkeit nicht
korrekt angezeigt wurde
2024-01-24 07:02:28 +01:00
Harald Bamberger 7d4bc9c1d0 change => to >= in sql comparison 2024-01-23 14:21:04 +01:00
Cris 693d59e8bc Merge branch 'feature-34543/UX_Template' of https://github.com/FH-Complete/FHC-Core into feature-34543/UX_Template 2024-01-23 09:57:51 +01:00
cgfhtw e2a66d5143 Fragment Component 2024-01-23 09:43:41 +01:00
cgfhtw 41e5c52d2f Css updates 2024-01-23 09:42:33 +01:00
cgfhtw be82d9b6cb Tabs Component update 2024-01-23 09:32:26 +01:00
cgfhtw d66a6567b0 Form Components 2024-01-23 09:29:47 +01:00
Harald Bamberger e90f0c75fa fix missing entries due to missing prestudentstatus for target semester 2024-01-22 13:47:35 +01:00
Harald Bamberger a3a28a428c Merge branch 'feature-35636/Studstatus-Leitung_AntragId_sort_by_number' 2024-01-22 12:54:39 +01:00
Andreas Österreicher 3b85729b6f Syntaxfehler und Styling korrigiert 2024-01-19 15:27:04 +01:00
cgfhtw 1b27dbcb5f Bugfix: WH Antrag Prüfungstest kleiner vs kleiner gleich 2024-01-19 13:17:41 +01:00
kindlm 363ec9aa2f Merge branch 'master' into benutzerberechtigungGUIneu 2024-01-18 20:33:42 +01:00
kindlm 146b62d185 Filter in GET-Parameter 2024-01-18 20:33:03 +01:00
kindlm f298814619 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-01-18 20:31:31 +01:00
Werner Masik 304caf9157 added time recording query 2024-01-18 12:30:35 +01:00
Cris af010a51e9 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-01-17 11:33:54 +01:00
Andreas Österreicher 125a0174b9 Berechtigung für Web User zu Freitextbestandteilen hinzgefügt damit die Zeitaufzeichnung auf
AllIn prüfen kann
2024-01-17 07:41:17 +01:00
Andreas Österreicher c7e86950f4 FreierDV auf Darunterliegenden externerLehrender geändert da freierdv
nicht zu einem Dienstverhaeltnis zugeordnet werden soll
2024-01-17 07:36:28 +01:00
Andreas Österreicher 69e6c4ca29 Fehler beim Laden von Reports mit mehreren Variablen behoben 2024-01-16 17:01:09 +01:00
Harald Bamberger 6c95e31bae remove files moved to FHC-Core-Personalverwaltung Extension 2024-01-16 11:52:13 +01:00
Harald Bamberger 9552077209 Merge branch 'deploy-PV21' 2024-01-16 11:36:57 +01:00
Harald Bamberger 514ac2050f Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-15 18:18:35 +01:00
Harald Bamberger 34a083d0ee update Logik beim Beenden von DVs verwenden 2024-01-15 18:16:54 +01:00
ma0048 a2905c3e93 - scheduler angepasst
- config erweitert um mahnsperre und zahlungsbedingungen
- fas config hinzugefuegt
2024-01-15 12:25:34 +01:00
ma0048 a9bae3f17d - zgv class erweitert um nur aktive zu holen 2024-01-15 11:58:10 +01:00
Harald Bamberger bed5a62d82 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-15 11:23:11 +01:00
Harald Bamberger 7b9bfd70c8 make name of enc key more specific 2024-01-15 10:39:54 +01:00
Harald Bamberger 3b952b3838 Merge branch 'feature-25563/PV21_Verschlüsselung_Gehaltsdaten' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-15 10:36:34 +01:00
Cris 579c1c6aff Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2024-01-15 10:28:10 +01:00
Harald Bamberger 45c5b4fd37 Merge branch 'deploy-PV21' of github.com:FH-Complete/FHC-Core into deploy-PV21 2024-01-12 16:17:06 +01:00
Harald Bamberger 57af22a623 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-12 16:16:56 +01:00
Harald Bamberger d95e972e6c Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of github.com:FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-12 16:15:15 +01:00
Harald Bamberger 8824ffd182 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-12 16:14:40 +01:00
Harald Bamberger 81244a06ca antrag_prestudentstatus_whitelist_abmeldung damit Unterbrecher sich auch abmelden koennen 2024-01-12 16:13:19 +01:00
Harald Bamberger 8d5cb39a3d Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-12 14:57:01 +01:00
Harald Bamberger a49394f456 fix sql 2024-01-12 14:47:40 +01:00
Harald Bamberger 5a2ddbe2b2 use new hr tables depending on config DIENSTVERHAELTNIS_SUPPORT 2024-01-12 14:44:26 +01:00
Harald Bamberger fc89224dc8 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-11 09:46:30 +01:00
cgfhtw 0f06c8a386 s&d 2024-01-11 08:34:10 +01:00
cgfhtw 13b5b017b8 Expose Antrag Id 2024-01-11 08:34:00 +01:00
cgfhtw 981f6970bc Status severity for "Abgemeldet" 2024-01-11 08:33:43 +01:00
Cris f40862c019 Merge remote-tracking branch 'origin/feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-10 17:16:32 +01:00
Harald Bamberger 7f4ae3a378 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-10 15:01:48 +01:00
Harald Bamberger d5f6ee2265 improve search to handle multiword search 2024-01-10 15:00:16 +01:00
Cris 73ba14cdec Removed unused function check_isVorgesetzter
This was replaced by using getVorgesetzer / getVorgesetzterByDate method.
2024-01-10 14:44:33 +01:00
Cris e3f10069ef Adapted getUntergebene to allow to include also Mitarbeiter, who ended Dienstverhältnis/changed OE last month
These allows Vorgesetzte to still access their data, for example to be able to accept their November-Monatsliste (last working month)
in December (month to accept the November-Monatsliste)
2024-01-10 14:42:13 +01:00
Harald Bamberger 37493d1af7 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into deploy-PV21 2024-01-10 14:40:18 +01:00
Cris 97a020460d Adapted: getVorgesetzteByDate to retrieve only the latest Vorgesetzte by a specific date
Added order by and limit to get only one and the most actual Vorgesetzte by given date.
Changed name. Before it was getVorgesetzteMonatTimesheet, but it is also used independently from timesheet.
2024-01-10 14:31:26 +01:00
Cris 5452dc6fe3 Adapted: getVorgesetzte retrieve only the latest Vorgesetzte
Added order by and limit to get only one and the most actual Vorgesetzte
2024-01-10 14:29:16 +01:00
Harald Bamberger 36f97bafd6 Merge branch 'feature-30659/SearchBar_Controller_sollte_Berechtigungen_berücksichtigen_können' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-10 14:19:37 +01:00
Harald Bamberger dff97f7c53 Merge branch 'feature-34874/pv21_fas_stundensaetze' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-10 14:18:25 +01:00
Harald Bamberger 49d24d74b0 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-10 13:54:06 +01:00
cgfhtw e907c0b596 Studstatus: use current semester in WiederholerDeadline Job 2024-01-09 15:05:05 +01:00
cgfhtw 2faf310105 Studstatus: Leitungsansicht Sortierung AntragId 2024-01-09 13:40:48 +01:00
ma0048 125bf40fd1 - personensuche im cis ueber die globale suche mithilfe einer config deaktivierbar
- vereinfachte logik fuer die profi link anzeige ueber die globale suche
2024-01-09 12:00:11 +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
Cris d522389f76 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of https://github.com/FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2024-01-08 11:47:17 +01:00
cgfhtw 5b62271711 s&d 2024-01-02 09:36:28 +01:00
Werner Masik 9460d2b2cd removed reactivity warning 'Vue received a Component that was made a reactive object' 2023-12-29 17:09:38 +01:00
cgfhtw 43813b3ef0 getActiveStgs 2023-12-27 10:51:57 +01:00
cgfhtw aa5868826f getAntraege 2023-12-27 10:26:42 +01:00
KarpAlex 2c16e293a0 Merge branch 'master' into feature-33003/BIS_Meldung_Personal 2023-12-24 00:00:27 +01:00
KarpAlex 3e7d917184 deleted anrechnung von outgoing lvs file in dbupdate folder 2023-12-22 19:07:15 +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
ma0068 e7703f3c9b neues Attribut abschlussbeurteilung_deutsch 2023-12-22 07:55:29 +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
Harald Bamberger dcc0093987 sachaufwand_id_seq rechte fuer vilesci user 2023-12-21 14:49:50 +01:00
Harald Bamberger 52b1598ab4 zusaetzlicher Teilzeittyp Wiedereingliederungsteilzeit 2023-12-21 14:44:07 +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
ma0048 ef117fbe12 - neue vorlage beim akzeptieren
- neuer filter
- button "alle geplanten markieren"
2023-12-20 16:02:44 +01:00
Harald Bamberger 60ad46b2fb and another dependency of Tabs 2023-12-20 15:24:56 +01:00
Harald Bamberger 2a9181d28d add another dependency of Tabs 2023-12-20 15:20:06 +01:00
Harald Bamberger 1aa6d07559 add dependency for Tabs 2023-12-20 15:09:49 +01:00
Harald Bamberger d9cd3a0b1d add files for manipulating tabs from feature-30660 2023-12-20 14:30:11 +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
KarpAlex 8b9c023781 Personen zusammenlegen: Rueckstellungen are checked 2023-12-18 17:51:05 +01:00
KarpAlex e60157dd9b Personen zusammenlegen: uhstat1daten are checked 2023-12-18 17:16:20 +01:00
KarpAlex f6e7d2858a Merge branch 'master' into feature-21620/Neues_Feld_zum_Erfassen_des_ESI 2023-12-18 17:01:25 +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
Cris 00a1c66d86 Corrected: Tagesgenaue Prüfung auf AZG-relevant 2023-12-13 16:14:08 +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
Cris bf20854878 Corrected: Tagesgenaue Prüfung auf Homeoffice 2023-12-13 14:09:20 +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
Werner Masik 52cc0db5da phrases for off time view 2023-12-11 21:28:52 +01:00
ma0048 289358ac6e - inaktive noten durchgestrichen im fas 2023-12-11 13:46:18 +01:00
ma0048 8f46613620 - kopieren von fragen erschweren 2023-12-11 13:30:39 +01:00
Cris 1797abdc5f Merge remote-tracking branch 'origin/feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-12-11 13:22:58 +01:00
Cris bb9eb31e6e Adapted getWochenstunden in Vertragsbestandteil Class to handle Karenz
Karenzierte Dienstverhältnisse werden nicht zurückgegeben.
Dafür aber ein eventuelles 2.DV mit geringfügiger Beschäftigung neben der Karenz.
2023-12-11 13:11:33 +01:00
Cris a361036aa9 Added method isKarenziert to Vertragsbestandteil Class
Prüft, ob MitarbeiterIn zum Abfragedatum karenziert ist.
Wenn kein Datum übergeben wird, wird das heutige Datum gesetzt.
2023-12-11 13:09:56 +01:00
Cris 26ab9ff221 Updated 3 Vertragsbestandteil-Methods: Set 'Order By' to retrieve very last active Vertragsbestandteil 2023-12-11 13:08:57 +01:00
Harald Bamberger 28128ee35e Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-12-11 08:02:21 +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
Harald Bamberger 85a743b43a Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-12-07 08:03:34 +01:00
kindlm a246513597 Spalte Organisationseinheit 2023-12-06 18:18:34 +01:00
Manfred a2e6927740 Merge branch 'master' into benutzerberechtigungGUIneu 2023-12-06 18:11:07 +01:00
kindlm 13092be05c Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-12-06 18:07:26 +01:00
kindlm c87ae7e74d Suche Person in OE; OE in Rechteliste OE-Suche 2023-12-06 18:06:46 +01:00
Manfred d35223c1a3 Merge branch 'master' into benutzerberechtigungGUIneu 2023-12-06 18:04:25 +01:00
Cris 8a29146fc2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-12-06 14:42:45 +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
Cris bd4a0af690 Removed 'Lehre Saldo anzeigen' 2023-12-06 13:31:06 +01:00
Cris f18aa42966 Added function getWochenstunden to Vertragsbestandteil Class 2023-12-06 13:24:52 +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
kindlm 32459ccff8 Statistik Load TimeLimit auf 600 gesetzt
Default Parameter bei Statistik aktualisiert
2023-12-05 14:38:07 +01:00
cgfhtw 98de634393 s&d 2023-12-05 09:27:20 +01:00
Cris 83e3898b31 Merge branch 'feature-28269/Zeiterfassung-an-neue-Vertragsstruktur-anpassen' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-12-04 17:35:01 +01:00
Cris 7d701835cc Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of https://github.com/FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-12-04 17:34:19 +01:00
Cris 4552050c8a Changed: Allin Saldoanzeige an neue Vertragsstruktur angepasst 2023-12-04 17:30:10 +01:00
Cris b6b8f0d182 Removed unused require_once files 2023-12-04 17:25:43 +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
Harald Bamberger 8b55a7843d altersteilzeit geblockt mit 0 Stunden zulassen 2023-11-29 07:33:38 +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 ff302e6173 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-28 13:08:14 +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 a5d21b3b8d extend DV overlap check 2023-11-28 12:43:25 +01:00
Werner Masik a613abea39 fix kurzbz check 2023-11-28 12:18:13 +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 b80df4f0eb refactor benutzerfunktion handling 2023-11-27 07:37:19 +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
ma0048 801780de29 - wording 2023-11-23 09:24:34 +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
ma0048 cc589a401c - stundensaetze fas 2023-11-22 12:47:33 +01:00
Harald Bamberger 58fa399436 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-21 21:29:18 +01:00
Werner Masik cccdfa1ac8 extracted function for generation employee kurzbz 2023-11-21 17:45:20 +01:00
Andreas Österreicher d67d71abd5 Beträge am Lehrauftrag werden Abhängig von der Vertragsart angezeigt und nicht mehr
anhand der Inkludierten Lehre
2023-11-21 11:20:05 +01:00
cgfhtw 73e8761728 Bugfix: Lvzuweisung - DB Errors in production 2023-11-21 10:46:23 +01:00
Andreas Österreicher 5263ffbb7b Lehreinheiten Vorrückung berücksichtigt neue Vertragsstruktur und
Stundensätze
2023-11-21 09:53:00 +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
Harald Bamberger 11926ca9b2 refactor creation of benutzerfunktiondata, add check for already used benutzerfunktionen in another vb 2023-11-20 09:19:32 +01:00
Andreas Österreicher 72210867a5 Suche an neue Vertragsstruktur angepasst und Feature-Toggle Config
hinzugefügt zum Umschalten zwischen alter und neuer Vertragsstruktur
2023-11-17 14:43:23 +01:00
Andreas Österreicher 9f2eeabdd1 BIS-Verwendung aus Lehrtaetigkeitsbestaetgung entfernt da nicht vewendet 2023-11-17 14:07:18 +01:00
Andreas Österreicher 66d8db7987 Berechtigung für Zugriff auf HR Schema für Web User hinzugefügt 2023-11-17 13:55:32 +01:00
cgfhtw a82df1058d Phrasen Plugin: async loadCategory function & use Vue.computed() 2023-11-16 15:23:40 +01:00
KarpAlex cf85cb084f dbupdate habilitation: added file to dbupdate3.4, code formatting 2023-11-15 20:51:44 +01:00
ma0068 9fdef54efc Funktion json2odt für newline Qualifikationsziele 2023-11-15 14:24:47 +01:00
ma0068 dc76ae8506 neue Tags addon_aktiv und lernergebnisse 2023-11-15 09:44:25 +01:00
Harald Bamberger f9cf1a5b32 change perstistenceID to force new settings in browser localstorage 2023-11-14 22:55:29 +01:00
Harald Bamberger b7c60fe1ef Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of github.com:FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-14 14:09:16 +01:00
Harald Bamberger 98eb3fbd8b exclude werkvertrag from overlap check 2023-11-14 14:09:06 +01:00
Andreas Österreicher 7f3b1417fd Neuen Gehaltstyp für Zusatzvereinbarung hinzugefügt
Anpassung am Gehaltsimport:
- All-In Bestandteile werden als Zulage importiert
- Zusatzvereinbarungen im neuem Typ Zusatzvereinbarung
- Import funktioniert jetzt auch für Personen die ihr DV nicht mit
  Monatsersten starten sondern ein paar Tage später
2023-11-14 13:37:03 +01:00
Harald Bamberger d6ce81462f Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of github.com:FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-14 10:36:25 +01:00
Harald Bamberger 7640d4024f alter handling of benutzerfunktion and vertragsbestandteilfunktion 2023-11-14 10:36:01 +01:00
ma0048 1b19c2c306 - feature-34579
- gehaltsabrechnung umbenannt
- historie uid hinzugefuegt
2023-11-13 14:21:35 +01:00
cgfhtw 5b2bfb9340 Code optimizing 2023-11-13 09:52:04 +01:00
Harald Bamberger f2208aa684 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-10 17:01:37 +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
Cris 9111a10414 Changed Tabulators new-Button to btn-primary color 2023-11-09 12:25:44 +01:00
Cris 410dc022d4 Merge remote-tracking branch 'origin/feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-09 12:21:30 +01:00
Harald Bamberger 441a95de7e Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-11-09 12:12:26 +01:00
Harald Bamberger 4bfc26006b Merge branch 'feature-28886/Filter_Component_vs_Table_Component' 2023-11-09 11:48:51 +01:00
KarpAlex 3a8216577f added column habilitation to tbl_mitarbeiter 2023-11-09 10:53:04 +01:00
Harald Bamberger 95fa0cfbf6 change date handling benutzerfunktion 2023-11-08 11:57:57 +01:00
cgfhtw 05744f3921 Bugfix 2023-11-08 09:35:23 +01:00
Werner Masik 3b5f2e6494 added delete for Gehaltsabrechnung 2023-11-08 09:22:14 +01:00
Harald Bamberger 178a383c04 fix typo 2023-11-07 16:26:18 +01:00
Harald Bamberger e4a99b4c84 upgrade datepicker to version 7.2.0, change Dienstverhaeltnis class to honor checkoverlap flag 2023-11-07 11:04:39 +01:00
Werner Masik a806df72e8 increased REST TIMEOUT constant to 5000 2023-11-07 10:52:01 +01:00
Werner Masik 9c1cc947e6 removed superfluous library for multiselect 2023-11-07 10:46:38 +01:00
Werner Masik 624df81da1 add primevue multiselect 2023-11-07 10:33:37 +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 5a8a7d2401 add multiselect used by pv21 2023-11-02 08:19:33 +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 f7ffbfb914 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of https://github.com/FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-10-31 13:01:41 +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
Cris c494dd1cdc Added handleFormErrors- and resetFormErrors method to FhcAlert Plugin 2023-10-31 10:41:00 +01:00
Cris 5a002c0f04 Minor change: Adapted mail-text 2023-10-31 10:40:06 +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
Cris fbb00be7cd Added slot 'search' to Filterwidget.js
Slot to inject a autoselect / inputfield to search tabulator, if tabulator should stay empty until search results are provided. (Example: performance reasons if too many data; search for multiple at once)
2023-10-25 12:55:35 +02:00
Cris c6d82fe029 Minor style change of confirmDelete message 2023-10-25 12:49:37 +02:00
Cris 6b2150b066 Fixed: unknown 'fhcerror' to this 2023-10-25 12:48:00 +02:00
Cris 007ee49844 Merge branch 'feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' of https://github.com/FH-Complete/FHC-Core into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-10-24 15:51:10 +02:00
cgfhtw 73cbaf77f1 CSV Options adjusted for German MS Office 2023-10-24 14:16:13 +02:00
cgfhtw 22453c71b4 fhcAlert: slight improvements 2 2023-10-24 13:35:50 +02:00
cgfhtw d57fd9eb60 fhcAlert: slight improvements 2023-10-24 12:23:12 +02:00
ma0068 aead4f3380 Assistenz als CC zu SammelmailSTGL hinzugefügt 2023-10-24 10:44:17 +02:00
Harald Bamberger 05e2808f00 add Models for Vertragsbestandteiltyp and VertragsbestandteilFreitexttyp, implement IValidation Interface on AbstrcatBestandteil, add OverlapChecker checking for overlapping VBs against DB 2023-10-23 17:58:18 +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
Harald Bamberger 479df7189c add oetyp to oe and kst labels in search results 2023-10-19 16:38:15 +02:00
cgfhtw b01cd99a93 Plugin: Fhc Alert 2023-10-19 14:10:55 +02:00
Harald Bamberger eee6f918cd add oe_typ_kurzbz and oe_typ_bezeichnung to use in labels 2023-10-19 13:05:02 +02:00
ma0048 6a008fc5da - filter hinzugefuegt 2023-10-17 16:38:05 +02:00
Cris c0b4ad2633 Merge branch 'feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' of https://github.com/FH-Complete/FHC-Core into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-10-17 11:38:29 +02:00
Cris d85bbac19b Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-10-17 11:32:01 +02:00
Cris 0f80b9d31b Added Primevue-Toast and -Confirmdialog libraries to FHC-Footer 2023-10-17 11:30:35 +02:00
Harald Bamberger 1bc957821e Merge branch 'bug-29815/ModifyCoodleIcalTerminbestaetigungen' 2023-10-17 07:27:30 +02:00
Andreas Österreicher 22d3b08a06 Escaping von LVs mit Sonderzeichen 2023-10-16 11:08:34 +02:00
Andreas Österreicher 60ee3ec8f0 UID Generierung bei Incoming um Nachname, Vorname ergänzt 2023-10-16 10:26:23 +02:00
Harald Bamberger dcb308a535 change datum_von of benutzerfunktion if vb gueltig_ab is earlier 2023-10-13 16:45:30 +02:00
Harald Bamberger 52dd2c56a2 Merge branch 'bhdev-studstatus' 2023-10-12 16:24:20 +02:00
Harald Bamberger d06819f25f comment out info_ studierendenantrag phrase 2023-10-12 16:07:20 +02:00
Harald Bamberger b5c0c14e2a fix typo 2023-10-11 19:20:40 +02:00
Andreas Österreicher 41a51ee286 Allin und Befristung wird mit Titel und Anmerkung migriert 2023-10-11 16:50:18 +02:00
Harald Bamberger 7042427110 fix sql _mitarbeiter_ohne_zuordnung 2023-10-11 16:11:19 +02:00
cgfhtw 56f26e6ebe Bugfix: FilterCmpt: reload function 2023-10-11 15:39:14 +02:00
cgfhtw 9d31cdffe6 Bugfix: handle reload event of Table.js 2023-10-11 14:59:54 +02:00
cgfhtw 95d3b6ac5b Bugfix: Phrasen: local variable has overwritten function parameter 2023-10-11 14:57:44 +02:00
cgfhtw af89ec3942 Bugfix: Phrasen: local variable has overwritten function parameter 2023-10-11 14:44:24 +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
cgfhtw ebdd6a2040 Bug: Wiederholer Reminder werden nicht versandt - Fehlerquelle Datumsbereich wenn Prüfungen mehr als ein Monat verteilt 2023-10-10 14:16:32 +02:00
cgfhtw 6137cf3347 Remove unnecessary comment 2023-10-10 14:11:21 +02:00
cgfhtw b5ce0ba7ed Remove unnecessary comment 2023-10-10 13:12:51 +02:00
cgfhtw 5010a1653a cleaner config 2023-10-10 13:09:43 +02:00
cgfhtw 0a25982fa2 Do not allow frozen columns to be invisible 2023-10-10 13:09:28 +02:00
cgfhtw c5b246dc8e CSS table row hovering 2023-10-10 13:08:43 +02:00
Werner Masik 229d34d168 phrases update 2023-10-09 20:29:54 +02:00
Werner Masik 15225d0b03 added Benutzerfunktion CRUD methods 2023-10-09 20:29:54 +02:00
Werner Masik bf85534011 phrases update 2023-10-09 20:29:54 +02:00
Werner Masik 2298823f70 added phrarses for job functions 2023-10-09 20:29:54 +02:00
Harald Bamberger a4d0653c44 add IF NOT EXISTS to schema and extension creation 2023-10-09 15:49:59 +02:00
cgfhtw 17d5cff178 slightly better css 2023-10-09 15:13:00 +02:00
KarpAlex af678b3c56 added vue datepicker to composer 2023-10-09 14:29:38 +02:00
Harald Bamberger 2a72d48dea update composer.lock for php7.0 2023-10-09 11:48:50 +02:00
Harald Bamberger c1a53a1be3 do not use phrases from FHC_JS_PHRASES_STORAGE_OBJECT at all 2023-10-09 11:47:02 +02:00
Harald Bamberger 4cc8b555d2 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-10-09 11:38:37 +02:00
Harald Bamberger 3ab8fd22f4 minor layout changes 2023-10-06 20:22:05 +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
Andreas Österreicher cda93ce85b Fixed PHP81 Warning on Loading Adresses 2023-10-05 08:14:32 +02:00
Harald Bamberger c1171bc716 add user_language to FHC_JS_DATA_STORAGE_OBJECT 2023-10-04 12:20:44 +02:00
Harald Bamberger b618ad247a Merge branch 'feature-33459/Studierendenstatusverwaltung_Unterbrechung_Studiensemester' 2023-10-02 16:45:44 +02:00
ma0048 6c8b3b4ec4 - nur an markierte msg moeglich 2023-10-02 14:12:03 +02:00
cgfhtw ad191f3f90 Optische Verbesserungen select field 2023-10-02 11:06:53 +02:00
cgfhtw 54bcf83781 s&d 2023-10-02 11:06:34 +02:00
Werner Masik cc7067d8e5 updated phrases 2023-09-29 15:28:19 +02:00
Andreas Österreicher c828fe2ee4 Version für Legacy BPK Schnittstelle angepasst 2023-09-29 12:58:30 +02:00
ma0048 dc78660433 - fix for fas 2023-09-29 09:49:12 +02:00
ma0068 8fe72ebcf5 neues Element last_prestudentstatus for studienerfolg.xml 2023-09-28 16:47:44 +02:00
Harald Bamberger a237cb1808 check if there are any entries 2023-09-28 15:58:35 +02:00
Harald Bamberger af3588aa61 revert commented lines for the moment until there is a better solution 2023-09-28 15:45:03 +02:00
Harald Bamberger 867a1e94c7 Merge branch 'feature-27351/Digitalisierung_Formulare_Neu' 2023-09-28 14:37:04 +02:00
Harald Bamberger 137c5f28ec modify Phrasen.js so that it can be used by composition api and does not use legacy categories at all 2023-09-28 14:27:35 +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 4fcf4a57d1 Adaptierung rdfs mit CDATA 2023-09-27 09:57:39 +02:00
ma0068 1809ff3008 accept days, weeks, month and years in config 2023-09-27 08:30:03 +02:00
Werner Masik 909fc896cd added phrases 2023-09-26 22:38:12 +02:00
Werner Masik 5827bde6b0 update phrasen 2023-09-26 15:27:50 +02:00
Werner Masik 822e269f88 add composable wrapper for phrasen mixin 2023-09-26 15:25:49 +02:00
Harald Bamberger f5bbc8a0c0 do not use category from window.FHC_JS_PHRASES_STORAGE_OBJECT since it is propably not complete 2023-09-26 15:11:16 +02:00
Harald Bamberger 67a61c5d2a add phrase to try vue Phrasen 2023-09-26 11:46:48 +02:00
Harald Bamberger f3809b01b2 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-09-26 11:14:47 +02:00
Harald Bamberger 5febccba8a port phrases mixin and Endpoint from branch feature-27351/Digitalisierung_Formulare_Neu 2023-09-26 11:12:15 +02:00
Harald Bamberger d8bd100dbb Merge branch 'master' into feature-27351/Digitalisierung_Formulare_Neu 2023-09-25 16:53:33 +02:00
Harald Bamberger 31426d3c5e Merge branch 'master' into feature-27351/Digitalisierung_Formulare_Neu 2023-09-25 16:50:40 +02:00
KarpAlex 972e9b7025 UHSTAT1 form: nations with sperre = true are not loaded 2023-09-25 16:45:39 +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
Cris 4e11e12c99 Removed aktiv column from SoftwareManagement Filter
Not used anymore.
2023-09-21 14:40:50 +02:00
Cris fa3a718ad4 Added getAutocompleteSuggestions method to OE Model
Get OEs by eventQuery string. Use with autocomplete event queries.
2023-09-21 14:40:05 +02:00
ma0068 e886b4742b Neue Mailvorlagen Sancho_Mail_Antrag_U_Student(SB) 2023-09-19 14:56:30 +02:00
Harald Bamberger 9bfcbf3bf1 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-09-19 11:06:32 +02:00
Harald Bamberger cbe73ae37c Merge branch 'feature-31018/pv21_stundensaetze' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-09-19 10:42:11 +02:00
Andreas Österreicher 4242f75fde Hiweistext bei Geburtsdatumsformat korrigiert bei Testclient 2023-09-18 12:35:45 +02:00
Andreas Österreicher 47c956bf1e Geburtsdatum Format korrigiert 2023-09-18 12:22:21 +02:00
ma0068 cdb351b66b Delete Testdata and outputs 2023-09-18 10:37:14 +02:00
Andreas Österreicher 418a149840 Merge branch 'TechnikumWienAcademy-master' 2023-09-14 13:12:08 +02:00
ma0048 91f3197c24 - added link option
- styling
2023-09-14 11:56:26 +02:00
nkrondraf e8c7ecf1ee Besuch der LV kann nun 3 Semester in Vergangenheit liegen für Prüfungsanmeldung 2023-09-14 10:50:04 +02:00
nkrondraf 2a77fb361a raise version number of API to 0.6 2023-09-14 10:32:09 +02:00
Andreas Österreicher 96f8ee33a9 Merge branch 'feature-29835/UHSTAT1_Erfassung_der_UHSTAT1_Daten_ueber_das_Bewerbungstool' 2023-09-12 11:05:37 +02:00
Werner Masik 2c92ec3e60 added overlaypanel and datatable 2023-09-07 22:29:29 +02:00
Andreas Österreicher 38da37980d Fehlerhaftes Escaping korrigiert damit inserts mit
standard_conforming_strings funktioniert
2023-09-07 15:34:55 +02:00
Andreas Österreicher 6fba58c113 Merge branch 'master' into feature-29835/UHSTAT1_Erfassung_der_UHSTAT1_Daten_ueber_das_Bewerbungstool 2023-09-07 14:56:18 +02:00
ma0048 0e1f4148f5 - anpassungen fuer bewerberautofill 2023-09-07 14:34:20 +02:00
KarpAlex 4175ecc209 UHSTAT1 form: added firstname and lastname of student 2023-09-05 16:49:19 +02:00
Andreas Österreicher 3e7abf9a45 Merge branch 'master' into feature-18571/EntwicklungsteamBisMeldung 2023-09-05 14:33:31 +02:00
ma0048 07deb7b6c5 - textanpassung 2023-09-04 13:34:42 +02:00
cgfhtw 7f0d716bd8 Finale Finalisierung Emailvariablen 2023-08-31 09:25:17 +02:00
cgfhtw 60246100e6 Bugfix: missing phrases 2023-08-31 09:24:43 +02:00
cgfhtw f81c9939f7 config default wert korrigiert 2023-08-31 08:39:21 +02:00
ma0068 1b1f45e690 bugfix Studiengang 2023-08-31 08:33:17 +02:00
Andreas Österreicher fc4915a6ee Merge branch 'feature-32834/infocenter_zusammenfuehren' 2023-08-31 08:11:22 +02:00
Andreas Österreicher ca79bb1f82 Merge branch 'TechnikumWienAcademy-master' 2023-08-30 16:22:04 +02:00
Nikolaus Krondraf 2fe9bda46b längeres Gültigkeitsdatum hinzugefügt 2023-08-30 14:40:52 +02:00
ma0068 20aaefffb1 Finalisierung Emailvariablen 2023-08-29 16:50:02 +02:00
Andreas Österreicher 86aac2388d Als Admin wird nun die Buchungsnummer im Konto Karteireiter im FAS
angezeigt damit diese einfach kopiert werden kann
2023-08-25 11:04:06 +02:00
Andreas Österreicher f3453670b3 Problem behoben wodurch der Plausicheck abgebrochen hat wenn
Studiengänge für den GebDatum Check exkludiert wurden.
2023-08-25 09:50:37 +02:00
Manfred b23eaa2967 Merge remote-tracking branch 'origin/master' 2023-08-24 14:28:58 +02:00
Manfred 6e2c5acc6f Eintrag Archiv für AbschlussdokumentLehrgaenge 2023-08-24 14:28:46 +02:00
ma0048 f8bbdf4b35 Merge remote-tracking branch 'origin/feature-28746/reihungstestjob_fallweise_wird_anzahlung_f_studienbeitrag_buchung_nicht_angelegt' into infocenter_2023_08_24 2023-08-24 11:00:34 +02:00
ma0048 a2a645b7c7 Merge remote-tracking branch 'origin/feature-29529/infocenter_anpassungen' into infocenter_2023_08_24
# Conflicts:
#	system/dbupdate_3.4.php
2023-08-24 11:00:16 +02:00
ma0048 2dbbadea2e Merge remote-tracking branch 'origin/feature-30956/auswertung_reihungstest_excel_problem' into infocenter_2023_08_24 2023-08-24 10:59:16 +02:00
ma0048 0f5c261528 Merge remote-tracking branch 'origin/feature-30693/infocenter_aufgenommen_filter' into infocenter_2023_08_24 2023-08-24 10:56:18 +02:00
ma0048 b93cfbfa9e Merge remote-tracking branch 'origin/feature-27691/sammeltask_aenderung_bewerberdefinition' into infocenter_2023_08_24 2023-08-24 10:56:04 +02:00
ma0048 7609554a74 Merge remote-tracking branch 'origin/feature-26667/reihungstestanmeldung_fuer_master_interessentinnen_ueber_online_bewerbungstool' into infocenter_2023_08_24 2023-08-24 10:55:47 +02:00
ma0048 26e63160ba - bug fix, bescheibung 2023-08-24 10:38:46 +02:00
ma0048 7c365cea81 - title aenderung 2023-08-24 08:01:36 +02:00
ma0048 db96dd1388 - bug fix 2023-08-24 07:56:49 +02:00
Manfred c440711145 Teilgebiete-Übersicht mit Spalten mehrsprachig und Offset 2023-08-22 15:53:19 +02:00
Andreas Österreicher 16366d976d Merge branch 'bug-32636/maillib_email_number_per_time_range' 2023-08-22 15:51:39 +02:00
Manfred ac945ab540 studiensemester_kurzbz in GET-Parameter eingefügt 2023-08-22 15:51:17 +02:00
Andreas Österreicher 0b51239f8c Fixed SQL Error when sending Anrechnungen Recommendation Reminder 2023-08-22 15:24:12 +02:00
Andreas Österreicher 45816c0352 Merge branch 'feature-30181/Anrechnungen_Erweiterte-Angaben-fuer-Studierende' 2023-08-22 14:50:32 +02:00
Andreas Österreicher 73a9d34fba Merge branch 'feature-29838/Anrechnungen-Sammelmail-fuer-LV-Leitung' into feature-30181/Anrechnungen_Erweiterte-Angaben-fuer-Studierende 2023-08-22 14:42:52 +02:00
Andreas Österreicher ac10473b08 Merge branch 'master' into feature-30181/Anrechnungen_Erweiterte-Angaben-fuer-Studierende 2023-08-22 14:40:56 +02:00
Andreas Österreicher 571ae5f6e5 Merge branch 'master' into feature-29838/Anrechnungen-Sammelmail-fuer-LV-Leitung 2023-08-22 14:40:23 +02:00
Cris 057b003977 Merge remote-tracking branch 'origin/feature-30181/Anrechnungen_Erweiterte-Angaben-fuer-Studierende' into feature-30181/Anrechnungen_Erweiterte-Angaben-fuer-Studierende
# Conflicts:
#	system/phrasesupdate.php
2023-08-22 13:42:32 +02:00
cgfhtw e6be6e19d1 Abmeldung PDF-Vorlage: Studiensemester added 2023-08-22 11:30:54 +02:00
cgfhtw 754ed07621 anzeige Lehrverband nach setUnterrbrecher im Fas 2023-08-22 11:18:47 +02:00
cgfhtw bf6fc52fcf Studierendenseite: Reihenfolge WH, Unterbrechung, Abmeldung; wording von du du auf indirekt 2023-08-22 11:18:35 +02:00
cgfhtw 294bfeb2e4 Sancho Mail Antrag_W_Student
Aufnahme der angerechneten bzw. neu zu absolvierenden LVs
2023-08-22 11:18:05 +02:00
cgfhtw b9bf2487c2 Stg-Ansicht: Status styled as link
Stg-Ansicht: Status styled as link
2023-08-22 11:13:56 +02:00
cgfhtw 8da161120f Abmeldung (Stg): Suche auch nach student_uid 2023-08-22 11:11:38 +02:00
ma0048 f9f0e238c6 - bug fix 2023-08-22 10:58:23 +02:00
ma0068 b468f01d0e Lv-zuweisung Breite vergrössert, Prestudent Status Unterbrechungssemester vor Vorrückung 2023-08-18 11:34:38 +02:00
Werner Masik 799911b948 added method to fetch DV by ID 2023-08-17 16:14:53 +02:00
ma0068 376ce0e440 WH: nur positive Noten bei intern angerechnet zulassen 2023-08-17 14:13:30 +02:00
ma0068 4a505631de Kein Verzicht bei Wiederholung 2023-08-17 13:54:34 +02:00
ma0068 1d938ea33d Anzeige following Studiensemester Wiedereinstieg 2023-08-17 13:46:58 +02:00
ma0068 70aa0a9c9c neue Mail an Assistenz: AbbrecherStgl 2023-08-17 13:18:06 +02:00
ma0068 743ba83148 Anzeige Studiensemester Abmeldung 2023-08-17 11:18:51 +02:00
ma0068 c7d2608cce Adaptierung Buttons: Zurückziehen Stgl und Ausblenden Anträge STGL nicht genehmigt Studentview 2023-08-17 11:10:09 +02:00
ma0068 672ee59ba5 neuer Hinweistext mit Einspruchsfrist für Abmeldung Stgl 2023-08-17 10:34:28 +02:00
cgfhtw 95e8859896 Bug Hotfix 2023-08-17 09:50:33 +02:00
ma0068 9aa5f701f7 phrasenupdate 2023-08-17 09:24:15 +02:00
ma0068 fcd3733f3c AbmeldungStgl GrundDropdown 2023-08-17 09:12:30 +02:00
KarpAlex fab1022c49 tbl_uhstat1daten: added primary key, removed abgeschicktamum (instead: own sync table) 2023-08-16 17:40:00 +02:00
KarpAlex b8aadab509 UHSTAT1 form: add insertamum and insertvon when inserting data 2023-08-16 11:12:09 +02:00
Harald Bamberger 08f79b69cb Merge branch 'feature-25003/NotenimportFuerNachpruefung' 2023-08-16 08:11:10 +02:00
Harald Bamberger 7bc1e8cdd9 Merge branch 'master' into feature-25003/NotenimportFuerNachpruefung 2023-08-16 07:57:56 +02:00
KarpAlex e784400943 uhstat1 data save: added uid 2023-08-16 01:21:05 +02:00
KarpAlex 8122ab0292 simplified error message for invalid status dates 2023-08-15 19:27:39 +02:00
KarpAlex c62198b4b5 UHSTAT form: added delete button for employees with permission, edit and delete buttons are only shown if user has permission 2023-08-15 18:27:30 +02:00
KarpAlex d200fc1961 bis tbl_uhstat1daten: added insertamum, insertvon, updateamum, updatevon and abgeschicktamum 2023-08-15 17:19:12 +02:00
ma0048 c4377010b1 - pv21 stundensaetze hinzugefuegt 2023-08-14 14:14:37 +02:00
ma0048 913f45fcda - auswertung_fhtw um studiengang typ erweitert 2023-08-14 11:53:36 +02:00
KarpAlex 3ea74ab23c Bismeldestichtage GUI: improved datepicker, correct Studiensemester sort, insertamum is set when inserting 2023-08-10 23:15:44 +02:00
Cris e1c23fc6fa Added Filter ImageVerwaltung 2023-08-10 11:34:54 +02:00
cgfhtw 353e2deaf7 AbortController 2023-08-10 11:02:45 +02:00
Harald Bamberger 597e074bbd Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-08-09 11:13:02 +02:00
Cris b7a3d2dcb4 Removed column 'actions' from filtersupdate 2023-08-09 10:57:06 +02:00
Cris 49e4aa78e9 Merge branch 'feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' of https://github.com/FH-Complete/FHC-Core into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-08-09 10:43:57 +02:00
cgfhtw f9be090bbf Studierendenansicht: nur STGs anzeigen bei denen ein Status "Student" vorhanden ist. 2023-08-08 16:59:42 +02:00
cgfhtw b77e715bdb Font Awesome + Buttons in Studierendenansicht korrigiert 2023-08-08 16:26:15 +02:00
cgfhtw c9e947831e PDF Unterbrechung: Auch in status EmailVersandt abrufbar 2023-08-08 16:16:09 +02:00
cgfhtw 44141ce8d8 PDF Download "Abmeldung durch Stgl" 2023-08-08 16:08:15 +02:00
cgfhtw 9dc36af7fc Umlaute & Genehmigt => Bestätigt 2023-08-08 15:37:20 +02:00
cgfhtw 5c018e204e Lv Popup optische Verbesserungen 2023-08-08 15:12:23 +02:00
cgfhtw 61c6245e1a Phrasen: Antrag => Bekanntgabe 2023-08-08 14:39:05 +02:00
cgfhtw da0dc0e053 Missing Phrase Category in Controller 2023-08-07 13:05:13 +02:00
KarpAlex 4a2cdaf52a added primevue autocomplete 2023-08-04 14:46:53 +02:00
cgfhtw d0d42a6a15 Unterbrecher - Wiedereintrittssemester Dropdown 2023-08-04 14:11:03 +02:00
Harald Bamberger 9550457b24 Merge branch 'master' into feature-27351/Digitalisierung_Formulare_Neu 2023-08-03 18:20:05 +02:00
Harald Bamberger d1eaebba33 Merge branch 'master' into feature-27351/Digitalisierung_Formulare_Neu 2023-08-03 18:18:43 +02:00
Cris 56230e3752 Changed button-color of Tabulators Header-'ADD Button' to primary color 2023-08-03 09:45:45 +02:00
Cris 4e17be39f6 Added column 'actions' to filtersupdate 2023-08-03 09:44:28 +02:00
KarpAlex 2f001987f3 Filter.js additional columns: additional columns are displayed based on field name, not title 2023-08-02 19:14:58 +02:00
Manfred d689e8fb2f Tablesorter, Datepicker und Spalte mit Lehrform in ueberbuchung.php 2023-08-02 18:24:11 +02:00
KarpAlex 553f2feaa4 filter component: enabled nested tabulator 2023-08-02 16:22:10 +02:00
Cris b70011436e Added column 'softwarestatus_kurzbz' to filtersupdate 2023-08-02 13:39:47 +02:00
KarpAlex d50ba773fe UHSTAT 1 form: correct authentification (from bewerbungstool or with permission), beautified success and error messages, added Rechtsbelehrung, simplified parameter checking 2023-08-01 19:26:36 +02:00
Manfred 392112977c Merge remote-tracking branch 'origin/master' 2023-08-01 18:24:44 +02:00
Manfred f5703a2438 Kleine Anpassungen Testtool-Auswertung
- %-Spalte in Auswertung Detail
- Vorschlag-Nummer in Auswertung_detail_frage
2023-08-01 18:23:24 +02:00
Harald Bamberger 8eeb0d9ca7 gehaltsbestandteillib set uid to pgsql 2023-08-01 14:37:07 +02:00
Harald Bamberger c8703d3215 write current uid to pgsql settings variable 2023-08-01 13:03:05 +02:00
Cris b5a81b540f Added Begruendung ECTS and Begruendung LV Inhalt to STGL- and Lectors Detail-Views 2023-07-31 13:53:24 +02:00
Cris 4c75f908b9 Added card 'ECTS Berechnung Referenzbeispiele' to Infobox 2023-07-31 12:50:06 +02:00
Cris 83bf874156 Removed link 'ECTS Berechnung Referenzbeispiele' 2023-07-31 12:48:56 +02:00
Paolo 043a2538b7 Updated 2023-07-31 12:12:59 +02:00
Cris dd392caef7 Adapted max/min length for Begruendung ECTS and Begruendung LVinhalt 2023-07-31 11:44:19 +02:00
Cris 096b436d54 Added phrases for Begruendung ECTS and Begruendung LVinhalt 2023-07-31 11:43:24 +02:00
Cris 44182af5fa Formatted Tabulator Header: Abstaende vergroessert
Abstand Titel zu Actionbuttons und zwischen Actionbuttons untereinander vergroessert
2023-07-31 09:30:45 +02:00
cgfhtw af24ef1517 Bug: neue Unterbrechung 2023-07-31 09:08:33 +02:00
KarpAlex cfb034bc69 uhstat form: disabled input fields if uhstat entry already saved 2023-07-28 22:39:50 +02:00
KarpAlex 349e9b9442 UHSTAT1 form: removed geburtsstaat from database table, data is shown if uhstat entry already exists 2023-07-28 22:15:26 +02:00
KarpAlex 1e082ed225 UHSTAT1 form: removed geburtsnation as it is saved in person table anyways, started to display existing uhstat data on form load 2023-07-27 17:13:31 +02:00
KarpAlex 459f068765 bismeldestichtag gui: added icon to delete button, added id field 2023-07-26 20:59:05 +02:00
Harald Bamberger 270c9e1741 remove hasSequence again to avoid error, check vbs basedata and specialdata if not empty before update 2023-07-26 19:23:31 +02:00
Harald Bamberger 3eaefc88bd set hasSequence correct 2023-07-26 18:40:37 +02:00
Harald Bamberger bbe1fe2d49 refactor markDirty check 2023-07-26 17:41:23 +02:00
Harald Bamberger 18e82225ce handle vertragsbestandteil_kurzbz different for insert and update 2023-07-26 17:28:37 +02:00
Harald Bamberger ac5d6071cd extend VerttragsbestandteilLib to keep track on modified columns and only update dv, vbs and gbs when they differ from the status in the db 2023-07-26 16:27:34 +02:00
ma0048 91f79b2021 - aufgenommen filter infocenter fuer lehrgaenge 2023-07-26 13:27:51 +02:00
cgfhtw 02b64ad6a7 Assistenz kann eigene Abmeldungen Zurückziehen 2023-07-25 13:59:18 +02:00
cgfhtw 7239113847 Optionaler Grund bei Einspruch ablehnen 2023-07-25 13:42:38 +02:00
cgfhtw 8c98cea114 semicolon 2023-07-25 13:37:03 +02:00
ma0068 6eaa8c4c01 Codesniffer and MassDetector 2023-07-24 16:04:46 +02:00
KarpAlex f5ace15f7b added phrases to UHSTAT1 form 2023-07-24 14:15:22 +02:00
Cris 74b1ca0614 Added phrases for Begruendung ECTS and Begruendung LVinhalt 2023-07-24 10:24:21 +02:00
cgfhtw 5d97abc6ac Mails 2023-07-20 16:55:09 +02:00
cgfhtw b4370ece82 Comment added 2023-07-20 15:07:46 +02:00
cgfhtw 8923a099cc Sammelmail Stgl & Calltoactions in Student view 2023-07-20 15:04:49 +02:00
cgfhtw 5670bac3f6 Don't allow canceling of Stg Abmeldungen 2023-07-20 15:04:18 +02:00
cgfhtw 35d01b042e Bug canCancel in abmeldung->edit missing 2023-07-20 15:00:42 +02:00
Cris 110d6bace3 Adapted backend logic to save/retrieve begruendung_ects and begruendung_lvinhalt 2023-07-20 13:42:53 +02:00
Cris 54d819e1ea Adapted GUI to display and save begruendung_ects and begruendung_lvinhalt 2023-07-20 13:38:52 +02:00
Cris 8bb3b6d53c DB Update: added 2 attributes to tbl_anrechnung
- begruendung_ects (text)
- begruendung_lvinhalt (text)
2023-07-20 10:48:03 +02:00
Cris 550df4fbd8 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-07-19 15:56:49 +02:00
Cris 1aae75312e Merge remote-tracking branch 'origin/feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-07-19 10:30:31 +02:00
KarpAlex d88ff104a3 filter component: added property tabulatorAdditionalColumns for displaying additional columns not in filter 2023-07-18 19:11:10 +02:00
Paolo 6a7903ef05 - Changed the controller components/SearchBar.php constructor to _not_ start the authentication when the AuthLib is loaded and to check if the user is logged
- Added constant ERROR_NOT_AUTH to libraries/SearchBarLib.php
2023-07-18 16:01:03 +02:00
KarpAlex c2962f51e1 Bismeldestichtag gui: added vue date picker 2023-07-17 21:03:51 +02:00
ma0068 5e6262da56 Config für Datum Start Digitalisierung, finish handleWiederholerDeadline, start Sammelmail an Stgl 2023-07-17 16:29:03 +02:00
ma0048 5f096b58b7 - STG beim nicht vorhanden Master RT anzeigen 2023-07-17 13:52:06 +02:00
KarpAlex c6fee48c8c bismeldestichtage GUI: correct date format on row click 2023-07-17 12:31:45 +02:00
Paolo 88b01075c4 Merge branch 'master' into feature-25563/PV21_Verschlüsselung_Gehaltsdaten 2023-07-17 12:13:45 +02:00
KarpAlex 7ab5d3add6 Bismeldestichtage Management GUI: added row delete button 2023-07-17 12:11:15 +02:00
Paolo 75fb0f2d4a - include/filter.class.php -> loadValues now calls the superclass protected method replaceSQLDecryptionPassword to replace password variables with their values
- include/statistik.class.php -> loadData now calls the superclass protected method replaceSQLDecryptionPassword to replace password variables with their values
- Added new functions hasSQLDecryption and isSQLDecryptionValid to include/functions.inc.php
- Script vilesci/statistik/filter_details.php and vilesci/stammdaten/statistik_details.php now do not allow to store SQL strings that contain PostgreSQL decryption functions using a clear password
2023-07-17 12:06:37 +02:00
Paolo 2cc0283d25 Added new protected method replaceSQLDecryptionPassword to include/basis_db.class.php 2023-07-17 12:04:26 +02:00
KarpAlex 68fbc13a69 added first version of uhstat1 form, added unique constraint for person_id in uhstat1daten table, added permissions for uhstat1daten sequence 2023-07-15 19:57:51 +02:00
ma0068 073cd6cb23 neue Tags für Anzeige Semester in Anrechnungen 2023-07-14 14:17:05 +02:00
cgfhtw a96d99bcd1 Sammelmails: draft 2023-07-13 16:51:54 +02:00
cgfhtw a53ca81784 Wording Änderung bei Studierendenansicht Wiederholung 2023-07-13 16:51:14 +02:00
cgfhtw b04aefc105 Unterbrechung nur für das Aktuelle und kommende Semester 2023-07-13 16:13:40 +02:00
Harald Bamberger 2b4a4d12a9 handle empty teilzeittyp_kurzbz 2023-07-13 15:08:51 +02:00
cgfhtw 9d0801676d Bug: Studierenden-Ansicht: Abmeldung bearbeiten bei mehrfachen Abmeldungen 2023-07-13 14:44:51 +02:00
cgfhtw c8fc6c747f Table height & Bug: Allowed/Shown Stgs in Component 2023-07-13 13:57:17 +02:00
cgfhtw f8da119ad7 Abmeldung: Einspruch Abgelehnt handling 2023-07-13 11:48:25 +02:00
Harald Bamberger 545b9cb0de modify searchbar add category for employess without kst and oe assignment 2023-07-13 11:35:42 +02:00
ma0048 3192a1b3f2 - job hinzugefuegt um bewerber status automatisch zu setzen
- fas filter hinzugefugt
2023-07-12 09:47:01 +02:00
ma0068 6f1eed6696 Abbrecher 2dos: Änderungen Wordings, neue Statusgründe preabbrecher, durchStgl, durchStud, update setAbbrecher 2023-07-11 17:01:22 +02:00
ma0048 533291bf33 - bug fix
- neue sortierung
- neue spalte
- sqls abfragen angepasst
2023-07-11 14:17:51 +02:00
ma0068 f438d240f9 Update Wording Antrag -> Verwaltung, Genehmigen-> Bestätigen, Überspringen Button Ausblenden 2023-07-11 13:07:54 +02:00
cgfhtw 1aa78386f4 erledigte TODOs entfernt 2023-07-11 08:33:05 +02:00
Harald Bamberger 02291a51e9 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-07-10 17:21:48 +02:00
Andreas Österreicher f4c8f00c8f Added AuthLib to Searchbar Component 2023-07-10 17:18:30 +02:00
cgfhtw 2213fed5b2 Phrasen 2023-07-10 16:39:20 +02:00
Andreas Österreicher 477da65817 Laden der Organisationseinheiten bei Berechtigungszuordnung behoben 2023-07-10 15:17:09 +02:00
cgfhtw cb1c4d01e0 phrasen: dokumente 2023-07-10 14:45:31 +02:00
cgfhtw 3219f43e6d Fehlerhafte Anzeige bei Download von Anträgen 2023-07-10 14:36:54 +02:00
cgfhtw 25258f7d87 E-Mail Reminder für Wiederholer sollen an die FH Adresse des Studierenden geschickt werden 2023-07-10 14:27:50 +02:00
cgfhtw 15786dd772 CIS URLs in Sancho mails 2023-07-10 14:03:03 +02:00
cgfhtw e6a1ea621e Bug: Semester in PDFs 2023-07-10 13:52:29 +02:00
cgfhtw eee3aa08e4 Zugriffsrechte für Abbrecher & Unterbrecher 2023-07-10 13:52:05 +02:00
Cris 0d690b60b6 Merge remote-tracking branch 'origin/feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-07-10 11:28:31 +02:00
cgfhtw 1006132451 Infomail 2023-07-10 11:19:21 +02:00
cgfhtw 3fce448451 Abmeldung durch Stgl: status => typ 2023-07-10 10:19:06 +02:00
cgfhtw 5eca034911 clean up 2023-07-10 09:29:00 +02:00
cgfhtw 761af30a75 speed up student selection 2023-07-10 09:21:12 +02:00
cgfhtw 573a8d8e33 composer lock 2023-07-10 09:09:46 +02:00
Manfred 1bca1a8dc3 Merge branch 'benutzerberechtigungGUIneu' 2023-07-07 12:48:07 +02:00
Manfred 94ff4b717d Versehentlich gelöschte Zeile wieder ergänzt 2023-07-07 12:46:06 +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
Manfred 5e88ccb5d7 Merge branch 'master' into benutzerberechtigungGUIneu 2023-07-06 18:09:45 +02:00
Manfred 9651903200 Diverse Titel und Textkorrekturen bei Rechte-Skripten 2023-07-06 18:08:06 +02:00
Manfred af9418d456 Anmerkung und Insertdaten bei Rolleberechtigung
+ Vergleichsskript für Rechte in einzelnen Rollen
2023-07-06 18:05:24 +02:00
Andreas Österreicher f35f41a049 Merge branch 'feature-29794/Lehrauftraege_Spalte-Stundensatz-fuer-STGL-und-KFL' 2023-07-06 15:44:16 +02:00
Andreas Österreicher 398b9f9d8f Merge branch 'feature-30393/Remove_check_tbl_benutzer.aktiv_in_AuthLib' 2023-07-06 14:14:47 +02:00
Andreas Österreicher cb4ce6dab6 Anzeige Lehre Saldo in der Zeitaufzeichnung deaktiviert 2023-07-06 13:30:43 +02:00
KarpAlex 539efcb6ec added Modal.js to Bootstrap components 2023-07-06 12:03:38 +02:00
Paolo d4450e1ae1 Removed check of the tbl_benutzer.aktiv field in the AuthLib 2023-07-05 15:07:05 +02:00
Andreas Österreicher f7dac04dae Merge branch 'feature-29133/einzelne_studiengaenge_aus_issues_check_ausnehmen' 2023-07-05 13:36:23 +02:00
ma0068 1e0e93dfa3 Autocomplete Add-Button Finish 2023-07-05 13:20:46 +02:00
cgfhtw 61856473ea Leitungsansicht Autocomplete 1st draft 2023-07-05 08:30:33 +02:00
Harald Bamberger c81404b210 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-07-04 18:12:23 +02:00
Werner Masik 800b490c62 added function to get chart data 2023-07-04 18:10:00 +02:00
cgfhtw 3ca80904ea Verbesserungen Unterbrecher bestätigen 2023-07-04 15:59:43 +02:00
KarpAlex ddf72af139 Merge branch 'feature-28886/Filter_Component_vs_Table_Component' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-07-04 14:43:28 +02:00
cgfhtw 3798720ee0 +emit: click:new 2023-07-04 14:38:20 +02:00
Cris 06b929381d Merge remote-tracking branch 'origin/feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software
# Conflicts:
#	system/filtersupdate.php
2023-07-04 13:48:21 +02:00
cgfhtw 7eed07a682 LV zuweisung & anzeige: handle semester above max_semester & anmerkung bug 2023-07-04 13:37:54 +02:00
KarpAlex fc147f577a filter.js: fix for nested tabulator: set columns before set data, filtersupdate: renamed columns 2023-07-04 12:17:15 +02:00
KarpAlex 388400338e Merge branch 'feature-28886/Filter_Component_vs_Table_Component' into feature-28575/Softwarebereitstellung_GUI_zur_Verwaltung_von_Software 2023-07-04 12:16:06 +02:00
cgfhtw ff93cb26fe Bug: status 2023-07-04 11:10:26 +02:00
cgfhtw b39fa7667e Remove TODO 2023-07-04 11:09:55 +02:00
cgfhtw 16356d8a5c reverse order setColumns & setData 2023-07-04 10:42:06 +02:00
cgfhtw 64ce3d1f6a Cleaned up commit from 'feature-27351/Digitalisierung_Formulare_Abmeldung_Unterbrechung_Wiederholung' 2023-07-04 10:34:14 +02:00
Andreas Österreicher 51d8a18565 MigrateSalary Problem behoben wodurch das Ende eines Gehaltsbestandteils
nicht korrekt gesetzt wurde wenn mehrere DVs vorhanden sind
2023-07-04 10:30:59 +02:00
Andreas Österreicher ee7fe0251d - Script fuer den einmaligen Import der Gehaelter hinzugefuegt
- Migration der Vertraege angepasst damit alle Mitarbeiter auf einmal
  migriert werden koennen. Anpassung zur Unterscheidung der Zuordnung zum
Unternehmen
2023-07-03 18:32:34 +02:00
KarpAlex 71e86cfcde filter.js bugfixes: saving customfilter, and set columns before data (necessary e.g. for nested tabulator) 2023-07-03 11:45:15 +02:00
Cris d5d7797eb7 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-07-03 09:58:54 +02:00
Cris 7356b17688 Added SW-ID column to SW-Table 2023-07-03 09:37:32 +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
ma0048 f49771ec7f - berechtigungen fuer die sequence hinzugefuegt 2023-06-29 12:10:50 +02:00
KarpAlex 097010290d Merge branch 'master' into feature-29144/Prestudent_status_nach_Bismeldung_sperren 2023-06-29 11:47:56 +02:00
Harald Bamberger 2a3eba6441 Merge branch 'master' into feature-25003/NotenimportFuerNachpruefung 2023-06-28 16:26:54 +02:00
KarpAlex 0a961d8e95 UHSTAT1 bis.tbl_abschluss: added default values for in_oesterreich boolean 2023-06-27 11:00:13 +02:00
Andreas Österreicher 5213ab44ff Merge branch 'TechnikumWienAcademy-master' 2023-06-27 09:34:07 +02:00
Andreas Österreicher c89f375015 Removed ServicePing Config for Second LDAP 2023-06-27 09:33:23 +02:00
nkrondraf d6cce60b8f add LDAP service ping configuration to second LDAP server 2023-06-27 08:25:14 +02:00
KarpAlex a54c7a3492 UHSTAT1 data: added tables 2023-06-26 19:15:27 +02:00
Andreas Österreicher efdd81ac0d Problem behoben wodurch keine Fotoliste erstellt werden konnte wenn eine
Person kein Foto hochgeladen hat
2023-06-26 13:45:10 +02:00
Andreas Österreicher 635494b303 Merge branch 'TechnikumWienAcademy-master' 2023-06-26 11:22:18 +02:00
Nikolaus Krondraf e200cd4455 add LDAP service ping configuration 2023-06-26 10:46:45 +02:00
Harald Bamberger fb8172eda1 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-06-22 12:54:48 +02:00
ma0048 a81ceb51b8 - rt sperre vor dem login moeglich 2023-06-22 10:23:00 +02:00
Harald Bamberger 24a29ca565 add validation, use correct function names, add vertragsbestandteil_id to stdclass 2023-06-21 16:47:51 +02:00
Harald Bamberger 1ffab39f05 match naming of properties and db columns 2023-06-21 15:21:42 +02:00
Manfred ee011ef201 OE-Suche verbessert 2023-06-21 11:03:33 +02:00
Andreas Österreicher fb84fb62f7 Merge branch 'TechnikumWienAcademy-ku-prod' 2023-06-21 08:27:21 +02:00
Andreas Österreicher c85bf159ff Merge branch 'ku-prod' of https://github.com/TechnikumWienAcademy/FHC-Core-Academy into TechnikumWienAcademy-ku-prod 2023-06-21 08:26:20 +02:00
Manfred 55fe358d9b Merge branch 'master' into benutzerberechtigungGUIneu 2023-06-20 13:53:10 +02:00
Cris 17c2004a39 Adapted: Check for config 'fbl' in Job to send Sammelmail only to LV-Leitung (no fallback to other lectors) 2023-06-20 13:36:42 +02:00
Cris 82019bb77f Deactivated: einzelne Empehlungsanfrage-Mails an Lektoren deaktiviert 2023-06-20 10:54:40 +02:00
Cris 4e22b1ac1c Added: New Job sendMailRecommendationRequests
Send Sancho mail to LV-Leitung (fallback Lectors) that were requested for recommendation yesterday.
2023-06-19 15:03:38 +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 f0d0c0837a added Filter for Software Management 2023-06-17 20:51:33 +02:00
ma0048 d9eb0f5704 - kennzeichen beim zusammenlegen uebernehmen 2023-06-16 11:30:03 +02:00
Cris 050a4214f9 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-06-14 13:45:34 +02:00
KarpAlex f865d09033 manage Bismeldestichtage: added possibility to delete a report target date 2023-06-13 16:14:38 +02:00
nkrondraf fb3247c91e performance optimizations 2023-06-13 14:44:01 +02:00
nkrondraf da4ab6bf49 performance optimizations 2023-06-13 14:06:57 +02:00
KarpAlex 7bc8e22906 plausichecks: removed empty lines and unnecessary comments 2023-06-12 22:40:09 +02:00
KarpAlex ab5dc7b1ac plausichecks: removed plausicheck lib, instead, methods are directly in the library for the fehler 2023-06-12 22:32:09 +02:00
ma0048 e26ba1d219 - spalte gesamtstunden erteilt hinzugefuegt 2023-06-12 09:22:32 +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
Harald Bamberger b33f890c62 fix freitext anmerkung, add validation to vbfreitext 2023-06-07 07:59:12 +02:00
Harald Bamberger 3d2dd25755 add condition for ending vbs and gbs 2023-06-06 17:21:05 +02:00
Werner Masik bcdf29f57f added method to display rudimentary chart data 2023-06-06 16:25:04 +02:00
Harald Bamberger ff6ddf8c46 add methods to end dv 2023-06-06 16:24:49 +02:00
KarpAlex c9c6955198 issue configuration: enabled deletion of single configuration values, updated fehlermonitoring phrases 2023-06-05 19:29:27 +02:00
KarpAlex ae1817fc7b hide bismelden checkbox if no keine_studstatuspruefung right 2023-06-05 16:36:01 +02:00
Harald Bamberger 42a6dd7508 current composer.lock 2023-06-05 16:18:29 +02:00
Andreas Österreicher bce7e6ce7f Merge branch 'feature-29133/einzelne_studiengaenge_aus_issues_check_ausnehmen' 2023-06-05 11:03:09 +02:00
Harald Bamberger 88039c2327 Merge branch 'werner/vertragsbestandteile_delete' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-06-05 10:58:39 +02:00
Werner Masik 5b7a78e6d8 delete DV; improved GBT query 2023-06-05 10:42:59 +02:00
Harald Bamberger dd0ef74fe0 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-06-05 10:42:52 +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 f5ee097b72 - doppelte benutzer bug fix 2023-06-02 12:01:31 +02:00
ma0068 9e883a48a0 Adaptierungen Icalfiles Coole 2023-06-02 09:02:47 +02:00
Cris 0994b2cc8f Added: Added column 'Stundensatz' in 'Lehrauftrag erteilen' 2023-06-01 12:18:14 +02:00
Cris 7c2d235960 Adapted: Show column 'Stundensatz' in 'Lehrauftrag bestellen' 2023-06-01 12:17:21 +02:00
Cris 73774b0c5d Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-06-01 11:16:06 +02:00
ma0048 afebd44b78 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-15490/lehrauftragsliste_stammkostenstelle_bei_fix_angestellten 2023-06-01 10:21:26 +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
Harald Bamberger b9325875a1 Merge branch 'master' into feature-25003/NotenimportFuerNachpruefung 2023-05-31 16:43:16 +02:00
Harald Bamberger a9666a5f55 Merge branch 'master' into feature-25003/NotenimportFuerNachpruefung 2023-05-31 16:41:53 +02:00
Harald Bamberger 1d63f7aa53 Merge branch 'feature-25003/NotenimportFuerNachpruefung_bhmod' into feature-25003/NotenimportFuerNachpruefung 2023-05-31 16:32:37 +02:00
Harald Bamberger ec000fbf83 changes for aenderung and korrektur 2023-05-30 19:13:27 +02:00
Andreas Österreicher a5110893ea Dateien die größer als 30MB sind werden nicht automatisch geprüft ob
diese eine Signatur enthalten da dies Dokumente sind die manuell
hochgeladen wurden um das UploadLimit der Arbeit zu umgehen.
2023-05-30 11:59:46 +02:00
Manfred 1ea45269bd Merge branch 'master' into benutzerberechtigungGUIneu 2023-05-25 17:07:08 +02:00
Manfred de4fe258fd Merge remote-tracking branch 'origin/master' 2023-05-25 17:06:22 +02:00
Manfred b5d0cc9626 Klasse "form-control" bei Typ Datepicker ergänzt 2023-05-25 17:06:16 +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
Harald Bamberger a47a746940 add require for vertragsbestandteil_karenz 2023-05-25 15:53:40 +02:00
Harald Bamberger 92672aaacf adapt overlapping DVs Check to not consider current DV if edited, but consider karenzen 2023-05-25 15:47:16 +02:00
Cris 4f6c60af3a Merge remote-tracking branch 'origin/feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-05-25 12:18:48 +02:00
Cris e7571dffab Minor Adaptation: Suche statt Search, Settings button Layout korrigiert 2023-05-25 12:17:06 +02:00
Cris f08072133c Fixed: Suchcontainer nicht mehr verschoben
Groesse und Alignment an Suchfeld gebunden.
2023-05-25 12:15:24 +02:00
Cris 542b6cc985 Adapted: Image-Thumbnails entfernt
Stattdessen class 'rounded'. Passt besser zu FHC CD.
2023-05-25 12:13:40 +02:00
Cris b9e9399ca2 Adapted: Icon-Layout in Vertical Split
. etwas vergroessert um besser mit der Maus zu greifen
. Icon und Icon-Farbe geaendert
2023-05-25 12:12:37 +02:00
Harald Bamberger fce192cd3c remover popper from composer.lock 2023-05-25 11:08:37 +02:00
Harald Bamberger 80d194cfc0 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter
- remove popper from composer introduced in branch feature-25562, but master included bootstrap.bundle in the meanwhile to have popper available
2023-05-25 11:04:20 +02:00
Harald Bamberger 38509d530a prepare list of vbs with gbs 2023-05-24 17:54:04 +02:00
Andreas Österreicher 34715712f3 App für Personalverwaltung hinzugefügt 2023-05-24 16:26:53 +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
Werner Masik 5f198114f7 added popperjs because bootstrap5 requires it 2023-05-23 17:03:13 +02:00
KarpAlex 4b2e3c2f6b Merge branch 'master' into feature-29133/einzelne_studiengaenge_aus_issues_check_ausnehmen 2023-05-23 16:22:05 +02:00
Harald Bamberger 09bc985431 Notenumrechnung beim Punkteimport, Fehlermeldung wenn Note oder Punkte fehlen. 2023-05-23 16:08:50 +02:00
cgfhtw 94a15093ac New Button 2023-05-23 15:26:49 +02:00
Cris 9124422635 Merge branch 'feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter' of https://github.com/FH-Complete/FHC-Core into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-05-23 15:17:14 +02:00
cgfhtw d10a229b59 Slot for action buttons 2023-05-23 14:56:31 +02:00
KarpAlex de43e69ccf plausichecks GUI: added fehlercode to recognise fehler in fehler monitoring issues 2023-05-23 14:29:38 +02:00
ma0048 f993780ec3 - texte und anzeige angepasst 2023-05-23 13:17:27 +02:00
Cris b624d91119 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-05-23 12:20:57 +02:00
Andreas Österreicher 7a005a9141 Merge branch 'feature-10001/tempus_kurzbz_bei_reservierungen_anzeigen' 2023-05-22 15:50:37 +02:00
Andreas Österreicher cc8be23f7e Merge branch 'master' into feature-10001/tempus_kurzbz_bei_reservierungen_anzeigen 2023-05-22 15:47:57 +02:00
KarpAlex 86e032b27f Fehler Monitoring: added fehler kurzbz to be displayeed 2023-05-22 14:31:40 +02:00
cgfhtw 429c595e04 Reload Button 2023-05-22 11:59:26 +02:00
KarpAlex 0d6ad6aab0 issue konfiguration: added phrases, bugfix displaying correct configuration for correct app 2023-05-22 00:20:01 +02:00
KarpAlex 186412144d Merge branch 'master' into feature-29133/einzelne_studiengaenge_aus_issues_check_ausnehmen 2023-05-21 17:38:49 +02:00
KarpAlex 696849062f Issues konfiguration: added GUI for assigning konfiguration to fehler 2023-05-21 17:34:11 +02:00
cgfhtw 4154df1704 Property to Enable/disable the download button 2023-05-19 14:47:05 +02:00
ma0068 5001713d16 Erzwingen von Reload nach jeder Freigabe 2023-05-19 07:51:25 +02:00
ma0048 311d235fda - abgewiesene gesperrt von spalte 2023-05-17 16:35:22 +02:00
ma0048 2f573263ba - abfrage ob der pruefling bereits gesperrt ist 2023-05-17 16:00:34 +02:00
ma0048 54de577eee - ausblenden des warnings 2023-05-17 15:08:52 +02:00
ma0048 8584be651b - sperren von rts bearbeitet 2023-05-17 15:06:39 +02:00
ma0048 08c594148b - details bei abgewiesenen 2023-05-17 08:41:04 +02:00
Werner Masik 24bf2f95a2 update vertragsbestandteile 2023-05-16 17:05:49 +02:00
Werner Masik a198a740f4 fix json_serialize 2023-05-16 17:04:37 +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
Werner Masik 3940912830 fix attribute name valorisieren to valorisierung 2023-05-16 10:04:56 +02:00
Werner Masik cd66397740 add current date to DV selection query 2023-05-16 10:03:50 +02:00
Andreas Österreicher da5494ad35 Merge branch 'feature-24913/TabelleRaumtypNeuesAttributAktiv' 2023-05-15 16:44:38 +02:00
Andreas Österreicher d3be5a7805 Merge branch 'feature-29051/DokumentvorlageAufSonderzeichenUeberpruefen' 2023-05-15 16:32:22 +02:00
Andreas Österreicher 06f62b19b4 Merge branch 'feature-27043/cis_lvinfo_cis_private_lehre_ects_preview_fehlt' 2023-05-15 16:06:55 +02:00
Andreas Österreicher 4844da317f Merge branch 'feature-25917/studienbeastigung_in_englischer_sprache' 2023-05-15 15:42:06 +02:00
Andreas Österreicher 00f555b141 Vorlage umbenannt 2023-05-15 15:34:32 +02:00
Andreas Österreicher d3ec6cad1d Merge branch 'master' into feature-25917/studienbeastigung_in_englischer_sprache 2023-05-15 15:13:47 +02:00
Andreas Österreicher a64fafb6ad Merge branch 'feature-28402/popper_in_bootstrap5' 2023-05-15 14:58:02 +02:00
Andreas Österreicher 9180244e0d Merge branch 'feature-27362/fas_filter_status_bestaetigt_reihungstestanmeldung' 2023-05-15 14:52:36 +02:00
Andreas Österreicher 5c79951f00 Merge branch 'feature-27107/Vilesci_Erfassung_Abwesenheiten_Reinigung' 2023-05-15 14:07:41 +02:00
Manfred 388a265db7 Neues Template "contentmittitel_filterwidget" in Suche ergänzt 2023-05-15 12:11:01 +02:00
Manfred d4653bc89f Neue Rechte anlegen und bestehende bearbeiten 2023-05-15 12:10:25 +02:00
KarpAlex 1ec52e710a Plausichecks: enabled Fehlerkonfiguration for excluding certain Studiengänge from checks, changed comments 2023-05-14 21:19:39 +02:00
KarpAlex fd7c193894 added tables and model for issue Fehlerkonfiguration 2023-05-11 18:54:35 +02:00
Manfred 040cd09691 Merge branch 'master' into benutzerberechtigungGUIneu 2023-05-11 18:26:24 +02:00
Manfred c5e1674264 FAS-Studentensuche verbessert, um Personen ohne Vorname zu findenwerden 2023-05-11 18:14:24 +02:00
Manfred e96a3506a8 Coodle ics für Terminzusagen jetzt mit verschlüsseltem Token
Details zur Umfrage in den Kalenderdaten
2023-05-11 18:02:17 +02:00
ma0068 01046637fa merge master into feature-18571/Entwicklungsteam 2023-05-11 09:18:32 +02:00
ma0068 fe6746e6bc Ergänzung DB-update um Berechtigung stgv/edit Entwicklungsteam 2023-05-11 09:14:42 +02:00
ma0068 28baa49f6d Validierung Sonderzeichen Dokumentvorlagen 2023-05-10 08:18:05 +02:00
KarpAlex 96172c67fd PlausicheckProducerLib: corrected method description comment 2023-05-09 23:16:24 +02:00
Werner Masik 4786ff503a added organisation to current contract info 2023-05-09 17:24:18 +02:00
Harald Bamberger 7045827450 bufix Urlaubsanspruch 2023-05-09 16:14:01 +02:00
Cris 81e51c2b92 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-05-09 11:58:43 +02:00
Andreas Österreicher e97d2d89d6 Added Config to Enable/Disable Signature Check in Abgabetool 2023-05-08 16:54:46 +02:00
Andreas Österreicher 2cb4ee9879 Merge branch 'feature-19172/Abgabetool_digitale_signatur_pruefen' 2023-05-08 15:50:59 +02:00
Andreas Österreicher 4c5241dd95 Bei fehlender Signatur in Enduploads wird ein Mail an den Studiengang
geschickt
2023-05-08 15:37:30 +02:00
ma0068 c086eddfae update Abfrage, delete testfiles 2023-05-08 14:18:07 +02:00
ma0068 33e313a633 update Abfrage 2023-05-08 12:12:42 +02:00
KarpAlex c6fe7a3d6a Merge branch 'master' into feature-28089/plausichecks_in_extension_hinzufuegen 2023-05-06 02:03:07 +02:00
KarpAlex 94a126f64e plausichecks: made some core plausichecks warnings instead of errors 2023-05-05 17:29:30 +02:00
Andreas Österreicher 1b57df7a52 Korrektur der Ermittlung des Sommersemesters wenn die Personalmeldung
für vergangene Semester erstellt wird.
2023-05-05 17:19:35 +02:00
Andreas Österreicher 451a21e84e Zugriffsberechtigungen korrigiert damit der Zugriff auf die eigenen
Zeitsperren nicht möglich ist ohne Berechtigung
2023-05-05 16:57:22 +02:00
Harald Bamberger d361c4eb26 use img-thumbnail css class instead of rounded circle 2023-05-05 15:47:23 +02:00
Harald Bamberger d131212d22 composer update 2023-05-05 14:20:07 +02:00
Harald Bamberger de4c236817 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-05-05 13:11:16 +02:00
Harald Bamberger 2c0e815fe8 add validations 2023-05-05 11:43:02 +02:00
Andreas Österreicher f7ec0c4ce0 Merge branch 'feature-27946/infocenter_zusaetzliche_spalte_fuer_kaution' 2023-05-05 08:53:17 +02:00
Harald Bamberger 42ff682700 add validations 2023-05-05 08:20:29 +02:00
Andreas Österreicher 6c1a47955f Merge branch 'feature-27949/infocenter_evaluieren_des_zurueckstellens_mit_einem_grund_zb_fuer_drittstaaten' 2023-05-05 07:48:53 +02:00
Harald Bamberger f84a75af4e Merge branch 'feature-25563/PV21_Verschlüsselung_Gehaltsdaten' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-05-04 15:41:44 +02:00
Paolo defe4e2f93 Added new interface application/core/IEncryption.php 2023-05-04 15:33:08 +02:00
Paolo 1c0129466a Bugfix: added a check to DB_Model->_addEncrypt method on the parameter encryptedColumns 2023-05-04 15:23:51 +02:00
Harald Bamberger e713cdac64 Merge branch 'feature-25563/PV21_Verschlüsselung_Gehaltsdaten' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-05-04 15:03:13 +02:00
Harald Bamberger 2f07590461 Merge branch 'master' into feature-25563/PV21_Verschlüsselung_Gehaltsdaten 2023-05-04 14:59:12 +02:00
Harald Bamberger 7fb0c14555 Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-05-04 14:58:29 +02:00
ma0048 4f03b61c6e - stunden bestandteil bei karenz mit 0 stunden verlaengern 2023-05-04 13:43:54 +02:00
Andreas Österreicher 3b1d913006 Merge branch 'TechnikumWienAcademy-ku-prod-hotfix-221118' 2023-05-04 09:46:02 +02:00
Cris d2b6aab881 Changed: AZG-relvant an neue Vertragsstruktur angepasst 2023-05-04 09:42:30 +02:00
Cris 8e73638931 Changed: Check homeoffice an neue Vertragsstruktur angepasst 2023-05-04 09:41:50 +02:00
Cris dbee8d9689 Changed: Check homeoffice an neue Vertragsstruktur angepasst 2023-05-04 09:39:12 +02:00
Cris b43b7fe95d Added new Vertragsbestandteil Class and few methods
. load()
. isZAPflichtig() -- Check ob im übergebenen Monat ZApflichtig.
. getZAPflichtig() -- Holt alle Vertragsbestandteile, die ZApflichtig sind
. isAllin() -- Check, ob im übergebenen Monat Vertragsbestandteil AllIn hat.
2023-05-04 09:38:18 +02:00
Cris 33c1cc80b2 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-05-04 09:26:44 +02:00
ma0068 58bae0953f dbupdate 2023-05-03 07:57:48 +02:00
Harald Bamberger eb7b73fee9 cleanup according to current vertragsbestandteil db tables 2023-05-02 16:00:13 +02:00
Andreas Österreicher fdc3265e97 Merge branch 'ku-prod-hotfix-221118' of https://github.com/TechnikumWienAcademy/FHC-Core-Academy into TechnikumWienAcademy-ku-prod-hotfix-221118 2023-05-02 11:28:15 +02:00
Harald Bamberger e3ec4cd5aa fix method names, handle insertamum updateamum insertvon updatevon in libs 2023-05-01 20:50:07 +02:00
KarpAlex 8efe601826 plausichecks gui bugfix: filter by Studiensemester and Studiengang possible again, removed unnecessary resolver params variable 2023-05-01 16:28:42 +02:00
KarpAlex 96d115e808 issues: added new filter for Personalverwaltung issues 2023-05-01 16:23:49 +02:00
ma0048 8b74420e4f - limit beim selecten 2023-04-30 21:28:47 +02:00
ma0068 f2479c6f36 dbupdate für neue Zeitsperre 2023-04-28 08:05:30 +02:00
Andreas Österreicher 9a4c61d1c3 Fixed Abgabetool Lecturer View 2023-04-27 17:50:03 +02:00
Andreas Österreicher a528018761 Merge branch 'master' into feature-19172/Abgabetool_digitale_signatur_pruefen 2023-04-27 09:57:40 +02:00
ma0048 eefffa8a0e - kaution spalte
- fas abgeschickt am timestamp automatisch ausfuellen
- zgvuberpruefung zeigt abgewiesene nicht an
2023-04-27 09:08:26 +02:00
ma0068 5bdfd447ac Berechtigungspruefung mittels mitarbeiter/zeitsperre:begrenzt, Update Berechtigung für Anzeige in Vilesci-Menue, Einbau Redirect 2023-04-26 16:17:23 +02:00
Harald Bamberger b4e4f91b22 more validation 2023-04-25 20:20:02 +02:00
Harald Bamberger 10fb68a532 Dienstverhaeltnis Class updated, VertragsbestandteilLib can save Dienstverhaeltnis 2023-04-25 17:23:57 +02:00
Paolo 08de013c23 Fixes: code quality checks 2023-04-25 16:07:42 +02:00
Harald Bamberger 7a4f55bb0c require interface IValidation 2023-04-25 09:27:40 +02:00
Harald Bamberger 2163ddcdf5 add Interface IValidation, implement validate stub in all Vertragsbestandteile and Gehaltsbestandteil and DV 2023-04-25 09:22:03 +02:00
ma0048 da484fbbb0 - die letzten 5 tage werden geprueft anstatt nur der vortag
- neue bewerbungen nach dem aufgenommen status werden nich automatisch abgewiesen
2023-04-25 08:45:16 +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
Harald Bamberger 5519f6af57 Merge branch 'merged_Anrechnungen_26625_27388_28278_28557' 2023-04-24 14:49:29 +02:00
Harald Bamberger d16a670726 Merge branch 'sonstiges-28665/Tabulator-PersistenceID-einbauen' into merged_Anrechnungen_26625_27388_28278_28557 2023-04-24 14:42:21 +02:00
Harald Bamberger 54864da770 Merge branch 'bugfix-28557/Alte-Anrechnungen-lassen-sich-nicht-oeffnen' into merged_Anrechnungen_26625_27388_28278_28557 2023-04-24 12:12:05 +02:00
Harald Bamberger 64aa3c1250 Merge branch 'feature-28278/Anrechnung_Neue-Begruendung-bei-Ablehnung' into merged_Anrechnungen_26625_27388_28278_28557 2023-04-24 11:31:39 +02:00
Harald Bamberger a663fa9436 Merge branch 'feature-27388/Anrechnungen_Zeitfenster-pflegen' into merged_Anrechnungen_26625_27388_28278_28557 2023-04-24 11:30:32 +02:00
Harald Bamberger aa572e8a22 Merge branch 'feature-26625/Anrechnungen-BFI-Änderungen-und-Sonstige' into merged_Anrechnungen_26625_27388_28278_28557 2023-04-24 11:26:45 +02:00
Harald Bamberger 48798e8309 Merge branch 'master' into feature-27388/Anrechnungen_Zeitfenster-pflegen 2023-04-24 11:20:53 +02:00
Harald Bamberger 01ca8f6fb9 Merge branch 'master' into feature-26625/Anrechnungen-BFI-Änderungen-und-Sonstige 2023-04-24 11:18:40 +02:00
Harald Bamberger 80eb64e418 Merge branch 'master' into feature-28278/Anrechnung_Neue-Begruendung-bei-Ablehnung 2023-04-24 10:36:32 +02:00
Harald Bamberger ea79b92beb Merge branch 'master' into bugfix-28557/Alte-Anrechnungen-lassen-sich-nicht-oeffnen 2023-04-24 10:35:22 +02:00
Andreas Österreicher 42d6ea9bed Merge branch 'feature-28426/DiplomaSupplementMinimalVersionSS2023' 2023-04-24 08:31:15 +02:00
Andreas Österreicher b726f2ca5e Vertragsstunden mit 0.00 werden wie NULL behandelt 2023-04-24 07:14:42 +02:00
KarpAlex 0a8432514c issues: added comment to getLanguageIndex method 2023-04-22 23:35:39 +02:00
KarpAlex 3122825b73 student issues list issueData: language index comes from tbl_sprache, limit results only to dvuh and core issues 2023-04-22 15:41:20 +02:00
KarpAlex bc8709f842 added filter for Personalverwaltung issue list 2023-04-21 17:59:24 +02:00
ma0048 f54351c7a3 - added missing model 2023-04-20 16:38:56 +02:00
KarpAlex f39fb46b25 Merge branch 'feature-28886/Filter_Component_vs_Table_Component' into feature-28089/plausichecks_in_extension_hinzufuegen 2023-04-20 13:19:16 +02:00
Manfred 48172216cc Zeilenzähler bei Statistik 2023-04-19 15:43:18 +02:00
Manfred 1fa215103c Insert- und Update-Daten bei Prestudentstatus im FAS 2023-04-19 15:42:51 +02:00
Werner Masik 138cfd662d added return 2023-04-18 13:50:07 +02:00
Harald Bamberger 535578c399 validation 2023-04-18 13:30:56 +02:00
Harald Bamberger c90da4b50e start to implement validation 2023-04-18 13:26:08 +02:00
ma0068 88c8b13208 Anzeige Urlaubsverwaltung Vilesci ausschließlich für user mit Oes mit Leitungsfunktionen 2023-04-18 08:10:42 +02:00
Paolo 8eb423414a Merge branch 'master' into feature-19172/Abgabetool_digitale_signatur_pruefen 2023-04-17 10:21:09 +02:00
Werner Masik 29485a090b removed remaining unit test for GUI 2023-04-14 15:51:58 +02:00
Andreas Österreicher 5d668791f9 Projektphase in der Zeiterfassung werden temporär 7 Monate in die Vergangenheit anzgezeigt um die Erfassung von alten Einträgen zu ermöglichen 2023-04-14 14:37:52 +02:00
cgfhtw d766e2fd01 console.warn => alert 2023-04-14 08:22:36 +02:00
Harald Bamberger e462a71b6d call parent constructor 2023-04-12 16:50:00 +02:00
Harald Bamberger 9e6d78dd1d set Dienstverhaeltnis_id and Vertragsbestandteil_id on child Gehaltsbestandteile when added or changed 2023-04-12 16:26:55 +02:00
Harald Bamberger c2e956f7f3 use GehaltsbestandteilLib in VertragsbestandteilLib 2023-04-12 15:32:22 +02:00
Harald Bamberger 0061cf255c add GehaltsbestandteilLib 2023-04-12 15:22:10 +02:00
Werner Masik 2b03fcc930 removed GUI handling and renamed Gehaltsbestandteil to make it independend from Vertragsbestandteil 2023-04-12 09:41:07 +02:00
ma0068 f1402c439c Adaptierungen Rahmenvertrag FHG 2023-04-12 08:15:55 +02:00
Werner Masik fe6a8d5625 fixed wrong JSON-Mapping for GUIOptions 2023-04-11 17:07:20 +02:00
Harald Bamberger e7f23643d4 fix data property name 2023-04-11 17:05:20 +02:00
Harald Bamberger c929fa8702 add freitext require, adapt freitext to current db 2023-04-11 16:59:21 +02:00
Harald Bamberger 92e23ea585 add requires for vbs zeitaufzeichnung and kuendigungsfrist 2023-04-11 16:47:44 +02:00
Harald Bamberger 3ff024fc69 fix date format 2023-04-11 15:51:23 +02:00
Harald Bamberger 234820490c variable names 2023-04-11 15:44:34 +02:00
Harald Bamberger 12c712c1b4 changed property names to match gui input 2023-04-11 15:22:40 +02:00
Harald Bamberger b50ca57907 extend VertragsbestandteilFunktion to be able to create a Benutzerfunktion entry before being persited 2023-04-11 15:10:24 +02:00
Manfred 9c801d2723 Merge branch 'benutzerberechtigungGUIneu' 2023-04-11 13:24:56 +02:00
Manfred dce81d614e Merge branch 'master' into benutzerberechtigungGUIneu 2023-04-11 13:23:09 +02:00
Harald Bamberger ed2aa6620e vuedatepicker added 2023-04-11 12:53:56 +02:00
Harald Bamberger 025b58dee3 throw Exception when storeVertragsbestandteil is rolled back to handle rollback in possible outer transaction 2023-04-11 11:05:15 +02:00
cgfhtw a63a79ab91 add param tableOnly & save for multiple components on one page 2023-04-07 14:10:30 +02:00
ma0048 19d369c3c7 - im kalender mitarbeiter kurzbz statt uid anzeigen 2023-04-06 10:17:15 +02:00
Andreas Österreicher fca341ccf4 Migration von Verträgen speichert nun die Eintäge auch in der DB
Tippfehler in Models behoben
Berechtigungen für DV und VBS Sequence hinzugefügt
2023-04-06 07:34:26 +02:00
Andreas Österreicher f325daab43 Merge branch 'bug-28917/AnwesenheitenLadezeiten' 2023-04-05 16:30:55 +02:00
Andreas Österreicher 326b53544a Übernahme Optimierung der Anwesenheitsabfrage von BFI 2023-04-05 16:28:19 +02:00
Andreas Österreicher 1a3d651759 Merge branch 'feature-27403/DVUH_Plausicheck_fuer_Personen_ohne_Konto_Buchungen' 2023-04-05 15:33:36 +02:00
Paolo e46d5a2433 application/views/templates/FHC-Footer.php now includes the bootstrap5 bundle JS 2023-04-05 15:22:49 +02:00
Andreas Österreicher 995b3ecb18 Merge branch 'feature-28539/Projektarbeitsbeurteilung_Anpassungen' 2023-04-05 15:10:54 +02:00
ma0068 43f613b0bc Änderung FHStG auf FHG 2023-04-05 13:32:32 +02:00
Werner Masik 783cb289cd added Unit-Tests; changed IDs of organisationseinheit in VertragsGUI 2023-04-04 18:51:06 +02:00
Manfred 5226da2652 Neues Template Content mit Titel und Filterwidget 2023-04-04 17:37:47 +02:00
Manfred 15049640c6 Input-styling 2023-04-04 17:37:01 +02:00
Manfred 0d5a7aee35 Aktive als Default 2023-04-04 17:36:36 +02:00
Manfred cfa71c852c Styleanpassung inaktive 2023-04-04 17:36:18 +02:00
KarpAlex a1a9b10ee1 plausicheck issues: enabled generic passing of different parameters, not just core plausicheck specific. moved studiensemester param to specific PlausiIssueProducer controller 2023-04-04 16:17:18 +02:00
ma0048 fb57ea5838 - splitten von reihungstest uebersichten 2023-04-04 15:57:33 +02:00
ma0048 d93c19913b - spalte fuer kaution hinzugefuegt 2023-04-04 15:07:23 +02:00
Harald Bamberger 80d5d09ed5 fix styling of textarea in import popup 2023-04-04 08:07:03 +02:00
Werner Masik c613c6dc43 small fix to prevent error when $encryptedColumns is null 2023-04-03 13:37:12 +02:00
Cris 9e4489093c Adapted & updated Tabulator default options (PersistenceID now changeable / Updates for options in Tabulator 4.9)
. Adapted
.. PersistenceID now changeable
.. check: only set default option if not set in tabulator

. Updates in version 4.9:
.. persistentLayout => persistence
.. getVisibility() => isVisible()
2023-03-29 10:29:06 +02:00
Werner Masik c52cd05436 Merge branch 'feature-25562/PV21_Vertraege_Encryption_Merge' 2023-03-28 20:12:40 +02:00
Cris 772e60c944 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-03-28 13:52:23 +02:00
Manfred 9527fd006f Rechte-Detailansicht 2023-03-27 17:08:22 +02:00
Cris bbd5962fd4 Deleted deprecated FBL-files 2023-03-27 11:19:34 +02:00
Cris 47fba23a5e Enhanced queries 2023-03-27 11:11:03 +02:00
Cris 75aff023d3 Corrected Mehrsprachigkeits-variable 2023-03-27 11:08:07 +02:00
Cris 8183144251 Corrected query to retrieve Leitung 2023-03-27 11:06:22 +02:00
Cris 1e00f2683e Corrected check 'isEmpfehlungsberechtigt'
Fachbereichsleiter are always empfehlungsberechtigt.
2023-03-27 11:05:03 +02:00
Cris d8fc724b10 Changed: Now passing config-variable to views
...instead of loading config into view.
2023-03-27 11:02:24 +02:00
Cris 8feec18ff7 Changed query to get Leitung of Lehrveranstaltung-Organisationseinheit (instead of 'Fachbereich') 2023-03-27 10:58:59 +02:00
Manfred cff3cab075 Merge branch 'master' into benutzerberechtigungGUIneu 2023-03-27 10:55:58 +02:00
Manfred 55e47d8b62 Merge remote-tracking branch 'origin/master' 2023-03-27 10:53:23 +02:00
Manfred f72da812d7 Ganzer SQL Filterbar 2023-03-27 10:53:18 +02:00
Manfred 17adaf79b0 Nur verplanbare LV-Teile werden gezählt; Studiengangsfilter 2023-03-27 10:52:35 +02:00
Manfred 84b1f1c81a Multi-Endedatum setzen, Jquery Checkboxes adaptiert 2023-03-27 10:50:00 +02:00
ma0068 76c4c4a0e9 Termin 3 als pruefungstyp in lehre.tbl_pruefungstyp in dbupdate hinterlegt 2023-03-27 08:15:29 +02:00
ma0068 3e056ebf3d Notenimport Nachprüfung und 3.Termin: Ergänzung um nicht numerische Noten 2023-03-24 15:21:01 +01:00
KarpAlex 903f3d2f37 generateESI Job bugfixes (correct models, Ids in error logs), added insertvon 2023-03-23 17:50:32 +01:00
Paolo 25313a8f52 Code quality check fixes 2023-03-23 14:34:37 +01:00
Cris fbcf9d9778 Fixed: Now flagging correctly ALL Studiengänge with Schreibberechtigung
Before Schreibberechtigung was not set correctly true/false and displayed wrong in table.
Therefore fixed query.
2023-03-23 09:10:04 +01:00
KarpAlex cd6443d9c0 -added scheduler for generating and saving ESI -first version of generateESI job 2023-03-22 17:41:15 +01:00
Paolo 1b53b17b48 Merge branch 'master' into feature-16354/TinyMCE_move_to_new_version 2023-03-22 16:43:56 +01:00
Cris b7661b200e Removed unnecessary code 2023-03-22 15:45:06 +01:00
Cris 26ed20b1f5 Changed 'Schreibberechtigt'-column for STGL: Now showing ALL by default 2023-03-22 15:44:00 +01:00
Cris f94274ae1c Optimized Mehrsprachigkeit-query
Removed unnessecary type conversions
2023-03-22 14:08:46 +01:00
Cris a78b4507da Added missing phrasen 2023-03-22 09:42:04 +01:00
ma0048 651bd9e37a - nicht notwendige permission fuer funktion geloescht 2023-03-21 16:57:33 +01:00
ma0048 7336525021 - rueckstelldatum default zwei wochen 2023-03-21 16:56:35 +01:00
KarpAlex 230ebcaf9a added table public.tbl_kennzeichen and kennzeichentyp for managing person Ids 2023-03-20 17:01:58 +01:00
Cris 8035176e8b Fixed: Old Anrechnungen sometimes failed to open
...this is fixed now
2023-03-20 13:48:23 +01:00
Cris e4fca1b823 Merge branch 'master' into feature-28278/Anrechnung_Neue-Begruendung-bei-Ablehnung 2023-03-20 11:32:14 +01:00
Cris b59b00dbe4 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-03-20 11:31:33 +01:00
Cris 455d7e9aa2 Restored general Ablehnungstext in Lector & STGL Overview with explenation 2023-03-20 11:30:05 +01:00
Cris ca502488b7 Small text adaption of phrases 2023-03-20 11:20:37 +01:00
Cris 7f99b26e48 Added new phrases
.genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis
.empfehlungNegativKenntnisseNichtGleichwertigWeilHinweis
2023-03-20 11:05:57 +01:00
KarpAlex b827d8cbea Projektarbeit Abgabetool: Text is displayed for student instead of note if Projektarbeit Benotung is saved, but not abgeschickt (sent) 2023-03-17 17:33:18 +01:00
Andreas Österreicher 279ddddfc8 Wochenstunden auf numeric korrigiert, Diverse NOT NULL Constraints
hinzugefügt
2023-03-17 09:53:41 +01:00
Andreas Österreicher 8f37d24693 Fixed Typo in Column Dienstverhaeltnis 2023-03-17 08:29:21 +01:00
ma0048 598f6b4b09 - nur zukuenftige eintraege markieren 2023-03-16 17:16:31 +01:00
ma0048 2c4dc542b6 - parken und zustellen anzeige in eine spalte zsmgefasst 2023-03-16 17:09:00 +01:00
Andreas Österreicher 4787159071 Merge branch 'feature-24880/Sprachaenderung_in_Projektarbeitsbeurteilung_mit_Token' 2023-03-16 15:13:07 +01:00
ma0048 c365896865 - log eintrag hinzugefuegt, beim setzen auf park... 2023-03-16 13:57:17 +01:00
Andreas Österreicher 71e8742cc8 Merge branch 'TechnikumWienAcademy-master' 2023-03-16 11:25:57 +01:00
KarpAlex 813cca99e2 improved plausicheck getOrgformStgUngleichOrgformPrestudent, so it checks orgform for current prestudent, is valid only for mischform, includes more prestudent statuses 2023-03-16 10:15:40 +01:00
nkrondraf de1ae7e46c correct file path for pictures 2023-03-16 09:40:16 +01:00
Cris d606418072 Set focus on all Begruendungs-textareas
This makes it easier to directly add and complete Begruendungen.
Changed in STGL and Lecotors Overview and Detailview
2023-03-16 09:05:49 +01:00
Cris d69788e8d2 Added 'Andere Begründung' to STGL and Lector Detailview 2023-03-16 09:02:43 +01:00
Cris 4a009f3cef Set ZGV-column visible 2023-03-16 09:01:24 +01:00
KarpAlex 9c1d58c447 Merge branch 'master' into feature-24880/Sprachaenderung_in_Projektarbeitsbeurteilung_mit_Token 2023-03-15 21:47:33 +01:00
Andreas Österreicher b2a6db9ed3 Added NOTNULL Constrait to tbl_gehaltsabrechnung.gehaltsbestandteil_id 2023-03-15 17:26:04 +01:00
Cris 792d1980fe Removed general Ablehnungstext in Lector & STGL Overview
Ablehnungstext was changed in former commit in order to make sure to add personal reason.
This is done in Detail sites.
Therefore the generally written Ablehnungstext is now removed from Overview sites.
2023-03-15 14:49:34 +01:00
Andreas Österreicher 9d8adaba26 Ermittlung des Projektbetreuer Stundensatz an Config angepasst 2023-03-14 13:05:10 +01:00
Andreas Österreicher 1165f4407e Merge branch 'master' into feature-17727/FasDefaultStundensatzProjektbetreuungAnzeigen 2023-03-14 12:53:08 +01:00
Andreas Österreicher a413064d80 Erstversion für Vertragsmigration 2023-03-14 11:46:07 +01:00
ma0048 22cd1e075a - rueckstellgruende umbenannt
- sort in der tabelle hinzugefuegt
- anzeige angepasst
2023-03-14 10:19:07 +01:00
Andreas Österreicher e67e7309cb Merge branch 'feature-3878/temput_ganztaegige_zeitsperren_erzeugen_keine_kollision' 2023-03-13 16:24:45 +01:00
Andreas Österreicher 6e1c602658 Merge branch 'feature-6329/NotenfreigabeMailAufNoReplyAendern' 2023-03-13 15:55:15 +01:00
Andreas Österreicher d8ab7036a6 noreply auf no-reply geändert 2023-03-13 15:54:48 +01:00
Andreas Österreicher 4899c62863 Merge branch 'master' into feature-6329/NotenfreigabeMailAufNoReplyAendern 2023-03-13 15:50:38 +01:00
Andreas Österreicher c85d98f681 Neues HR Schema und Vertragstabellen 2023-03-10 17:44:15 +01:00
Harald Bamberger 4f764b9dfa Merge branch 'master' into feature-25562/PV21_Datenbankstruktur_fuer_Vertraege_und_Gehaelter 2023-03-10 14:13:28 +01:00
ma0068 7a554b0d0c Adaptierung Berechnung ECTS 2023-03-10 12:49:34 +01:00
Harald Bamberger cca82d2961 problem with switching presets and problem with vanishing gehaltsbestandteile solved 2023-03-10 08:21:59 +01:00
Harald Bamberger c62d89d25c add default settings for childs, add option to hide fields 2023-03-09 16:46:15 +01:00
Cris 1da8881905 Added new Ablehnungstext and checks to Lector Detail View
. Changed Ablehnungstext
. Trim text and focus on textarea to fasten editing
. Check if forgot to add own Begründungstext
2023-03-09 16:11:37 +01:00
Cris 3e092bf375 Added new Ablehnungstext and checks to STGL Detail View
. Changed Ablehnungstext
. Trim text and focus on textarea to fasten editing
. Check if forgot to add own Begründungstext
2023-03-09 16:11:04 +01:00
Cris 8a7bcab2c6 Added new phrases to reject Empfehlung / Anrechnung 2023-03-09 16:05:27 +01:00
Harald Bamberger 6a65468bb0 refactored to allow grouping elements in tabs, while maintaining json structure 2023-03-09 14:59:07 +01:00
Cris 6644564738 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-03-09 09:31:53 +01:00
Cris 31b6ff9954 Removed unnecessary code and added phrase
Unnecessary since implementation of tabulator
2023-03-09 09:27:16 +01:00
ma0068 345cc6cf83 Adaptierung Attribut studPlan 2023-03-09 08:19:05 +01:00
Manfred 81f279964c Tooltip für Anmerkung 2023-03-08 15:03:31 +01:00
Manfred 9830025853 Merge branch 'master' into benutzerberechtigungGUIneu 2023-03-08 14:58:46 +01:00
Manfred 18d760886a Update-Details bei Reservierungen im Tempus anzeigen 2023-03-08 14:54:51 +01:00
Manfred 265244c5af Offsetpunkte in Fragenübersicht anzeigen 2023-03-08 14:54:29 +01:00
Manfred 4ceaffa617 Kopierfunktion für Räume 2023-03-08 14:54:13 +01:00
Harald Bamberger 84ca798dad add format to set text as format for date columns and highlight them 2023-03-08 13:50:33 +01:00
Cris bae6675efe Removed config vars start and end of Application period
Removed
.'submit_application_start'
.'submit_application_ende'
2023-03-08 13:02:08 +01:00
Cris ef32586d86 Merge branch 'master' into feature-27388/Anrechnungen_Zeitfenster-pflegen 2023-03-08 13:00:03 +01:00
Cris 4a5e83fece Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-03-08 12:58:29 +01:00
Cris ba0e084311 Integrated into FH Complete Navigation 2023-03-07 18:40:54 +01:00
Cris a7f02548b0 Formatted date (of Anrechnungszeitraum Start and -Ende) 2023-03-07 17:57:39 +01:00
Cris 9882065b20 Removed tablesorter script
Not used.
2023-03-07 17:56:26 +01:00
ma0068 eee4faa241 Adaptierungen Matr_nr als zusätzliches Feld, LVS statt ALVS, Herausfiltern von nicht studienplanrelevanten LVs 2023-03-07 17:47:40 +01:00
Cris 058d01b6be Added Berechtigung lehre/anrechnungszeitfenster 2023-03-07 17:37:50 +01:00
Cris 68a6554d19 Removed loading config Anrechnung
Not needed anymore. Using tbl_anrechnungszeitfenster now.
2023-03-07 17:20:20 +01:00
Cris f8349a2a9b Changed Bootstrap 5 -> Bootstrap 3
Tablewidget is not working fine with Bootstrap 5 by now.
2023-03-07 17:18:21 +01:00
Andreas Österreicher 08fffa5009 Merge branch 'feature-15029/Docsbox' 2023-03-07 16:27:16 +01:00
Andreas Österreicher d06efc15a6 Removed Config because its in the global Config 2023-03-07 16:22:35 +01:00
Andreas Österreicher 58c3fba33a Added Missing Config to enable Docsbox Conversion 2023-03-07 16:20:02 +01:00
Andreas Österreicher bf6d0aca38 Merge branch 'master' into feature-15029/Docsbox 2023-03-07 15:57:14 +01:00
Cris c78e715c3e Added phrases 'bearbeitetVon', 'bearbeitetAm' 2023-03-07 14:07:14 +01:00
Cris ba31a0b5b0 Changed HTML table to Tablewidget 2023-03-07 14:06:00 +01:00
Andreas Österreicher c411b826d9 Merge branch 'feature-25518/bewerbungstool_messages_direkt_an_permesser' 2023-03-06 16:54:43 +01:00
Cris 479feea8aa Changed way of checkíng Anrechnungszeitraum
Changed function isExpired to check Anrechnungszeitraeume of tbl_anrechnungszeitraum instead of using config entries.
2023-03-06 15:26:12 +01:00
Cris 043f09892a Deleted hidden testing field 2023-03-06 15:22:56 +01:00
ma0068 83896113d8 Anpassungen rdf diplomasupplement 2023-03-06 15:02:44 +01:00
Cris 9e15668c37 Created page-header class
page-header class was dropped since Bootstrap 4.
Therefore added to css style
2023-03-06 13:25:14 +01:00
Cris 9c85877d3d Added new phrases
.anrechnungenVerwalten
.anrechnungszeitraumFestlegen
.anrechnungszeitraumHinzufuegen
.anrechnungszeitraumSpeichern
.anrechnungszeitraumStart
.anrechnungszeitraumEnde
.errorStartdatumNichtInStudiensemester
.errorEndedatumNichtInStudiensemester
.errorStartdatumNachEndedatum
.frageSicherLoeschen
2023-03-06 13:24:03 +01:00
Cris f8fb59e806 Created js to handle Anrechnungszeitraum
Handle:
. modals to add / update Anrechnungszeitraume
. AJAX calls to add / update / delete
2023-03-06 13:21:37 +01:00
Cris d3f88597d9 Created Model Anrechnungszeitraum_model
Inserts / Updates / Deletes Anrechnungszeitraum
2023-03-06 13:19:15 +01:00
Cris 727d0b5876 Created GUI to admin Anrechnungszeitraume
Add / Update / Delete Anrechnungszeitraume
2023-03-06 13:18:23 +01:00
Cris 87a1b3647d Created Controller AdminAnrechnung to admin Anrechnungszeitraume
Add / Update / Delete Anrechnungszeitraume
2023-03-06 13:16:27 +01:00
Cris 35c68d98a1 Created lehre.tbl_anrechnungszeitraum 2023-03-06 13:15:16 +01:00
ma0048 7bb340a415 - checksystem auf 3.4 umgebaut
- vilesci raumtypen inaktive raumtypen werden markiert
- tempus karteireiter ort zeigt nur aktive raumtypen an
- raumsuche auf aktive raumtypen eingeschraenkt
2023-03-01 10:44:47 +01:00
Andreas Österreicher 90a518a70d Merge branch 'bug-27845/rt_zeit_hinzufuegen_bug' 2023-02-28 15:45:48 +01:00
ma0048 37364d9775 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-24913/TabelleRaumtypNeuesAttributAktiv 2023-02-28 13:55:08 +01:00
Harald Bamberger 220617f14f enhance guioptions to be able to disable selected fields and hide gehaltsbestandteile add link 2023-02-28 10:50:40 +01:00
ma0048 3076753a19 - preview.php verlinkung entfernt
- lvincoming.php entfernt
2023-02-28 08:59:30 +01:00
ma0048 22fbe098ec - studienbestaetigung fuer abbrecher angepasst 2023-02-27 15:01:18 +01:00
ma0048 012e7b9691 - kollision bei ganztaetigen zeitsperren 2023-02-27 11:35:04 +01:00
ma0048 6d1d4cb74b - uebernahme von zurueckgestellten und geparkten personen hinzugefuegt 2023-02-27 11:32:55 +01:00
KarpAlex 601eae1e95 extension plausicheck bugfix: extension name is correctly passed to plausicheckproducerlib 2023-02-24 17:43:36 +01:00
KarpAlex a667ddaf5e Plausichecks: removed/changed comments 2023-02-24 13:32:37 +01:00
KarpAlex 4f2ca62d05 Issues: enabled extensions to produce own plausichecks, IssueResolver: moved directory names to constants, deleted unused IIssueExistsChecker 2023-02-23 19:27:45 +01:00
ma0048 62550423a3 - geparkt und onhold von der log tabelle in eine eigene tabelle verschoben
- nicht mehr benoetigte funktionen entfernt
- infocentertool angepasst
- bewerbungstool angepasst
- phrasen hinzugefuegt
2023-02-23 16:07:52 +01:00
Harald Bamberger 7ae41ac965 pass config to gueltigkeit in formheader 2023-02-22 10:27:39 +01:00
Cris fe7cd05d57 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-02-22 10:10:10 +01:00
Harald Bamberger 2672ebc61c sharedstate for gueltigkeit, mode to set gueltigkeits reflect or ignore or set shared gueltigkeit, add vertragsbestandteil kuendigungsfrist 2023-02-22 09:36:45 +01:00
Andreas Österreicher fd39312de6 Merge branch 'feature-28084/DVUH_issue_resolvers_different_folder' 2023-02-21 17:12:29 +01:00
KarpAlex 01a020d196 IssueResolver: renamed issue resolvers folder constant 2023-02-21 17:04:26 +01:00
Paolo 2b9af86955 - Added examples to application/config/db_crypt.php
- core/DB_Model->_addDecryptLoad fixed when checking the condition if the used operator is made of two characters
2023-02-21 16:11:49 +01:00
Cris 844f72d3d4 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-02-21 16:05:06 +01:00
Andreas Österreicher 90ada0aaf8 Merge branch 'TechnikumWienAcademy-master' 2023-02-21 08:44:57 +01:00
Nikolaus Krondraf dee4af2fb8 add parameters to generateUID() 2023-02-21 08:02:15 +01:00
Werner Masik 785b824d6f add missing extension .js 2023-02-20 16:25:19 +01:00
KarpAlex 88dee31289 added Plausicheck CORE_STUDENTSTATUS_0015 for finding persons without Konto Buchungen (charges), Plausichecks GUI: generic plausicheck error text is displayed if not defined erroroccured, instead of success message 2023-02-20 11:40:55 +01:00
Paolo 2729b60b39 - Added new constants SESSION_ENCRYPTED_COLUMNS and ENCRYPTED_COLUMNS to libraries/TableWidgetLib
- Changed libraries/TableWidgetLib->getDataset to accept the new parameter encryptedColumns
- Added new private method _encryptedColumns to widgets/TableWidget
- widgets/TableWidget now calls tablewidgetlib->getDataset now giving the encryptedColumns parameter
- widgets/TableWidget stores in the session the encryptedColumns parameter
2023-02-20 11:31:19 +01:00
Harald Bamberger 0413528798 cleanup form, add preset functionality for structure and data, use same JSON for preset and formoutput - prepare for save and restore before persisting to db 2023-02-17 16:05:35 +01:00
Paolo 9b8a1ba096 - Added new constants SESSION_ENCRYPTED_COLUMNS and ENCRYPTED_COLUMNS to libraries/FilterCmptLib
- Added new private property _encryptedColumns to libraries/FilterCmptLib
- libraries/FilterCmptLib: execReadOnlyQuery is now called providing the parameter _encryptedColumns to read database encrypted columns
2023-02-17 14:01:09 +01:00
Werner Masik f80ecd9aa2 fix missing extension 2023-02-17 10:41:35 +01:00
Harald Bamberger facee3076d first guess vue vertragsbestandteil und gehaltsbestandteil components 2023-02-15 15:55:37 +01:00
ma0048 4d85d42a79 - gebiet zeit hinzufuegen fixed
- stammdaten abbrechen button fixed
2023-02-15 14:50:12 +01:00
KarpAlex accccbd362 Projektarbeitsbeurteilung abgabe_lektor_details: added explanatory text below when "grade" (benoten) button is disabled 2023-02-13 17:04:21 +01:00
Manfred de81a5abbd Merge remote-tracking branch 'origin/master' 2023-02-13 13:27:22 +01:00
Manfred 0fdf943085 Textanpassung an 30MB Uploadgrenze 2023-02-13 13:27:16 +01:00
Manfred feb14a9f39 Anpassung Speicherbutton, Tooltips, Alertmessages 2023-02-13 11:27:54 +01:00
Andreas Österreicher ab5e656069 Anrechnungen: Link zu Dokumenten in der Übersicht korrigiert 2023-02-13 10:21:12 +01:00
Andreas Österreicher 8d3a9d86f3 DBUpdate Gegenchecks erweitert 2023-02-09 18:47:42 +01:00
Andreas Österreicher 3f5c6c4ee5 Merge branch 'bug-16636/Lv_Termine_im_FAS_falsch_ermittelt' 2023-02-09 17:11:21 +01:00
Andreas Österreicher 97023c547c Merge branch 'feature-17512/Issues_Plausibilitaetspruefungen' 2023-02-09 16:14:49 +01:00
Andreas Österreicher 947cc3beff Datenbankändungen von 3.3 nach 3.4 verschoben 2023-02-09 16:09:37 +01:00
Andreas Österreicher 151e9d2ca3 Merge branch 'master' into feature-17512/Issues_Plausibilitaetspruefungen 2023-02-09 16:04:33 +01:00
Harald Bamberger 381db6a93f Merge branch 'feature-25561/Quellkursverknüpfung_und_wiederherstellung_f_LehrgangsLVs_der_Academy' 2023-02-09 11:20:07 +01:00
Paolo 7f97a58baa Merge branch 'master' of github.com:FH-Complete/FHC-Core 2023-02-09 10:55:41 +01:00
Paolo 8ef07fd9b2 Fixed LogsViewer: check if request id is not null before using it to set the row color 2023-02-09 10:54:56 +01:00
Andreas Österreicher 569c8c929e Merge branch 'feature-25177/ZeiterfassungMergedBrancheDeploy1' 2023-02-09 10:27:25 +01:00
Paolo c831355012 - FilterWidget: now it is possible to provide the encryptedColumns parameter to specify which columns of a database table are encrypted, how to cast them and which password to use to decrypt them
- Added new constants PGSQL_BYTEA_TYPE, CRYPT_CONF_PASSWORDS, CRYPT_CAST, CRYPT_PASSWORD_NAME, CRYPT_SELECT_TEMPLATE, CRYPT_WHERE_TEMPLATE and CRYPT_WRITE_TEMPLATE to application/core/DB_Model.php
- Added new optional parameter encryptedColumns to application/core/DB_Model insert, update, load, loadWhere, execQuery, execReadOnlyQuery and _toPhp
- Added new private methods _addEncrypt, _addDecryptQuery and _addDecryptLoad to application/core/DB_Model.php
- core/DB_Model: now it is possible to provide the encryptedColumns parameter to specify which columns  of a database table are encrypted, how to cast them and which password to use to decrypt them
- Adapted application/models/system/PersonLog_model.php
2023-02-08 13:33:40 +01:00
Harald Bamberger ba76ced168 Merge branch 'master' into feature-25561/Quellkursverknüpfung_und_wiederherstellung_f_LehrgangsLVs_der_Academy 2023-02-08 10:28:43 +01:00
Andreas Österreicher 0347ad9b10 Stunden werden auf NULL gesetzt wenn eine Zeitsperre bearbeitet wird die
keine Stunden zulässt
2023-02-07 18:48:22 +01:00
Andreas Österreicher 990bffeb2c Merge branch 'feature-16899/Anwesenheitsliste_um_Geschlecht_erweitern' 2023-02-07 16:36:42 +01:00
Andreas Österreicher 78a66bfc74 Merge branch 'feature-11836/reihungstest_starten_von_fremden_gebieten_verhindern' 2023-02-07 14:51:20 +01:00
Andreas Österreicher 9c349d9f1b Merge branch 'master' into feature-11836/reihungstest_starten_von_fremden_gebieten_verhindern 2023-02-07 14:46:24 +01:00
Andreas Österreicher 51b5cb8620 Merge branch 'bug-26015/OutgoingAufAnwesenheitslisteAnzeigenBeiMehrerenDatensaetzen' 2023-02-07 14:29:48 +01:00
Andreas Österreicher 366aca2b1c Merge branch 'bug-26740/FAS_Reiter_Anwesenheit' 2023-02-07 14:21:24 +01:00
Andreas Österreicher de5b701532 Problem beim CSV Import behoben wodurch der Import ohne
Projekt-Zuordnung nicht möglich war
2023-02-07 09:01:29 +01:00
Andreas Österreicher b17c6e29e5 Merge branch 'master' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2023-02-06 16:23:48 +01:00
Andreas Österreicher fd0eed8558 Merge branch 'feature-27665/infocenter_zgv_uebernehmen' 2023-02-06 15:49:18 +01:00
ma0048 e6269b121b - fixed zgv uebernehmen 2023-02-06 13:04:32 +01:00
Andreas Österreicher 5441024c75 Merge branch 'feature-27363/infocenter_alte_dokumente_aus_dem_archiv_sichtbar' 2023-02-02 12:20:42 +01:00
Andreas Österreicher f46ff9c97a Merge branch 'feature-11058/fas_unterrichtsnummer_ungleich_lehreinheit_id' 2023-02-02 12:12:12 +01:00
Andreas Österreicher 0cfcb58a58 Merge branch 'feature-25900/krankenstaende_abteilung_und_unternehmen_hinzufuegen' 2023-02-02 12:05:46 +01:00
Andreas Österreicher 92fb2f40cd Merge branch 'feature-26298/unr_problem_im_tempus_fas' 2023-02-02 11:50:40 +01:00
Andreas Österreicher 858ab16bc7 Merge branch 'feature-26104/standort_kurzbz_im_fas_anzeigen' 2023-02-02 11:45:50 +01:00
Andreas Österreicher b2e148d330 Bugfix Standort 2023-02-02 11:45:03 +01:00
Andreas Österreicher 463c6bd97a Merge branch 'feature-25431/zgv_master_eingabe_sperren' 2023-02-02 11:27:25 +01:00
Andreas Österreicher 2fdd136aa9 Merge branch 'feature-24683/reihungstest_zeit_für_gebiete_zuruecksetzen_nach_dem_entsperren_eines_teilnehmers' 2023-02-02 11:20:48 +01:00
Andreas Österreicher 6643fae82c Merge branch 'feature-24682/reihungstest_zugangscode_fuer_login' 2023-02-02 11:06:42 +01:00
Andreas Österreicher 94854592fb Merge branch 'feature-26425/konto_buchung_vorhanden_warning_namen_anzeigen' 2023-02-02 10:38:14 +01:00
Andreas Österreicher b60e0b712f Merge branch 'feature-25430/stammdaten_im_infocentertool_editierbar' 2023-02-02 10:32:36 +01:00
Andreas Österreicher 2b3842df29 Merge branch 'feature-27513/infocenter_fit_anpassung' 2023-01-31 12:29:56 +01:00
Andreas Österreicher e019faabe4 Merge branch 'feature-27480/international_skills_text_anpassungen' 2023-01-30 14:57:22 +01:00
ma0048 3293a75a79 - berechtigungsabfragen angepasst
- fit programme aus der config holen
2023-01-30 11:51:15 +01:00
ma0048 c8df6633af - text anpassungen 2023-01-27 08:56:47 +01:00
KarpAlex c136a0afdb phrasesupdate: added phrase for projektarbeitsbeurteilung weightening notice, changed phrases for total points for correct upper case 2023-01-26 18:55:41 +01:00
KarpAlex 7eda91d0a2 Merge branch 'master' into feature-24880/Sprachaenderung_in_Projektarbeitsbeurteilung_mit_Token 2023-01-26 17:38:34 +01:00
ma0048 44bfe52529 - fas filter hinzugefuegt 2023-01-26 11:35:22 +01:00
ma0048 50070bd2ad - Dokumente aus dem Archiv im Infocenter-Tool nicht anzeigen 2023-01-26 10:41:44 +01:00
Manfred a9e235678c Filter Widget in Tabellen 2023-01-24 21:13:36 +01:00
Paolo 0401821422 Merge branch 'master' into feature-15029/Docsbox 2023-01-23 13:32:51 +01:00
Werner Masik f7d315d4cc model classes for contract parts (Vertragsbestandteile) 2023-01-21 13:51:59 +01:00
Werner Masik fd5ce62b0e added timeline widget 2023-01-21 13:50:45 +01:00
Manfred c8fb2080da Studiengangsfilter bei Fragenübersicht 2023-01-20 10:46:22 +01:00
ma0068 d59b3736a2 Test personalmeldung xml 2023-01-18 13:15:56 +01:00
KarpAlex 73dc39b9d8 added phrases for Projektarbeitsbeurteilung language dropdown 2023-01-17 20:45:05 +01:00
Manfred 194d141539 Merge branch 'VorrueckungLetztesSemester' 2023-01-17 16:01:54 +01:00
Manfred 04584fdec9 Merge branch 'master' into VorrueckungLetztesSemester 2023-01-17 15:59:12 +01:00
Manfred f0b1c14ea4 Contents unchanged 2023-01-17 15:57:01 +01:00
Harald Bamberger 3fb20cf61e Merge branch 'bug-27193/Pause_fehlt_-_Falsche_Anzeige' 2023-01-16 16:10:54 +01:00
Cris 5872612d86 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-01-16 13:10:33 +01:00
Paolo 4fa1193948 - Added new CI config file application/config/db_crypt.php, it is loaded by core/DB_Model
- Added new constant ENCRYPTION_PASSWORDS to application/core/DB_Model.php
- Added new protected properties passwordName and encryptedColumns to core/DB_Model
- Added new private methods _isCryptoEnabledAndValid, _getCipher, _encrypt and _decrypt to core/DB_Model
- core/DB_Model properties insert and update now are making use of _encrypt()
- core/DB_Model properties loadWhere and loadTree now are making use of _decrypt()
2023-01-16 12:10:49 +01:00
Harald Bamberger f15e89c451 ignore DienstreiseMT entries when calculating Pausenfehler 2023-01-16 10:24:09 +01:00
Manfred f52c9ed3c2 Anpassung der Errormessage 2023-01-13 15:29:59 +01:00
Cris 8bd007b6ea Merged Fachbereichsleitungs-files into core files
. approveAnrechnungUebersichtData_fbl.php into approveAnrechnungUebersichtData.php
. reviewAnrechnungUebersichtData_fbl.php into reviewAnrechnungUebersichtData.php
2023-01-12 09:38:41 +01:00
Cris f2231fcba2 Disabled recommendation buttons if Lector is not empfehlungsberechtigt
If lector should see Anrechnung but not give a recommendation (because is not the LV-Leitung),
then recommendation buttons are disabled.
2023-01-11 18:13:14 +01:00
Cris 3f4efbcd16 Added function isEmpfehlungsberechtigt to AnrechnungLib
Checks if user is allowed to recommend Anrechnung.
2023-01-11 18:05:49 +01:00
Cris fb4f9981f0 Corrected: Anzeige aller LV-Leitungen, an die Empfehlung gesendet wurde
In der STGL Anrechnungs-Detailsicht wurde bisher nur die erste LV-Leitung
aus dem Ergebnisarray ausgelesen. Nun werden alle angezeigt.
2023-01-11 13:52:44 +01:00
Cris d1319a23ad Added: STGLs sehen jetzt nur Anrechnungen von STGs, für die sie eine Berechtigung haben
Es gibt eine neue Spalte 'schreibberechtigt' in der Anrechnungentabelle.
Defaultmäßig werden nur 'schreibberechtigte' Anrechnungen angezeigt, wo STGL
die Berechtigung auf die OE hat.
Über den Filter können aber auch alle angezeigt werden.
2023-01-11 13:47:23 +01:00
Cris 29f1760a7c Added: LektorInnen sehen jetzt nur Anrechnungen, für die sie eine Empfehlung abgeben dürfen
Es gibt eine neue Spalte 'empfehlungsberechtigt' in der Anrechnungentabelle.
Defaultmäßig werden nur 'empfehlungsberechtigt' Anrechnungen angezeigt, wo LektorIn:
- LV Leitung der LV ist ODER
- die LV keine LV-Leitung hat
Über den Filter können aber auch alle angezeigt werden.
2023-01-11 13:45:18 +01:00
ma0048 ed99325bb9 - anpassungen fuer master bewerbungen 2023-01-10 09:04:53 +01:00
Manfred c1b40608c1 Merge branch 'master' into VorrueckungLetztesSemester 2023-01-09 16:38:49 +01:00
Manfred 2ca9f29c0d Englischen Bachelor-Leitfaden entfernt 2023-01-09 15:52:12 +01:00
KarpAlex 9c40452562 fas lv list: improved speed of query getting the lv by relocating studienplan exists check 2023-01-05 18:25:15 +01:00
Werner Masik 030b459b0a make Vertragbestandteil JsonSerializable (because json_encode would otherwise output null) 2022-12-30 18:36:10 +01:00
KarpAlex 6d05df876b lehrstunde.class.php: added with clause to getStundenplanData for speedup, removed brackets, added comments 2022-12-23 20:18:19 +01:00
KarpAlex b8e973c313 lehrstunde get Stundenplan data: removed var_dump 2022-12-23 02:45:48 +01:00
KarpAlex 514205c171 lehrstunde get Stundenplan: changed how data for students is retrieved, so that correct gruppen, lektoren etc can be displayed 2022-12-23 02:44:22 +01:00
KarpAlex 19ebe3cfa8 lehrstunde getstudienplan method: added studiensemester to "special groups" test for students 2022-12-21 17:43:42 +01:00
KarpAlex 103b93a2b8 getStundenplandata method: student lehreinheiten are taken from Studienplan, not view vw_studentlehrverband 2022-12-20 22:22:36 +01:00
ma0068 9070a81f25 Änderung der From-Adresse auf noreply 2022-12-19 14:09:40 +01:00
ma0068 08ebcf591a Adaptierung Legende Fotoliste 2022-12-16 11:50:14 +01:00
ma0068 00446cdb33 Erweiterung Anwesenheitsliste um Geschlecht 2022-12-16 08:37:04 +01:00
ma0048 d9098179a2 - ermoeglicht es master bewerber sich ueber das bewerbungstool anzumelden 2022-12-14 12:40:38 +01:00
KarpAlex 48ee451a38 changed method projektarbeitIsCurrent to adapt to changes for master (weightening of points), kept old check as projektarbeitIsCurrentBeforeWeightening method 2022-12-13 17:25:42 +01:00
Harald Bamberger 3818d5221c first guess vertragsbestandteil library 2022-12-13 10:49:35 +01:00
Manfred db53de363c Merge branch 'master' into benutzerberechtigungGUIneu 2022-12-12 10:07:03 +01:00
Manfred 603abd5458 Merge remote-tracking branch 'origin/master' 2022-12-12 09:41:07 +01:00
Manfred cb9eaa7694 Last Status Abgewiesener ergänzt, Felder BPK und Matrikelnummer ergänzt 2022-12-12 09:40:02 +01:00
ma0068 7c17ac4ea7 Erweiterung Abfrage in Klasse Anwesenheit um wahlname 2022-12-12 08:32:51 +01:00
ma0048 ad19e0ed75 - im fas die unr hinzugefuegt 2022-12-12 07:55:36 +01:00
KarpAlex 46f7fc2883 Merge branch 'feature-19154/Beurteilungsformulare_Pruefungssenat' into feature-26516/Beurteilungsformulare_Gewichtung_bei_Master_Beurteilungen 2022-12-07 17:51:04 +01:00
KarpAlex 77361fc5f1 Projektarbeitsbeurteilungen: added phrass "gewichtet" 2022-12-07 17:40:20 +01:00
Cris 8d221be050 Adapt view to use Fachbereichsleitung-DataView 2022-12-06 15:53:15 +01:00
Cris 40c7e1c9f0 Created new Approve Anrechnung Uebersicht for Fachbereichsleitung 2022-12-06 15:52:30 +01:00
Cris 32bdeec02e Added date check for Fachbereichsleitung in Tabulator query 2022-12-06 15:49:04 +01:00
Cris 91a2bf4f21 Merge branch 'bugfix/STGL-kann-alte-Anrechnungen-nicht-sehen' into feature-26625/Anrechnungen-BFI-Änderungen-und-Sonstige 2022-12-06 14:15:15 +01:00
Cris c3e3d8e9d7 Added Fachbereichsleitung permission check to read Anrechnung and download Document 2022-12-06 14:05:42 +01:00
Cris 8735318545 Enhanced code readability 2022-12-06 14:03:22 +01:00
Cris 21060b31dc Bugfixed error message when LV has no lectors and only one recommendation is requested 2022-12-06 14:01:24 +01:00
Cris e148d8c2f4 Added function to get Fachbereich as mail receivers 2022-12-06 13:54:56 +01:00
Cris d3a1ed222c Adapted to send mails only if config['mail'] is TRUE 2022-12-06 13:43:11 +01:00
Cris 0197e5b175 Adapted STGL Views to display Fachbereichsleitung (as 'Empfaenger') after recommendation 2022-12-06 13:33:28 +01:00
Cris fe2601b29a Adapt view to use Fachbereichsleitungs-DataView 2022-12-06 13:25:25 +01:00
Cris 4a87fb49e9 Created new Review Anrechnung Uebersicht Tabulator for Fachbereichsleitung 2022-12-06 13:22:48 +01:00
Cris 88246c443a Added function getFachbereichleitung to AnrechnungLib
...plus adaptation to getEmpfehlungData to use this function.
2022-12-06 10:53:21 +01:00
Cris 10ed780b6c Added method getFachbereichsleitungByLv to Lehrveranstaltung_model
Gets all fachbereichsleiter of a Lehrveranstaltung
2022-12-06 10:50:08 +01:00
Cris cee15a68ba Added config['fbl'] and config['send_mail'] to anrechnungen
. config['fbl'] enables Fachbereichsleitung instead of LektorInnen
. config['send_mail'] enables sending Info Mails
2022-12-06 10:48:52 +01:00
KarpAlex 579eda8680 Merge branch 'master' into feature-19154/Beurteilungsformulare_Pruefungssenat 2022-12-02 19:57:28 +01:00
KarpAlex 911035d5ad added method getBetreuerart to Projektbetreuer model 2022-12-02 19:48:23 +01:00
ma0068 1aada9694e Anzeige EW-Team: nur aktuelle Eintraege oder Eintraege ohne Zeitraum 2022-12-02 12:44:53 +01:00
KarpAlex 41eaee41af getIncomingOrGsFoerderrelevant: studiensemester is checked only for prestudent status 2022-12-01 17:18:18 +01:00
ma0048 d24bc36bf7 - freischaltcode beim RT hinzugefuegt 2022-12-01 11:07:47 +01:00
ma0048 6215786565 - zeit staffelung hinzugefuegt 2022-12-01 10:20:10 +01:00
KarpAlex 7d1267732f IncomingOrGsFoerderrelevant plausicheck: added first version of issue resolver, renamed from IncomingAndGsFoerderrelevant 2022-11-30 17:53:36 +01:00
KarpAlex d1ac2e0424 added plausicheck "getIncomingUndGsFoerderrelevant" 2022-11-30 17:26:50 +01:00
ma0068 1c0e74e828 Testvarianten zur Anzeige von EW-Team in Personalmeldung 2022-11-30 10:38:40 +01:00
Cris ca217f1869 Fixed: Downloadlink erzeugt nach Page Reload keine Fehlermeldung mehr 2022-11-29 18:10:39 +01:00
ma0068 8baa5b74dd Revert "personalmeldung.php mit masterstand überschrieben, um letztes commit rückgängig zu machen"
This reverts commit 39572452a0.
2022-11-29 10:39:20 +01:00
ma0068 39572452a0 personalmeldung.php mit masterstand überschrieben, um letztes commit rückgängig zu machen 2022-11-29 10:26:31 +01:00
ma0048 381fa2ed7e - bei der warnung buchung vorhanden, name hinzugefuegt 2022-11-29 10:17:32 +01:00
ma0068 d1a8ec7490 Erweiterung und OrderBy der Abfragen um Dauer Auslandsaufenthalt 2022-11-29 08:15:22 +01:00
Cris 7cdb7688c4 Fixed: Vergangene Anrechnungen können jetzt eingesehen werden
Manche vergangene Anrechnungen konnten nicht eingesehen werden, weil
die Zuordnung der Studenten zu den Lehrveranstaltungen aufgelöst bzw. geändert werden.
Gefixt, indem nun bei einer bestehenden Anrechnung die bei der Anrechnung hinterlegten Lehrveranstaltung
herangezogen wird.
2022-11-28 17:27:39 +01:00
ma0068 561e4ea21a Erweiterung von Studiengangs_kz_Array um Start und Ende Entwicklungsteam 2022-11-28 10:56:20 +01:00
Cris 72c0f97218 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-11-28 10:28:01 +01:00
ma0048 a2f65373cd - fixed bug 2022-11-24 06:57:56 +01:00
KarpAlex 33eb1cb6af removed comment in Plausichecks.php controller 2022-11-23 16:21:05 +01:00
ma0048 37cbe5e8f7 - le details disablen bis der rebuild fertig ist 2022-11-23 07:24:48 +01:00
ma0068 a88e5cbdc2 Ergänzung Prüftabelle um entwicklungsteam_id 2022-11-22 12:22:48 +01:00
ma0068 f9d5a6a6a5 Adaptierungen fuer CheckSystem, dbupdate3.4 2022-11-22 12:14:54 +01:00
Andreas Österreicher 37ec8d84e5 Merge branch 'Monika70-studentenexpoertextended' 2022-11-22 11:18:50 +01:00
Andreas Österreicher 817d2842cc Changed Escaping of Parameter 2022-11-22 11:17:57 +01:00
Szabo Mónika 9d43279089 Update studentenexportextended.xls.php
mit Anmerkung erweitern
2022-11-22 10:03:40 +01:00
Andreas Österreicher 60a651c220 Merge branch 'feature-25183/lv_evaluierung_uebersichtsseite_langsam' 2022-11-21 16:36:50 +01:00
Andreas Österreicher 462e77d27d Merge branch 'feature-24768/fas_zgv_bezeichnung' 2022-11-21 16:17:28 +01:00
Andreas Österreicher 920fcc0e42 Merge branch 'feature-246/notizen_bei_lehrveranstaltungen_werden_nicht_korrekt' 2022-11-21 16:11:21 +01:00
ma0068 01ad28021f Fix mergeErrors mitarbeiter.class und dbupdate3.3 2022-11-21 16:10:19 +01:00
Andreas Österreicher 9f8d9f1df6 Merge branch 'bug-25904/studentenmeldung_xml_standort_code_Ambiguitaet' 2022-11-21 15:53:58 +01:00
Andreas Österreicher 7cd4eaf5a2 Merge branch 'bug-26144/Bewerberdaten_BIS_Export_XL_Error' 2022-11-21 15:47:51 +01:00
Andreas Österreicher 5e1ed8fa14 Bugfix für Statistiken mit Array Parametern 2022-11-21 15:39:32 +01:00
Andreas Österreicher 3c99d627e1 Merge branch 'feature-19835/BewerbungstoolKeineZGVAbbrecher' 2022-11-21 15:27:36 +01:00
KarpAlex fec45f7b75 separated Bewerbermeldung from Studierenden BIS Meldung, bugfix: correct Bewerber numbers for correct Studiengänge are displayed, renamed ZugangMaCode Element to ZugangMaStgCode 2022-11-18 18:41:02 +01:00
Nikolaus Krondraf 7ef7b86d30 Studierende können sich frühestens 2 Monate vor Prüfung anmelden 2022-11-18 11:11:35 +01:00
Nikolaus Krondraf 1ec742b8fe typo 2022-11-18 10:05:38 +01:00
Nikolaus Krondraf 01107e361f Studierende können sich frühestens 2 Monate vor Prüfung anmelden 2022-11-18 10:01:39 +01:00
Manfred 82b9f595c3 Merge remote-tracking branch 'origin/master' 2022-11-17 13:57:54 +01:00
Manfred d84f53e5c3 GS-Button zum Kopieren bestehender Einträge 2022-11-17 13:57:52 +01:00
Cris deeb1cdb5e Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-11-17 10:42:13 +01:00
KarpAlex 763b0bb756 renamed betreuerart of secondary examiner of bachelor thesis with Vorsitz from Senatspruefer to Senatsmitglied 2022-11-16 17:19:13 +01:00
ma0048 ac370197e1 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-25430/stammdaten_im_infocentertool_editierbar 2022-11-15 15:29:15 +01:00
ma0048 ab95544f9f Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-25518/bewerbungstool_messages_direkt_an_permesser 2022-11-15 15:18:59 +01:00
ma0048 6e6406fb2b Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-25431/zgv_master_eingabe_sperren 2022-11-15 15:17:55 +01:00
ma0048 00fb8366b3 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-25183/lv_evaluierung_uebersichtsseite_langsam 2022-11-15 15:16:21 +01:00
ma0048 8e72b83448 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-24768/fas_zgv_bezeichnung 2022-11-15 15:14:53 +01:00
ma0048 98ec75dc94 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-24683/reihungstest_zeit_für_gebiete_zuruecksetzen_nach_dem_entsperren_eines_teilnehmers 2022-11-15 15:14:04 +01:00
ma0048 9601ac5116 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-246/notizen_bei_lehrveranstaltungen_werden_nicht_korrekt 2022-11-15 15:13:25 +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
ma0048 75f8c4e909 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-15490/lehrauftragsliste_stammkostenstelle_bei_fix_angestellten 2022-11-15 15:09:29 +01:00
ma0048 d70c0dcae3 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core into feature-11836/reihungstest_starten_von_fremden_gebieten_verhindern 2022-11-15 15:08:01 +01:00
ma0068 540fc4bede 26198 Notenimport ausschliesslich bei vorhandener Note 2022-11-15 11:22:47 +01:00
KarpAlex 8bbbd8cb8d studentenmeldung bugfix: Erhalter Kz is correctly exported 2022-11-14 18:13:49 +01:00
KarpAlex 048c164394 studentenmeldung.php: correct order - Studenten first, then Bewerber 2022-11-14 17:57:20 +01:00
Andreas Österreicher 6c918be121 Merge branch 'bug-26144/Bewerberdaten_BIS_Export_XL_Error' 2022-11-14 10:50:18 +01:00
KarpAlex 2c743cb37b studentenmeldung.php: Export of Bewerberdaten works for allBaMa and Studiengaenge 2022-11-11 23:41:12 +01:00
Andreas Österreicher 471242cb97 Added Index for tbl_webservicelog.execute_time to increase performance 2022-11-11 15:03:48 +01:00
Harald Bamberger 7df9576481 add tabulator header filters to logsviewer 2022-11-11 15:02:39 +01:00
ma0068 a412db7356 Attribut raumtyp_aktiv als boolean parsen 2022-11-11 14:27:06 +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
ma0068 ddfb3cdb4e Formatierungen Urlaubstool 2022-11-11 11:25:42 +01:00
ma0048 119a521913 - standort kurzbz im fas anzeigen, wenn die bezeichnung null ist 2022-11-11 10:56:36 +01:00
Andreas Österreicher b69e79685d Merge branch 'master' into feature-24768/fas_zgv_bezeichnung 2022-11-11 09:53:23 +01:00
Andreas Österreicher 7558614145 Merge branch 'feature-25557/inaktive_lektorinnen_im_lehrauftrags_dropdown_kennzeichnen' 2022-11-11 09:41:18 +01:00
KarpAlex f0b36610b7 Projektarbeitsbeurteilung: added phrases, updated filter for uebersicht-page 2022-11-10 19:38:16 +01:00
ma0068 f72afe473c 26112 Vilesci-Kein Löschen von Zeitsperren bei abgeschickter Monatsliste möglich 2022-11-10 15:02:13 +01:00
ma0068 f766f36095 26113 Änderung Mails Zeitsaldo 2022-11-10 11:43:27 +01:00
ma0068 74fb245757 26114 Änderung Mailtext Urlaub neu 2022-11-10 11:20:36 +01:00
Andreas Österreicher 4e3e425491 Mailversand bei Urlaubstool korrigiert 2022-11-09 11:58:31 +01:00
KarpAlex 29809b6bf1 moved Beurteilungsformulare Pruefungssenat changes to dbupdate_3.4 2022-11-08 16:15:16 +01:00
KarpAlex 83b38b999d Merge branch 'master' into feature-19154/Beurteilungsformulare_Pruefungssenat 2022-11-08 15:35:08 +01:00
ma0048 8df802b74a - die Abteilung und das Unternehmen werden im CSV angezeigt 2022-11-08 14:45:02 +01:00
Paolo 9c0d70fe89 Removed version 4 of tinymce 2022-11-08 12:01:05 +01:00
ma0048 a9d065044d - Inaktive LektorInnen im Lehrauftrags-Dropdown kennzeichnen 2022-11-07 12:17:09 +01:00
ma0048 c3ff32a9d6 - unterschiedliche farbmarkierungen hinzugefuegt 2022-11-07 11:16:27 +01:00
Paolo 50bf478f0b If the title is not provided to the FilterComponent then the title div is not rendered 2022-11-04 14:06:50 +01:00
Paolo 317a1f87fa Added colors to the LogsViewer app 2022-11-04 13:56:54 +01:00
ma0048 592fd7ac10 Merge remote-tracking branch 'origin/master' into feature-15490/lehrauftragsliste_stammkostenstelle_bei_fix_angestellten 2022-11-04 10:49:27 +01:00
ma0048 180e24b916 - studienbestaetigung in englischer sprache hinzugefuegt
- odt files angepasst im core
2022-11-04 10:37:38 +01:00
KarpAlex ebb3a6de1f plausichecks view: adapted to vue update - set correct cs and css includes, removed body 2022-11-03 15:33:05 +01:00
cgfhtw 4dd983c105 Phrases 2022-11-03 12:52:31 +01:00
KarpAlex 35b23bcba4 Merge branch 'master' into feature-17512/Issues_Plausibilitaetspruefungen 2022-11-03 12:07:51 +01:00
KarpAlex 71c953bac7 studentenmeldung: standort_code is retrieved and set in xml correctly (first prestudent, then studiengang) 2022-11-03 12:04:46 +01:00
ma0048 ffec6a5422 - stammdaten editierbar 2022-11-03 09:55:38 +01:00
ma0068 9b79a2f446 Merge branch 'master' into feature-25003/NotenimportFuerNachpruefung 2022-11-03 08:48:05 +01:00
ma0068 314e71a2d0 Merge branch 'master' into feature-24913/TabelleRaumtypNeuesAttributAktiv 2022-11-03 08:46:05 +01:00
ma0048 a8f6ca1670 Merge remote-tracking branch 'origin/master' into feature-25430/stammdaten_im_infocentertool_editierbar
# Conflicts:
#	application/views/system/infocenter/infocenterDetails.php
2022-11-03 08:29:10 +01:00
ma0048 651a4a97e7 - stammdaten editierbar 2022-11-02 16:50:53 +01:00
ma0068 d7897d7129 Merge branch 'master' into feature-17727/FasDefaultStundensatzProjektbetreuungAnzeigen 2022-11-02 16:18:23 +01:00
ma0068 5d847ccd38 Merge branch 'master' into feature-19835/BewerbungstoolKeineZGVAbbrecher 2022-11-02 15:56:04 +01:00
ma0068 c47d2c93fe Merge branch 'master' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-11-02 15:05:25 +01:00
Cris 7b5e5562b5 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-11-02 10:56:55 +01:00
Andreas Österreicher 1c0b21cb74 JS Includes Korrigiert für Prüfungsprotokolle und UDFs 2022-10-31 16:30:41 +01:00
Andreas Österreicher 15b2c469e2 Restricted Access 2022-10-31 15:31:50 +01:00
Andreas Österreicher 771395cbbf Versionsnummer auf 3.4 erhöht. Extension installer Prüft auf
Minimalversion vom Core. Neue Ordnerstruktur für Checksystem
2022-10-31 15:16:30 +01:00
ma0048 f0fd071e31 - notizen ausblenden 2022-10-31 13:44:17 +01:00
Andreas Österreicher 989a7b8720 Neuen Config für BASE_LOCATION hinzugefügt 2022-10-31 13:23:03 +01:00
Andreas Österreicher 556e58e78e Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' 2022-10-31 11:29:51 +01:00
ma0048 f7bd49b408 - master messages an studiengang, wenn bereits bestaetigt
- lehrgang messages direkt an lehrgang
2022-10-28 10:56:02 +02:00
Harald Bamberger c9aba38803 change name of column StdKst to Standardkostenstelle 2022-10-28 07:01:39 +02:00
ma0068 c7f477555c Adaptierungen DB und Dropdowns Fas Lehrveranstaltungen 2022-10-27 15:17:29 +02:00
ma0048 4518eab1a8 - stammdaten include 2022-10-25 07:14:47 +02:00
ma0048 9192befce1 - stammdaten include 2022-10-25 07:08:29 +02:00
ma0048 572e53f554 - addon angepassst fuer die stammdaten 2022-10-25 07:02:13 +02:00
Harald Bamberger b3ce06cb90 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-10-24 15:21:11 +02:00
Manfred 73dd6e6dc1 Autocomplete in Berechtigungrolle 2022-10-24 14:27:54 +02:00
Manfred 5e9b5b2ce5 Direktlink auf Rolle 2022-10-24 14:27:34 +02:00
Manfred bf8aa6c4ac Student im Max-Semester nicht vorrücken 2022-10-24 12:23:03 +02:00
Harald Bamberger 50ab6ae5e9 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-10-24 11:02:52 +02:00
KarpAlex 7a1f36cb5e issuesData Fehlermonitoring: changed order for issue display, first by error type, then by status 2022-10-23 18:02:59 +02:00
ma0048 53dc6b3c63 - tag closed 2022-10-21 11:07:52 +02:00
ma0048 1609543a31 - lv evaluierung ubersichtsseite optimiert 2022-10-20 14:01:31 +02:00
Manfred aadd6b0d92 Anzahl Rechte zählen 2022-10-18 16:48:27 +02:00
ma0048 0bd7d6f7c6 - editieren von stammdaten im infocentertool 2022-10-18 11:00:57 +02:00
ma0068 47d3ab33e7 Adaptierung Vorlage Notenliste.xls um Nachprüfung und Termin3 2022-10-18 09:17:07 +02:00
KarpAlex 336f32bee0 issues: removed unnecessary unique constraint on fehlercode and fehler_kurzbz, added NOT NULL constraint on fehler_kurzbz together with fehlercode_extern 2022-10-17 18:12:34 +02:00
KarpAlex c96baac859 Merge branch 'master' into feature-17512/Issues_Plausibilitaetspruefungen 2022-10-17 17:11:17 +02:00
ma0068 8754c46575 Refactor Import Termin2 und Termin3 2022-10-17 14:34:11 +02:00
Werner Masik 235f15e9f7 removed primeflex.mini.css 2022-10-17 12:36:08 +02:00
Werner Masik 4480b6ce57 removed 'Bottom Panel' text from verticalSplitter because it is shown on empty pages 2022-10-17 12:36:08 +02:00
Werner Masik 23b228c085 added primeflex css classes 2022-10-17 12:36:08 +02:00
ma0068 4f71a274e2 Update Überprüfungen ZGV mit get_rolle_prestudent() 2022-10-17 08:36:36 +02:00
ma0068 458117fced Funktion existsZGV: prestudents mit Last Status Abbrecher werden nicht berücksichtigt 2022-10-14 16:24:45 +02:00
ma0068 382da823e4 Erweiterung Funktion existsZGV um LastStatusPrestudent 2022-10-14 16:12:41 +02:00
ma0048 bfb24320d7 - editieren der ZGV Master nur noch mit eigenen Recht moeglich 2022-10-14 11:11:25 +02:00
ma0068 ce3cea5515 Validierungen Format Datum, Matrikelnr, StudentId, Note 2022-10-13 15:36:08 +02:00
ma0068 29fc5181bf Importfunktion Termin3 2022-10-13 10:16:26 +02:00
ma0068 035d196ae5 Logik Matrikelnummer StudentenId 2022-10-13 08:04:10 +02:00
ma0068 54411f4de7 Benotungstool: Importfunktion Termin2 2022-10-12 15:06:07 +02:00
KarpAlex 2504c91cd9 AusbildungssemPrestudentUngleichAusbildungssemStatus Plausicheck: added student_uid to fehlertext, changed order of ausbildungssemester in fehlertext 2022-10-12 12:36:34 +02:00
KarpAlex c7c0bbfb49 Merge branch 'feature-17512/Issues_Plausibilitaetspruefungen' of github.com:FH-Complete/FHC-Core into feature-17512/Issues_Plausibilitaetspruefungen 2022-10-12 11:56:02 +02:00
ma0048 492562efdf - zeit hinzufuegen fuer den pruefling 2022-10-12 11:46:03 +02:00
KarpAlex 65c6466465 PlausicheckLib: -run check InaktiverStatusAktiverStatus always for current semester -removed unused result variables, todo comment 2022-10-12 11:23:51 +02:00
ma0048 a2c2eddf0d - sql angepasst 2022-10-12 11:18:05 +02:00
Cris 82cbc63096 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-10-11 09:51:45 +02:00
Andreas Österreicher 30fbeda1ba Merge branch 'master' into feature-15029/Docsbox 2022-10-11 09:32:24 +02:00
ma0048 1b49ea2a20 - rt job angepasst 2022-10-11 08:23:49 +02:00
Paolo 08a58b919a Added the operations equal and not equal for strings in the FilterComponent 2022-10-10 14:55:49 +02:00
Paolo ba5fb29d13 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-10-10 14:44:31 +02:00
Paolo aead693675 - Removed not used methods sortSelectedFields, removeSelectedField and addSelectedField from controllers/components/Filter
- Removed not used methods sortSelectedFields, addSelectedField and removeSelectedField from libraries/FilterCmptLib
- CSS fixes for FilterComponent and NavigationComponent
- Removed not used API calls from public/js/components/filter/API.js
- Added second level menu entries to the NavigationComponent
- Added new property side-menu to the FilterComponent to render the filters selection via the NavigationComponent or directly from the FilterComponent
- FilterComponent:
	- Column positioning is now managed by tabulator
	- Splitted the column selection from the filter options
	- Added the rendering of the filters selection via an optional dropdown
	- Changed the usability and the look of the filter options
	- German translation
2022-10-10 14:38:02 +02:00
KarpAlex f2f960fd43 Plausichecks: added comments, fixed bug for studiengang parameter in GbDatumWeitZurueck check 2022-10-08 01:40:14 +02:00
KarpAlex fb5656833a added plausichecks to navigation menu, improved plausichecks GUI responsiveness, made it centered 2022-10-07 18:22:06 +02:00
KarpAlex b067c97beb Plausichecks: changed texts of some Plausichecks for better understanding, AbschlussstatusFehlt check: Studiensemester not necessary for resolving, checking for melderelevant for fehler StgPrestudentUngleichStgStudienplan 2022-10-07 18:05:25 +02:00
ma0068 18cdbb8f6d Merge branch 'feature-19041/ZeitausgleichSanchoMail' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 09:09:54 +02:00
ma0068 7d3a12fd1c Merge feature-16658/NeueVertragsartAllIn into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 09:03:20 +02:00
ma0068 36b4964d53 Merge branch 'feature-16655/StundensaldoAllin' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 08:51:00 +02:00
ma0068 11a208de55 Merge branch 'feature-15943/VilesciLoeschenVonUrlaubenBeiAbgeschicktenMonatslistenVerhindern' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 08:49:17 +02:00
ma0068 2f5e9d80da Merge branch 'feature-17071MonatslisteVorzeitigAbschickenEndeDV' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 08:45:48 +02:00
ma0068 ae42051f15 Merge branch 'bug-24113/ZeiterfassungBerücksichtigungVonAttributProjektZeitaufzeichnung' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 08:44:35 +02:00
ma0068 32493c1b9d Merge branch 'bug-19038/AnzeigeOffenerMonatslistenBeiNichtZeitaufzeichnungspflichtig' into feature-25177/ZeiterfassungMergedBrancheDeploy1 2022-10-07 08:40:43 +02:00
KarpAlex 03d6955ec4 issueDataset.js: code formatting 2022-10-06 10:34:32 +02:00
KarpAlex 21d3d40171 issueDatase.js: added comment for changeIssueStatus method 2022-10-06 10:30:55 +02:00
ma0068 9b3b571bd9 Erweiterung Phrasen 2022-10-06 08:55:11 +02:00
KarpAlex 8fe346f6be plausichceks: changed phrasing of check AusbildungssemPrestudentUngleichAusbildungssemStatus 2022-10-06 03:47:28 +02:00
KarpAlex fb70ba3da5 issueDataset.js: enabled sending many issue ids for status change by splitting up 2022-10-06 03:25:57 +02:00
Manfred 5f8a530857 Merge branch 'master' into benutzerberechtigungGUIneu 2022-10-05 17:51:27 +02:00
Manfred d82426cd91 Autocomplete für Kostenstelle 2022-10-05 17:42:45 +02:00
Manfred b293673ee9 Updateamum nur bei geänderten Datensätzen
Kostenstelle Autocomplete
Counter für Anzahl Zeilen
Anmerkungsfeld verbreitert
2022-10-05 17:42:24 +02:00
KarpAlex edd310351b plausichecks fehlertext: check number of parameters before calling vsprintf 2022-10-05 14:07:29 +02:00
KarpAlex c31ab4874d moved "plausicheck start" button in GUI to the right 2022-10-05 14:04:59 +02:00
KarpAlex 2a060ace25 -added issue resolvers for plausichecks - renamed fehler PrestudentStgUngleichStgStudienplan to StgPrestudentUngleichStgStudienplan -fixed some parameters passed for resolving -plausicheck getDatumStudiensemesterFalscheReiheinfolge: performed directly in SQL for speedup -plausicheck GUI: fixed comment, minor text changes 2022-10-04 19:17:03 +02:00
KarpAlex 5670f931ef Plausichecks: beautified GUI output 2022-10-04 03:17:41 +02:00
KarpAlex b28e780aa6 plausichecks issues fehlerupdate.php: added brackets to OrgformStgUngleichOrgformPrestudent 2022-10-04 03:11:59 +02:00
KarpAlex aee25c5252 moved issue resolvers to #own resolvers folder, created first resolver CORE_INOUT_0007 for plausichecks 2022-10-03 19:25:32 +02:00
KarpAlex ae26c4d1ee plausichecks.js: reformatted file, display error as message 2022-10-03 13:40:33 +02:00
KarpAlex f8d3337481 added Plausicheck gui to start plausichecks manually 2022-10-03 02:32:28 +02:00
KarpAlex 5b46722913 -PlausicheckLib: melderelevant and bismelden fields are checked only if applicable, speed up by including conditions in SQL instead of PHP functions -added more info to some fehler texts by params 2022-10-03 02:28:48 +02:00
Andreas Österreicher 9d3d84e7ea Pfad zu Bootstrap angepasst 2022-09-30 15:11:01 +02:00
Andreas Österreicher ae4bf1feb1 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-09-30 14:54:07 +02:00
ma0048 b4d86744f2 - fas zgv statt kurzbz auf bezeichnung 2022-09-30 12:50:33 +02:00
ma0068 889f8370e1 bugfix checkIfArbeitspakektZuWaehlen 2022-09-30 12:04:59 +02:00
KarpAlex 0d605158a5 changed text of AktiverStudentOhneStatus plausicheck 2022-09-29 19:43:40 +02:00
KarpAlex eee43fe921 AktiverStudentOhneStatus check: check for status already in SQL instead of getLastStatus function, future status with 4 months buffer 2022-09-29 19:41:30 +02:00
KarpAlex 7c02f21582 added plausichecks to PlausicheckProducerLib, bugfixes in PlausicheckLib and plausicheck libraries and fehlerupdate, mainly concerning passed parameters 2022-09-29 03:16:05 +02:00
KarpAlex 23ec0d6344 Plausicheck AbschlusstatusFehlt: existence of status in previous Semester is checked as well when passing a Studiensemester 2022-09-28 17:26:36 +02:00
KarpAlex 1241a05ed3 -Plausichecks: added correct fehlertext and resolution params -replaced Plausichecker Interface with abstract class, which gets ci instance and loads plausicheck lib -write issue info only if issue really newly inserted 2022-09-27 18:32:15 +02:00
KarpAlex 9bae6bb0a4 added params to plausicheck libraries, added PlausicheckProducerLib to enable execution of plausichecks for GUI as well, removed old IssueProducer_Controller 2022-09-26 00:41:48 +02:00
KarpAlex 2c475f8bde fehlerupdate: renamed NationNichtOesterreichAberGemeinde Plausicheck, PlausicheckLib: added comments 2022-09-22 19:54:18 +02:00
ma0068 cb5c11a6ab Zeiterfassung config DEFAULT_ALLIN_DIENSTVERTRAG für Anzeige Saldo AllIn 2022-09-22 13:50:43 +02:00
Harald Bamberger e4590909e2 use alias if available instead of uid for email address 2022-09-22 13:20:12 +02:00
ma0068 f9e33a1779 Zeiterfassung: Config ECHTER_DIENSTVERTRAG 2022-09-22 11:32:49 +02:00
ma0068 c1df686edc Zeiterfassung: Projektvalidierung in Klassen refactored 2022-09-22 10:30:15 +02:00
Harald Bamberger 921b1d337d fix typo 2022-09-22 10:21:24 +02:00
Harald Bamberger bf216e6505 search also in stdkst and oe unit 2022-09-22 10:00:23 +02:00
Harald Bamberger 225b3b7c6e only show current stdkst in searchresult 2022-09-22 09:39:05 +02:00
KarpAlex edb69498e5 added PlausicheckLib for checking plausi issues 2022-09-21 19:55:37 +02:00
KarpAlex 5d1e99a222 Plausichecks: enabled passing of params to plausi issue checkers, created first checker StgPrestudentUngleichStgStudent 2022-09-21 19:54:20 +02:00
KarpAlex 0643b99e86 added Plausicheck fehler (for issues) to database 2022-09-21 19:50:30 +02:00
Harald Bamberger 85338b8477 add PersonalFilters to sideMenu, refresh sideMenu in the session after a custom filter was saved 2022-09-21 15:56:42 +02:00
Harald Bamberger de667990a3 add Standard-Kostenstelle to search result for employees 2022-09-21 15:23:45 +02:00
ma0068 3570b2c04d BT: Adaptierung Prüfung auf Abbrecher auf aktuellen Prestudentstatus 2022-09-21 12:54:41 +02:00
Paolo aa217a42d4 Fixed handlerApplyFilterFields of the components/filter/Filter 2022-09-21 12:47:07 +02:00
Manfred a27ad33e0e Merge branch 'master' into benutzerberechtigungGUIneu 2022-09-21 11:09:27 +02:00
Nikolaus Krondraf ec07c4154d Problem behoben wodurch die Anrechnungen im FAS nicht angezeigt werden wenn diese ohne Anrechnungstool im FAS erfasst werden 2022-09-20 14:31:51 +02:00
ma0068 4d44bbb79c Anzeige Aktueller Urlaubssaldo in Sanchomail 2022-09-20 12:39:20 +02:00
Paolo 07a1d7ecb2 - Added CSS for the navigation component and the filter component
- Changed layout of the filter component
2022-09-19 16:31:55 +02:00
KarpAlex 926180f5da system/checkStudenten: corrected typo in Studierenden Orgform Plausicheck text output 2022-09-18 23:11:43 +02:00
KarpAlex 40d8edebef Plausichecks: added run method to IssueProducer_Controller for producing plausicheck issues 2022-09-18 23:02:55 +02:00
KarpAlex d5eff7d615 issue plausichecks: added issue producer files, code formatting 2022-09-15 18:56:18 +02:00
Manfred 450b0b6433 Initial commit 2022-09-14 15:55:07 +02:00
KarpAlex 0d03689f57 added IIssueExistsChecker and Issue<producer_Controller for detection of issues 2022-09-14 02:48:43 +02:00
ma0068 7252bc1e6f add config.file 2022-09-09 13:20:50 +02:00
ma0068 604592cdd1 Bewerbungstool: neue Funktion isPastAbbrecher() 2022-09-07 15:27:47 +02:00
ma0068 625b3c74c4 Bewerbungstool: keine ZGV bei Abbrechern, Berücksichtigung studentstatus für Dokumenthandling 2022-09-07 09:22:06 +02:00
ma0068 259f9d29d5 Merge branch 'master' into feature-19041/ZeitausgleichSanchoMail 2022-09-05 15:20:44 +02:00
ma0068 b53f3a1170 Merge branch 'master' into feature-17071MonatslisteVorzeitigAbschickenEndeDV 2022-09-05 13:54:44 +02:00
ma0068 b8d1c61b83 Merge branch 'master' into feature-16658/NeueVertragsartAllIn 2022-09-05 13:53:59 +02:00
ma0068 619924eff8 Merge branch 'master' into feature-16655/StundensaldoAllin 2022-09-05 13:52:59 +02:00
ma0068 477a7dd588 Merge branch 'master' into feature-15943/VilesciLoeschenVonUrlaubenBeiAbgeschicktenMonatslistenVerhindern 2022-09-05 13:51:45 +02:00
ma0068 6bdbe91dd9 Merge branch 'master' into bug-19038/AnzeigeOffenerMonatslistenBeiNichtZeitaufzeichnungspflichtig 2022-09-05 13:36:10 +02:00
ma0068 8670ab18f8 Zeitaufzeichnung: Berücksichtigung von Attribut Zeitaufzeichnung bei Projekt und Projektphase 2022-09-05 11:27:33 +02:00
KarpAlex cc33502ab3 adapted "resend token for Begutachter" mail to Projektarbeitsbeurteilung controller split 2022-09-01 02:23:32 +02:00
Paolo 537ce0940c Code quality check improvements 2022-08-31 15:48:35 +02:00
KarpAlex 824a148b92 adapted core to Projektarbeitsbeurteilung Zweitbegutachter/Erstbegutacher Controller split 2022-08-31 13:38:38 +02:00
Andreas Österreicher ed9f6e0c9b Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-30 14:44:13 +02:00
Andreas Österreicher a2bacae6d7 Merge branch 'feature-19001/VUE_ROUTER' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-30 14:43:10 +02:00
KarpAlex 92762c5dc2 Projektarbeitsbeurteilung:
- getZweitbegutachterWithToken: returns Zweitbegutachter (Senatspruefer) 
from Senatspruefungen as well
- added phrase
2022-08-27 01:34:03 +02:00
KarpAlex 2ff067193d added Senatsvorsitz to betreuerart kurzbz in pdfExport 2022-08-24 19:39:59 +02:00
KarpAlex 1d408b9d65 added comment to getZweitbegutachterWithToken method in projektbetreuer class 2022-08-24 19:39:31 +02:00
KarpAlex 60d675f22b added parbeitDownload phrases for Projektarbeitsbeurteilung 2022-08-24 18:09:53 +02:00
KarpAlex 2125fdc219 sending of zweitbetreuer mail with token: correct subject depending on projekttyp 2022-08-24 18:09:30 +02:00
KarpAlex 1d5d5e4a84 added getEndabgabe method to Paabgabe model 2022-08-24 18:07:34 +02:00
KarpAlex a1622d8b74 made betreuert SenatsprueferIn gender neutral 2022-08-24 17:05:30 +02:00
KarpAlex 82d7891f3c Projektarbeitsbeurteilung possible for Prüfungssenat. Mails are sent to Senat members, Senat members are displayed with correct labels, external Prüfer can get login token 2022-08-23 17:45:12 +02:00
KarpAlex 282b46d54e Added betreuerart Senatsvorsitz and Senatsprüfer 2022-08-23 15:26:13 +02:00
Harald Bamberger 238810b5a8 workaround issue with resizable columns 2022-08-19 12:38:29 +02:00
Paolo b0ffbea9a5 Composer changes 2022-08-19 12:21:04 +02:00
Werner Masik 5af4f7a405 Merge remote-tracking branch 'origin/feature-19473/VUE_Filter_Navigation_Widgets' into feature-19001/VUE_ROUTER 2022-08-18 21:31:54 +02:00
Harald Bamberger 3138ac3e25 add columns Aktiv and StdKst to MA Uebersicht Filterx 2022-08-18 16:38:28 +02:00
Harald Bamberger 582cb20b72 rename Handler functions to do not have a data and methods property error 2022-08-18 15:27:02 +02:00
Paolo c9eb60aade Removed tabulator property from Filter component 2022-08-18 14:52:50 +02:00
Paolo a0e2d7e37d Filter component: changed columns handling for the tabulator 2022-08-18 11:53:54 +02:00
Werner Masik 7b95ca4b92 Merge remote-tracking branch 'origin/feature-19473/VUE_Filter_Navigation_Widgets' into feature-19001/VUE_ROUTER 2022-08-17 22:13:29 +02:00
Werner Masik a3c9d75617 added model for adressentyp 2022-08-16 13:10:20 +02:00
Paolo 7dd48b2350 Fixed meta includes 2022-08-16 10:57:32 +02:00
Paolo 492014db3a Changed variable names for includes 2022-08-16 10:28:13 +02:00
Harald Bamberger dd38765237 Merge branch 'feature-19538/Gruppenadministratoren' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-16 10:25:46 +02:00
Werner Masik 5ea46ece47 added VueRouter to composer; integrate router.php from extensions 2022-08-15 20:25:42 +02:00
Harald Bamberger 2e00f30e71 Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 16:07:39 +02:00
Cris 73c516cbed Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 14:59:39 +02:00
Cris 08b1047b09 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of https://github.com/FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 14:59:06 +02:00
Paolo 1103bb7aa1 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 14:47:31 +02:00
Paolo d95cbb39e3 Reverted bootstrap and jquery include order 2022-08-11 14:46:28 +02:00
ma0048 d7fb91371e added missing includes for infocenter 2022-08-11 14:34:32 +02:00
Cris f85dd2fd2e Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-10 18:21:01 +02:00
Cris c6aa3c7d9b Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-10 16:28:08 +02:00
Cris fabdb70d72 Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-10 16:08:54 +02:00
Paolo e39bb1ea8a Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-09 18:43:06 +02:00
Harald Bamberger 7499a7f90a navigation component add option to pass css classes for left menu, verticalsplit add isCollapsed function, searchbar remove search button and prevent page reload on pressing enter 2022-08-09 17:12:47 +02:00
Paolo 6d81e36e68 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-08 12:11:08 +02:00
Paolo b912ca9a06 Navigation and Filter components code improvements 2022-08-08 10:31:30 +02:00
ma0048 1ee0e8eeb9 verhindert das starten von fremden gebieten 2022-07-22 12:33:47 +02:00
ma0068 53a3417c8e Erweiterung lehreinheiten_vorrueckung.php um Config DEFAULT_ECHTER_DIENSTVERTRAG 2022-07-18 16:22:30 +02:00
ma0068 d81b205c05 Adaptierung checkbisverwendung.php und lehrveranstaltungDBDML.php um Config DEFAULT_ECHTER_DIENSTVERTRAG 2022-07-18 14:03:07 +02:00
Paolo 6b4b3bad6a Fixed application/libraries/FilterCmptLib->applyFilterFields, from arrays to objects 2022-07-14 11:47:28 +02:00
Paolo 267f5b2972 - Added new directory public/js/apps/LogsViewer/
- Moved public/js/apps/LogsViewer.js to public/js/apps/LogsViewer/
- Added new JS file public/js/apps/LogsViewer/TabulatorSetup.js to setup the tabulator in the LogsViewer app
- Added new property tabulatorEvents to the FilterCmpt to subscribe events for the tabulator
2022-07-14 11:28:06 +02:00
Paolo de07d1f340 Switched FilterCmpt to tabulator 2022-07-13 18:57:55 +02:00
Paolo e433affcc3 - Fixed disappearing side menu when additional menu entries are provided by another component
- Fixed wrong parameter for removeFilterField call
2022-07-13 15:44:00 +02:00
Paolo 4dab69cb15 Reverted changes in application/models/person/Benutzer_model.php, pk => array 2022-07-13 09:45:58 +02:00
Paolo 8b8515ee03 Fixed typo in system/filtersupdate.php 2022-07-12 14:51:39 +02:00
Paolo 137af3ef71 Fixed typo 2022-07-12 14:10:47 +02:00
Paolo ae70dbcb64 Fixed includes of filter type in FilterCmptLib when it is declared in an extension 2022-07-12 14:09:17 +02:00
Paolo f7e057d7db Fixed identation public/js/components/filter/Filter.js 2022-07-12 13:02:16 +02:00
Paolo c400641754 Includes fixes twbs/bootstrap to twbs/bootstrap3 2022-07-12 12:46:19 +02:00
Paolo 6ce7068ead Includes fixes tinymce/tinymce to tinymce/tinymce4 2022-07-12 12:39:48 +02:00
Paolo 790f2bb130 Includes fixes jsoneditor to josdejong/jsoneditor 2022-07-12 12:34:30 +02:00
Paolo 3f07aa172c Includes fixes json-forms to brutusin/json-forms 2022-07-12 12:29:11 +02:00
Paolo 76db7bd53a Includes fixes jquery/jqueryV2 to jquery/jquery2 2022-07-12 12:18:35 +02:00
Paolo a780338367 Includes fixes components/font-awesome to fortawesome/font-awesome4 2022-07-12 12:16:48 +02:00
Paolo 946ccc33d5 Include fixes alvaro-prieto/colResizable to alvaro-prieto/colresizable 2022-07-12 12:11:09 +02:00
Paolo eb2b738133 Includes fixes: jquery/jqueryV1 to jquery/jquery1 2022-07-12 11:59:52 +02:00
Paolo abcb575ef0 Added swith to turn on/off the top menu of the navigation component 2022-07-12 11:02:56 +02:00
Werner Masik 8c8623ce4f change primary key to string instead of array
because it is not a composite key and the load method gets confused otherwise
2022-07-11 17:31:37 +02:00
Harald Bamberger 17322283f5 use searchresult property photo_url 2022-07-11 16:15:48 +02:00
Paolo 5896a75a44 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-07-11 16:11:53 +02:00
Harald Bamberger 26eb77f030 change orgunit renderer to expect array of of objects for leaders 2022-07-11 16:10:28 +02:00
Paolo b53add9e67 libraries/SearchBarLib->_organisationunit removes from the leaders array those elements with uid and name == null 2022-07-11 16:10:24 +02:00
Paolo 198c6baf3d - Added new protected method getPostJSON to FHC_Controller to get POSTed JSON
- application/controllers/components/Filter.php now makes use of getPostJSON from the FHC_Controller
- RESTClient now POST a JSON request
- public/js/components/filter/Filter.js improvements
2022-07-11 14:54:14 +02:00
Paolo cfe7c6b9a4 Fixed typo in application/libraries/FilterCmptLib.php, renamed __getDatasetQueryCondition to _getDatasetQueryCondition 2022-07-11 10:27:49 +02:00
Paolo aac21c9fda Updated composer.lock 2022-07-08 12:33:11 +02:00
Harald Bamberger 9d6d759fd0 current composer.lock for axios zip from github 2022-07-08 12:17:52 +02:00
Paolo 8ab83a0baa Added directory "components" to the extension installation 2022-07-07 17:26:49 +02:00
Paolo 4e201f1002 Added slot in the header of the navigation component 2022-07-07 17:24:18 +02:00
Paolo 2f1d5f157f - Added new constant PHOTO_IMG_URL to application/libraries/SearchBarLib.php
- phone and photo_url are now return from SearchBarLib->_mitarbeiter
- SearchBarLib->_organisationunit fixed correct number of employees per organisation unit
- SearchBarLib->_organisationunit now returns the mailgroup
- SearchBarLib->_organisationunit returns an array of leaders, each element of this array is an object having the properties uid and name
2022-07-07 16:56:43 +02:00
Werner Masik 647b2a9f45 added rudimentary filter for employee search 2022-07-06 18:02:31 +02:00
Werner Masik 39520d32fd added selectRecord event to filter component 2022-07-06 18:02:10 +02:00
Werner Masik f5df010884 added application/components/extensions/ to .gitignore 2022-07-06 17:52:13 +02:00
Werner Masik f7c394547e * fixed missing $primevue3 var in FHC-Common.php 2022-07-06 17:52:13 +02:00
Werner Masik 19273003ee * changed composer.json
* primvue is now included with help of https://asset-packagist.org/
* https://asset-packagist.org/ makes including npm packages with composer easy
2022-07-06 17:52:13 +02:00
Werner Masik 6c618c9a20 * changed some { to [ for PHP 7.4 compatibility
* added some PrimeVUE 3 components to composer (currently used in organization chart of PV21 extension)
2022-07-06 17:52:13 +02:00
Paolo 74b0fc5662 - Added new directory public/js/components/filter/
- Moved component public/js/components/Filter.js to public/js/components/filter/
- Moved API calls from public/js/components/filter/Filter.js to public/js/components/filter/API.js
- public/js/components/filter/Filter.js now imports public/js/components/filter/API.js
2022-07-06 16:59:33 +02:00
ma0068 fe6a6c5da3 neue Funktion getVorgesetzteMonatTimesheet() 2022-07-06 15:24:28 +02:00
Paolo ce9aa4c388 - Removed inlcudes of RESTClient from PHP (FHC-Common, FHC-Footer and views/system/logs/logsViewer)
- Changed RESTClient to be a JS module
- Now RESTClient is included via JS in the app LogsViewer and in component Navigation
- Added new directory public/js/components/navigation
- Moved component Navigation to public/js/components/navigation
- Moved API calls of the Navigation component to public/js/components/navigation/API.js
- Navigation component now imports public/js/components/navigation/API.js
2022-07-06 09:48:15 +02:00
Paolo 2927682dae Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-07-04 19:30:18 +02:00
Paolo 60b3be3d64 - Added new JS public/js/RESTClient.js as axios wrapper
- composer.json: added axios from github
- Added new directory application/components/extensions/
- Added new utility function findResource to application/helpers/hlp_common_helper.php
- Now the library libraries/FilterCmptLib loads the component definition php files from the extensions
- views/system/logs/logsViewer now includes axios and restclient, removed the includes for ajaxlib and jQueryUI
- Added includes for the RESTClient and axios to views/templates/FHC-Common and views/templates/FHC-Footer
- Improved component js/components/Fetch
- Components public/js/components/Filter.js and public/js/components/Navigation.js now they are making use of the Fetch component or/and the RESTClient
2022-07-04 19:25:16 +02:00
Harald Bamberger 5c94e33f24 render array properties correct, resize result on window resize, hide result on loosing focus 2022-07-02 13:26:18 +02:00
ma0068 2e4085c8de Validierung bei Löschen zeitaufzeichnungsrelevanter Zeitsperren und bereits abgeschickter Monatsliste 2022-06-30 14:22:29 +02:00
ma0068 35426251cb Delete Testausgabe 2022-06-30 11:42:14 +02:00
ma0068 cf7ad022a7 Sancho Mail im Urlaubstool, neue Funktion checkActiveAddon 2022-06-30 10:51:02 +02:00
ma0068 60cbb8bd8c Einfügen Spalte Status Monatsliste, Verhindern bei Löschen von ZA wenn Monatsliste abgeschickt 2022-06-29 15:01:16 +02:00
Harald Bamberger 32daed2ad2 first draft data fetch component 2022-06-29 13:17:57 +02:00
Paolo f85225cc4e Addex axios to the views/templates/ includes 2022-06-29 10:58:33 +02:00
Paolo 091307680b - Sorted composer packages in composer.json
- New composer.lock generated
- Added new package axios
2022-06-29 10:57:08 +02:00
Paolo 796c09999f Changed FilterCmptLib public methods to private where they were not used outside the library itself 2022-06-29 10:55:30 +02:00
ma0068 ad30cc862e Neue Spalte Status Monatsliste 2022-06-29 10:53:45 +02:00
ma0068 797cabccb9 neue Mailvorlagen Sancho fuer Zeitausgleich und Urlaub 2022-06-29 08:46:01 +02:00
Paolo bcaa560a46 Bugfix: query executed before changes are applied 2022-06-28 10:29:44 +02:00
Paolo 2a298dc6d1 - Added JSON post parameter check in controllers/components/SearchBar->search
- Expanded search capabilities for organization units and employees
2022-06-27 16:22:40 +02:00
Harald Bamberger 47f7c03075 virtualsplit and searchbar vue component, TestSearch Controller and View for Demonstration, minor change to SearchBar Controller to work with posted json 2022-06-24 19:26:37 +02:00
Paolo 147ab92bae - Added new library libraries/SearchBarLib
- Added new controller components/SearchBar
- Removed not anymore used view application/views/system/logs/logsViewerData.php
2022-06-24 17:59:01 +02:00
Paolo 24b78454d3 - Added new function generateJSModulesInclude to application/helpers/hlp_header_helper.php
- Added entry "customJSModules" to the application/views/templates/FHC-Footer.php to be passed to the generateJSModulesInclude function to generate JS modules tags
- The new VUE components are making use of the JS import and export functionalities
2022-06-24 15:07:50 +02:00
Paolo 9e48ba09d8 - Moved GUI options from application/components/filters/LogsViewer.php to application/views/system/logs/logsViewer.php
- Changed controller components/Filter to work with the new FilterComponent
- Removed unused code from library libraries/FilterCmptLib
- Changed library libraries/FilterCmptLib to work with the new changes in the controller components/Filter
- Added new CSSs for the new FilterComponent and NavigationComponent
2022-06-24 14:55:04 +02:00
ma0068 c87aee0ddf Zeitsperre Umbau Mail auf Sanchomail, Anzeige Zeitsaldo in Sanchomail, Adpatierungen Urlaub 2022-06-24 08:10:51 +02:00
Paolo 618a62425b Adapted composer.json and includes to be compatible to composer version 2 2022-06-07 14:56:33 +02:00
Paolo f3fe3aa099 New changes for the Navigation and Filter components 2022-06-02 10:34:45 +02:00
Paolo 29002124cc - Added new controller components/Filter.php
- Added new library FilterCmptLib
- Fixed includes paths in FHC-Footer and FHC-Header
- Moved the LogsViewer tool to VUE+BS5
2022-06-02 10:32:26 +02:00
Paolo 8880e07bf2 include/dokument_export.class.php now checks the new signature server response structure 2022-05-24 12:22:30 +02:00
Paolo 7f2025c414 Added signature config entries to config/cis.config-default.inc.php 2022-05-24 11:27:24 +02:00
Paolo c354c69e21 Fixed Zwischenabgabe file upload 2022-05-24 11:23:48 +02:00
Paolo 061780a0d2 - Added new VUE based JS public/js/components/Filter.js, public/js/components/Navigation.js and public/js/apps/LogsViewer.js
- Fixed bootstrap includes in FHC-Footer and FHC-Header
- Moved Job Logs Viewer to VUE
2022-05-24 09:45:31 +02:00
Paolo a603081544 - Changed composer.json and updated composer.lock
- Added new PostgreSQL types in application/core/DB_Model.php
- Updated the includes in application/views/*
- Added new view template application/views/templates/FHC-Common.php
- Moved JS includes in application/views/templates/FHC-Footer.php
- Updated JS and CSS includes in application/views/templates/FHC-Footer.php and application/views/templates/FHC-Header.php
- Updated public/js/bootstrapper.js
- Changed global variable names in application/views/templates/FHC-Common.php to include the version of the included source
2022-05-23 18:45:29 +02:00
Paolo 94a1534c14 - Warning Wrap on small Screens in Leturer side
- Perform Signatur Check only on Files from Type Endupload
2022-05-23 14:42:59 +02:00
Paolo 3d0bdcf95a Changed composer.json and updated composer.lock 2022-05-17 16:05:02 +02:00
Paolo 2d23836396 Translated german phrase 2022-05-16 16:23:15 +02:00
Paolo 22bba685ff Added new style to the warning 2022-05-16 16:15:48 +02:00
Paolo d4042228d9 - Better code and comments in application/libraries/SignatureLib->list
- cis/private/lehre/abgabe_lektor_details.php and cis/private/lehre/abgabe_student_details.php check if the uploaded document contains digital signares and display a phrase
- Added new phrase to locale/de-AT/abgabetool.php and locale/en-US/abgabetool.php
2022-05-13 20:11:31 +02:00
Paolo 2a8b61c07f - Added new library application/libraries/SignatureLib.php
- Changed configs for the signature server in config/vilesci.config-default.inc.php
- Changed include/dokument_export.class.php to make use of the new configs
2022-05-11 18:29:10 +02:00
Paolo 704b32c76c Fixed constant values in application/libraries/DocsboxLib.php 2022-05-11 11:06:53 +02:00
ma0068 d2e0f34d9e Reset Defaulstundensatz bei Neuanlage Projektbetreuer 2022-05-07 12:02:51 +02:00
Paolo 58d252b5b7 Added 3rd parameter to Docsbox::convert call were missing 2022-05-06 09:57:55 +02:00
Paolo d7e4d7ebde Moved config entries from application/config/docsbox.php to config/cis.config-default.inc.php and config/vilesci.config-default.inc.php 2022-05-03 10:58:46 +02:00
ma0068 bdee476a74 Adaptierungen Stundensatz: Aktualisierung Anzeige Defaultstundensatz, Zuordnung externe Betreuer 2022-05-02 11:53:14 +02:00
ma0068 b6cc084799 Adaptierung Funktion getLastBisZAPflicht() 2022-04-28 11:46:45 +02:00
ma0068 9bf20dd7a4 neue Funktion: getLastVerwendungZapflicht 2022-04-28 07:54:43 +02:00
ma0068 9dbf59d1a1 Adaptierungen Codesniffer 2022-04-26 12:27:58 +02:00
ma0068 a4378b4592 Add Default Stundensatz 2022-04-26 09:48:22 +02:00
Paolo d3c30af9f7 Merge branch 'master' into feature-15029/Docsbox 2022-04-11 20:14:26 +02:00
ma0068 f94e9a3a15 Update Löschen alter Primary Key pk_tbl_entwicklungsteam_mitarbeiter_uid, studiengang_kz 2022-04-04 09:37:50 +02:00
ma0068 4676a0a7c1 Fix Bug: Übernahme Werte ins Detailfeld 2022-03-31 15:03:35 +02:00
ma0068 f0c40bf449 Adaptierungen Entwicklungsteam UID für FAS 2022-03-31 12:44:45 +02:00
ma0068 6d1c926ec0 Anzeige AllinSaldo in Zeitaufzeichnung 2022-03-29 13:56:00 +02:00
ma0068 f29d838b7c Adaptierungen für checksystem entwicklungteam_id 2022-03-18 13:45:33 +01:00
ma0068 681385946a Adaptierungen Tabelle bis.tbl_entwicklungsteam aufgrund Erweiterung um entwicklungsteam_id 2022-03-17 12:24:18 +01:00
ma0068 67c9c79113 Änderung Klasse Entwicklungsteam auf neuen Key entwicklungsteam_id 2022-03-16 13:02:52 +01:00
ma0068 9c1b6bcd44 Entwicklungsteam: Adpatierungen für Sorierung und Anzeige Mitarbeiter Grid 2022-03-15 09:43:46 +01:00
ma0068 5838e1caa5 neue Funktion getAll für Entwicklungsteam STGV 2022-03-05 12:51:06 +01:00
Paolo e50cc27a89 Fixed exec second parameter value 2022-03-04 20:13:03 +01:00
Paolo db49f2b1e7 - libraries/DocsboxLib:
- Added new constant DEFAULT_FORMAT
	- ERROR and SUCCESS constant values are the same of EXIT_ERROR
	  and EXIT_SUCCESS
	- public method convert parameter format does not have a default
	  value anymore
	- Added use import of ZipArchive
- libraries/DocumentLib: removed unused variables
2022-03-04 19:47:32 +01:00
ma0068 297172113d neue Funktion getAll() für Anzeige Entwicklungsteams 2022-02-10 11:04:31 +01:00
ma0048 4101929cd5 stammkostenstelle anzeigen bei fixangestellten / fallback falls keine eingetragen ist 2021-10-15 12:57:18 +02:00
Paolo 6f14b5cec5 - Changed DocsboxLib->convert, not it accepts a new optional parameter called format
- Integrated the DocsboxLib into the application/libraries/DocumentLib.php
2021-10-14 14:25:35 +02:00
Paolo 2fb4be0e55 - Added new config entry DOCSBOX_ENABLED to config/global.config-default.inc.php
- Added new library application/libraries/DocsboxLib.php to manage document conversion using docsbox
- Added new config file application/config/docsbox.php
- Integrated DocsboxLib into include/dokument_export.class.php
2021-10-14 11:34:27 +02:00
Paolo ab59c265d4 First commit 2021-10-04 14:05:10 +02:00
833 changed files with 78495 additions and 9410 deletions
+1
View File
@@ -24,6 +24,7 @@ application/logs/
application/models/extensions/
application/views/extensions/
application/widgets/extensions/
application/components/extensions/
public/extensions/
@@ -0,0 +1,19 @@
<?php
$filterCmptArray = array(
'app' => 'core',
'datasetName' => 'logs',
//'filterKurzbz' => 'jobs48hours', // REMOVE ME
'query' => '
SELECT wsl.webservicelog_id AS "LogId",
wsl.request_id AS "RequestId",
wsl.execute_time AS "ExecutionTime",
wsl.execute_user AS "ExecutedBy",
wsl.beschreibung AS "Description",
wsl.request_data AS "Data",
wsl.webservicetyp_kurzbz AS "WebserviceType"
FROM system.tbl_webservicelog wsl
ORDER BY wsl.execute_time DESC
',
'requiredPermissions' => 'admin'
);
+14
View File
@@ -0,0 +1,14 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
/**
* NOTE(chris): example:
Events::on('stv_conf_student', function (&$res) {
$res['test'] = [
'title' => 'TEST',
'component' => './Stv/Studentenverwaltung/Details/Notizen.js'
];
});
*/
+9 -5
View File
@@ -6,10 +6,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// Deadline for Application given as Time-Interval after Semesterstart.
$config['interval_blocking_application'] = 'P1M';
// Application submission period given by start- and enddate.
$config['submit_application_start'] = '05.09.2022';
$config['submit_application_end'] = '22.09.2022';
// Lehrveranstaltungen with these grades will be blocked for application
$config['grades_blocking_application'] = array(
5, // nicht genügend
@@ -19,4 +15,12 @@ $config['grades_blocking_application'] = array(
14, // nicht bestanden,
15, // nicht teilgenommen
18 // unentschuldigt
);
);
//Enables Fachbereichsleiter instead of LV Leiter
$config['fbl'] = FALSE;
//Enables Info Mails
$config['send_mail'] = TRUE;
// Display fields to explain equivalence of ECTS and LV-Inhalte
$config['explain_equivalence'] = TRUE;
+29
View File
@@ -0,0 +1,29 @@
<?php
/**
* Copyright (C) 2023 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
// NOTE: if database encryption is _not_ used then leave this array empty!
$config['encryption_passwords'] = array(
// 'password name 1' => 'password 1'
// 'password name 2' => 'password 2'
// 'password name ...' => 'password ...'
// 'password name N' => 'password N'
);
+36
View File
@@ -0,0 +1,36 @@
<?php
/**
* Copyright (C) 2023 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['migratecontract_oe_default'] = 'TODO_OE_DEFAULT';
$config['migratecontract_matching_ba1_vertragsart'] = array(
'101'=>'dvbund',
'102'=>'dvanderengk',
'103'=>'echterdv',
'104'=>'studentischehilfskr',
'105'=>'externerlehrender',
'106'=>'dvanderenbet',
'107'=>'werkvertrag',
'108'=>'studentischehilfskr',
'109'=>'ueberlassungsvertrag',
'110'=>'echterfreier',
'111'=>'echterdv' //All-In
);
+63 -20
View File
@@ -15,7 +15,7 @@ $config['navigation_header'] = array(
'description' => 'Organisation',
'sort' => 20,
'requiredPermissions' => 'basis/vilesci:r',
'children'=> array(
'children' => array(
'vilesci' => array(
'link' => base_url('vilesci'),
'icon' => '',
@@ -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'
)
)
),
@@ -40,7 +48,7 @@ $config['navigation_header'] = array(
'description' => 'Lehre',
'sort' => 30,
'requiredPermissions' => 'basis/vilesci:r',
'children'=> array(
'children' => array(
'cis' => array(
'link' => CIS_ROOT,
'icon' => '',
@@ -71,16 +79,16 @@ $config['navigation_header'] = array(
'lehre/lehrauftrag_erteilen:r'
)
),
'zverfueg' => array(
'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'),
'description' => 'Zeitverf&uuml;gbarkeit',
'expand' => true,
'sort' => 45,
'requiredPermissions' => array(
'lehre/zeitverfuegbarkeit:rw',
'lehre/zeitverfuegbarkeit:rw'
)
),
'zverfueg' => array(
'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'),
'description' => 'Zeitverf&uuml;gbarkeit',
'expand' => true,
'sort' => 45,
'requiredPermissions' => array(
'lehre/zeitverfuegbarkeit:rw',
'lehre/zeitverfuegbarkeit:rw'
)
),
'zgvueberpruefung' => array(
'link' => site_url('system/infocenter/ZGVUeberpruefung'),
'description' => 'ZGV Überprüfung',
@@ -98,7 +106,7 @@ $config['navigation_header'] = array(
'description' => 'Personen',
'sort' => 40,
'requiredPermissions' => 'basis/vilesci:r',
'children'=> array(
'children' => array(
'messages' => array(
'link' => site_url('system/messages/MessageClient/read'),
'icon' => '',
@@ -120,11 +128,18 @@ $config['navigation_header'] = array(
'sort' => 30,
'requiredPermissions' => 'system/issues_verwalten:r'
),
'plausichecks' => array(
'link' => site_url('system/issues/Plausichecks'),
'description' => 'Plausichecks',
'expand' => true,
'sort' => 40,
'requiredPermissions' => 'system/issues_verwalten:r'
),
'gruppenmanagement' => array(
'link' => site_url('person/Gruppenmanagement'),
'description' => 'Gruppenmanagement',
'expand' => true,
'sort' => 40,
'sort' => 50,
'requiredPermissions' => 'lehre/gruppenmanager:r'
)
)
@@ -136,7 +151,7 @@ $config['navigation_header'] = array(
'expand' => false,
'sort' => 50,
'requiredPermissions' => 'admin:r',
'children'=> array(
'children' => array(
'extensions' => array(
'link' => site_url('system/extensions/Manager'),
'description' => 'Extensions Manager',
@@ -157,7 +172,14 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 20,
'requiredPermissions' => 'system/developer:r'
)
),
'anrechnungen' => array(
'link' => site_url('lehre/anrechnung/AdminAnrechnung'),
'description' => 'Anrechnungen',
'expand' => true,
'sort' => 30,
'requiredPermissions' => 'lehre/anrechnungszeitfenster:rw'
)
)
)
)
@@ -177,6 +199,15 @@ $config['navigation_menu']['Vilesci/index'] = array(
)
);
$config['navigation_menu']['Vilesci/index'] = array(
'dashboard' => array(
'link' => '#',
'description' => 'Dashboard',
'icon' => 'dashboard',
'sort' => 1
)
);
$config['navigation_menu']['organisation/Reihungstest/index'] = array(
'reihungstestverwalung' => array(
'link' => base_url('vilesci/stammdaten/reihungstestverwaltung.php'),
@@ -201,7 +232,8 @@ $config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array(
'icon' => 'dashboard',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r')
),'lehrauftragBestellen' => array(
),
'lehrauftragBestellen' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag'),
'description' => 'Lehrauftrag bestellen',
'icon' => '',
@@ -223,6 +255,7 @@ $config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array(
'requiredPermissions' => array('lehre/lehrauftrag_erteilen:r')
)
);
$config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
'lehrauftragDashboard' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
@@ -230,7 +263,8 @@ $config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
'icon' => 'dashboard',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r')
),'lehrauftragBestellen' => array(
),
'lehrauftragBestellen' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag'),
'description' => 'Lehrauftrag bestellen',
'icon' => '',
@@ -257,9 +291,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'fehlerzustaendigkeiten' => array(
'link' => site_url('system/issues/IssuesZustaendigkeiten'),
'description' => 'Fehler Zuständigkeiten',
'icon' => 'cogs',
'icon' => 'users',
'sort' => 100,
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
)
),
'fehlerkonfiguration' => array(
'link' => site_url('system/issues/IssuesKonfiguration'),
'description' => 'Fehler Konfiguration',
'icon' => 'cogs',
'sort' => 200,
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
),
);
+23
View File
@@ -60,3 +60,26 @@ $route['api/v1/organisation/[G|g]eschaeftsjahr/(:any)'] = 'api/v1/organisation/g
$route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisation/organisationseinheit2/$1';
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1';
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
// load routes from extensions
$subdir = 'application/config/extensions';
$dirlist = scandir($subdir);
if ($dirlist)
{
$files = array_diff($dirlist, array('.','..'));
foreach ($files as &$item)
{
if (is_dir($subdir . DIRECTORY_SEPARATOR . $item))
{
$routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php';
if (file_exists($routes_file))
{
require($routes_file);
}
}
}
}
+170
View File
@@ -0,0 +1,170 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$config['frist_rueckzahlung_studiengebuer_WS'] = '15.10.';
$config['frist_rueckzahlung_studiengebuer_SS'] = '15.03.';
// TODO(chris): review this!
#$config['unterbrechung_dms'] = ['oe_kurzbz' => null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => null];
$config['unterbrechung_dms'] = ['oe_kurzbz' => null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => 'Akte'];
/**
* UPLOAD
*/
/**
* Allowed filetypes for attachment upload in unterbrechung antrag
*
* @var array An array of fileextensions
*/
$config['unterbrechung_dms_filetypes'] = ['jpg', 'pdf'];
/**
* GRADES
*/
/**
* On wiederholung the student must repeat certain lvs.
* This lvs will be graded with this id
*
* @var integer tbl_note.note
*/
$config['wiederholung_note_angerechnet'] = 19;
/**
* On wiederholung the student can not attend certain lvs.
* Those lvs will be graded with this id
*
* @var integer tbl_note.note
*/
$config['wiederholung_note_nicht_zugelassen'] = 20;
/**
* JOBS
*/
/**
* The Job will remind for every Unterbrecher who has a
* wiedereinstieg_datum between the date the Job is run
* and the modified date
* e.g.: If the Job is running on 2023-04-20 and the modifier
* is '+3 days' it will remind of everyone that
* has a wiedereinstiegs_datum between 2023-04-20 and 2023-04-23
*
* @var string A string formated as PHP DateTime modifier
* @see https://www.php.net/manual/de/datetime.modify.php
*/
$config['unterbrechung_job_remind_wiedereinstieg_date_modifier'] = '+3 days';
/**
* The Job will sent a request to everyone who faild the 3rd committee exam
* and respecting the given conditions (not repeated yet, stg not in blacklist)
* to decide if he/she will repeat or not
*
* First request
*
* @var string A string formated as PHP DateTime modifier
* @see https://www.php.net/manual/de/datetime.modify.php
*/
$config['wiederholung_job_request_1_date_modifier'] = '+0 days';
/**
* Second request
*
* @var string A string formated as PHP DateTime modifier
* @see https://www.php.net/manual/de/datetime.modify.php
*/
$config['wiederholung_job_request_2_date_modifier'] = '+3 weeks';
/**
* Final deadline - after this the student will be abgemeldet if he hasn't chosen yet
*
* @var string A string formated as PHP DateTime modifier
* @see https://www.php.net/manual/de/datetime.modify.php
*/
$config['wiederholung_job_deadline_date_modifier'] = '+1 month';
/**
* before this exam dates for Wiederholer will be ignored
*
* @var string A string formated as Date
*
*/
$config['digitalization_start'] = '2022-07-01';
/**
* Objection period - the student will be abgemeldet if he hasn't objected in this period
*
* @var string A string formated as PHP DateTime modifier
* @see https://www.php.net/manual/de/datetime.modify.php
*/
$config['abmeldung_job_deadline_date_modifier'] = '+2 weeks';
/**
* System User - uid of a user that is allowed to set prestudentstatus
*
* @var string
*/
$config['antrag_job_systemuser'] = '';
/**
* WHITELISTS
*/
/**
* List of stati who entitle a prestudent to create an Antrag
*
* @var array Array of tbl_status.status_kurzbz's
*/
$config['antrag_prestudentstatus_whitelist'] = ['Student', 'Diplomand'];
$config['antrag_prestudentstatus_whitelist_abmeldung'] = ['Student', 'Diplomand', 'Unterbrecher'];
/**
* BLACKLISTS
*/
/**
* List of Statusgründe that prevent a prestudent from create an Wiederholungsantrag
*
* @var array An array of tbl_status_grund.statusgrund_id's
*/
$config['status_gruende_wiederholer'] = [16, 15];
/**
* Blacklisted for abmeldung anträge
*
* @var array An array of tbl_studiengang.studiengang_kz's
*/
$config['stgkz_blacklist_abmeldung'] = [];
/**
* Blacklisted for unterbrechung anträge
*
* @var array An array of tbl_studiengang.studiengang_kz's
*/
$config['stgkz_blacklist_unterbrechung'] = [];
/**
* Blacklisted for wiederholung anträge
*
* @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'] = [];
+16
View File
@@ -0,0 +1,16 @@
<?php
if ( !defined("PHPUNIT_TEST") ) {
show_404();
}
class Test extends CI_Controller
{
public function index()
{
// Yep... This is all we need.
ini_set('error_reporting', E_ALL); // or error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
}
}
@@ -0,0 +1,163 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (FAS) and the AntragLib (back-end)
* This controller works with calls on the HTTP GET or POST and the output is always RDF
*/
class Wiederholung extends Auth_Controller
{
/**
* Calls the parent's constructor and loads the FilterCmptLib
*/
public function __construct()
{
parent::__construct([
'getLvs' => ['student/studierendenantrag:r', 'student/noten:r'],
'moveLvsToZeugnis' => ['student/studierendenantrag:w', 'student/noten:w']
]);
// Libraries
$this->load->library('AntragLib');
// Load language phrases
$this->loadPhrases([
'global',
'studierendenantrag'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getLvs($prestudent_id)
{
// header für no cache
$this->output->set_header("Cache-Control: no-cache");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
$this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
$this->output->set_header("Pragma: no-cache");
$this->output->set_header("Content-type: application/xhtml+xml");
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$sem_akt = $this->variablelib->getVar('semester_aktuell');
$result = $this->antraglib->getLvsForPrestudent($prestudent_id, $sem_akt);
if (isError($result))
return $result;
$lvs = $result->retval;
$rdf_url = 'http://www.technikum-wien.at/antragnote';
$this->load->view('lehre/Antrag/Wiederholung/getLvs.rdf.php', [
'url' => $rdf_url,
'lvs' => $lvs
]);
}
public function moveLvsToZeugnis()
{
$anzahl = $this->input->post('anzahl');
$student_uid = $this->input->post('student_uid');
$this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$errormsg = array();
for($i=0; $i<$anzahl; $i++)
{
$id = $this->input->post('studierendenantrag_lehrveranstaltung_id_' . $i);
$result =$this->StudierendenantraglehrveranstaltungModel->load($id);
if(isError($result))
{
$errormsg[] = getError($result);
}
elseif(!hasData($result))
{
$errormsg[] = $this->p->t('studierendenantrag', 'error_no_lv_in_application');
}
else
{
$antragLv = getData($result)[0];
$result= $this->ZeugnisnoteModel->load([
'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
'student_uid'=> $student_uid,
'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz
]);
if(isError($result))
{
$errormsg[] = getError($result);
}
else
{
if (hasData($result))
{
$result = $this->ZeugnisnoteModel->update(
[
'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
'student_uid'=> $student_uid,
'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz
],
[
'note'=> $antragLv->note,
'uebernahmedatum' => date('c'),
'benotungsdatum' => $antragLv->insertamum,
'updateamum' => date('c'),
'bemerkung'=>$antragLv->anmerkung,
'updatevon'=>getAuthUID()
]
);
}
else
{
$result = $this->ZeugnisnoteModel->insert([
'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
'student_uid'=> $student_uid,
'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz,
'note'=> $antragLv->note,
'uebernahmedatum' => date('c'),
'benotungsdatum' => $antragLv->insertamum,
'insertamum' => date('c'),
'bemerkung'=>$antragLv->anmerkung,
'insertvon'=>getAuthUID()
]);
}
if(isError($result))
{
$errormsg[] = getError($result);
}
}
}
}
if($errormsg)
$return = false;
else
$return = true;
$this->load->view('lehre/Antrag/Wiederholung/moveLvs.rdf.php', [
'return' => $return,
'errormsg' => $errormsg
]);
}
}
@@ -0,0 +1,231 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the FilterCmptLib (back-end)
* Provides data to the ajax get calls about the filter component
* Listens to ajax post calls to change the filter data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Filter extends FHCAPI_Controller
{
const FILTER_UNIQUE_ID = 'filterUniqueId'; // Name of the filter cmpt unique id (mandatory)
const FILTER_TYPE = 'filterType'; // The filter type (PHP filter definition) used (mandatory)
const FILTER_ID = 'filterId'; // The id of the used filter (optional)
/**
* Calls the parent's constructor and loads the FilterCmptLib
*/
public function __construct()
{
// NOTE: FilterCmpt has its own permissions checks
parent::__construct([
'getFilter' => self::PERM_LOGGED,
'removeFilterField' => self::PERM_LOGGED,
'addFilterField' => self::PERM_LOGGED,
'applyFilterFields' => self::PERM_LOGGED,
'removeCustomFilter' => self::PERM_LOGGED,
'saveCustomFilter' => self::PERM_LOGGED,
'reloadDataset' => self::PERM_LOGGED
]);
// Loads the FiltersModel
$this->load->model('system/Filters_model', 'FiltersModel');
// Loads the FilterCmptLib with HTTP GET/POST parameters
$this->_startFilterCmptLib();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves data about the current filter from the session and will be written on the output in JSON format
*/
public function getFilter()
{
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$session = $this->filtercmptlib->getSession();
if (is_object($session)) {
// If stdClass it is an retval object
$session = $this->getDataOrTerminateWithError($session);
}
$this->terminateWithSuccess($session);
}
/**
* Remove an applied filter (SQL where condition) from the current filter
*/
public function removeFilterField()
{
$this->form_validation->set_rules('filterField', 'filterField', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->filtercmptlib->removeFilterField($this->input->post('filterField'));
if (!$result)
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess('Field removed');
}
/**
* Add a filter (SQL where clause) to be applied to the current filter
*/
public function addFilterField()
{
$this->form_validation->set_rules('filterField', 'filterField', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->filtercmptlib->addFilterField($this->input->post('filterField'));
if (!$result)
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess('Field added');
}
/**
* Apply the filter changes
*/
public function applyFilterFields()
{
$this->form_validation->set_rules('filterFields', 'filterFields', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->filtercmptlib->applyFilterFields($this->input->post('filterFields'));
if (!$result)
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess('Applied');
}
/**
* Save the current filter as a custom filter for this user with the given description
*/
public function saveCustomFilter()
{
$this->form_validation->set_rules('customFilterName', 'customFilterName', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->filtercmptlib->saveCustomFilter($this->input->post('customFilterName'));
if (!$result)
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess('Saved');
}
/**
* Remove a custom filter by its filterId
*/
public function removeCustomFilter()
{
$this->form_validation->set_rules('filterId', 'filterId', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->filtercmptlib->removeCustomFilter($this->input->post('filterId'));
if (!$result)
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess('Removed');
}
/**
* Reloads the dataset
*/
public function reloadDataset()
{
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$this->filtercmptlib->reloadDataset();
$this->terminateWithSuccess('Success');
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Loads the FilterCmptLib with the FILTER_UNIQUE_ID parameter
* If the parameter FILTER_UNIQUE_ID is not given then the execution of the controller is terminated and
* an error message is printed
*/
private function _startFilterCmptLib()
{
$filterUniqueId = null;
$filterType = null;
$filterId = null;
$validations = [
[
'field' => self::FILTER_UNIQUE_ID,
'label' => self::FILTER_UNIQUE_ID,
'rules' => 'required'
],
[
'field' => self::FILTER_TYPE,
'label' => self::FILTER_TYPE,
'rules' => 'required'
],
];
$this->load->library('form_validation');
if ($this->input->method() == 'get')
$this->form_validation->set_data($this->input->get());
$this->form_validation->set_rules($validations);
if ($this->form_validation->run()) {
$filterUniqueId = $this->input->post_get(self::FILTER_UNIQUE_ID);
$filterType = $this->input->post_get(self::FILTER_TYPE);
$filterId = $this->input->post_get(self::FILTER_ID);
// Loads the FilterCmptLib that contains all the used logic
$this->load->library(
'FilterCmptLib',
array(
'filterUniqueId' => $filterUniqueId,
'filterType' => $filterType,
'filterId' => $filterId
)
);
// Start the component
$this->filtercmptlib->start();
}
}
}
@@ -0,0 +1,101 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the NavigationLib (back-end)
* Provides data to the ajax get calls about the filter
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Navigation extends FHCAPI_Controller
{
const NAVIGATION_PAGE_PARAM = 'navigation_page'; // Navigation page parameter name
/**
* Loads the NavigationLib where the used logic lies
*/
public function __construct()
{
parent::__construct([
'menu' => self::PERM_LOGGED,
'header' => self::PERM_LOGGED
]);
$this->_loadNavigationLib(); // Loads the NavigationLib with parameters
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* This function creates the left Menu for each Page
* @param NAVIGATION_PAGE_PARAM GET Parameter witch holds the currently called Page
* @return JSON object with the Menu Entries
*/
public function menu()
{
$menuArray = $this->navigationlib->getMenuArray($this->input->get(self::NAVIGATION_PAGE_PARAM));
$this->terminateWithSuccess($menuArray);
}
/**
* This function creates the Top Menu for each Page
* @param NAVIGATION_PAGE_PARAM GET Parameter witch holds the currently called Page
* @return JSON object with the Menu Entries
*/
public function header()
{
$headerArray = $this->navigationlib->getHeaderArray($this->input->get(self::NAVIGATION_PAGE_PARAM));
$this->terminateWithSuccess($headerArray);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Loads the NavigationLib with the NAVIGATION_PAGE_PARAM parameter
* If the parameter NAVIGATION_PAGE_PARAM is not given then the execution of the controller is terminated and
* an error message is printed
*/
private function _loadNavigationLib()
{
// If the parameter NAVIGATION_PAGE_PARAM is present in the HTTP GET or POST
if (isset($_GET[self::NAVIGATION_PAGE_PARAM]) || isset($_POST[self::NAVIGATION_PAGE_PARAM]))
{
// If it is present in the HTTP GET
if (isset($_GET[self::NAVIGATION_PAGE_PARAM]))
{
$navigationPage = $this->input->get(self::NAVIGATION_PAGE_PARAM); // is retrieved from the HTTP GET
}
elseif (isset($_POST[self::NAVIGATION_PAGE_PARAM])) // Else if it is present in the HTTP POST
{
$navigationPage = $this->input->post(self::NAVIGATION_PAGE_PARAM); // is retrieved from the HTTP POST
}
// Loads the NavigationLib that contains all the used logic
$this->load->library('NavigationLib', array(self::NAVIGATION_PAGE_PARAM => $navigationPage));
}
else // Otherwise an error will be written in the output
{
show_error('Parameter "' . self::NAVIGATION_PAGE_PARAM . '" not provided!');
}
}
}
@@ -0,0 +1,46 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the PhrasesLib (back-end)
* Provides data to the ajax get calls about the Phrasen plugin
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Phrasen extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'loadModule' => self::PERM_ANONYMOUS
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @param string $module
*/
public function loadModule($module)
{
$this->load->library('PhrasesLib', [$module], 'pj');
$this->terminateWithSuccess(json_decode($this->pj->getJSON()));
}
}
@@ -0,0 +1,69 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
* Provides data to the ajax get calls about the searchbar component
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Searchbar extends FHCAPI_Controller
{
const SEARCHSTR_PARAM = 'searchstr';
const TYPES_PARAM = 'types';
/**
* Object initialization
*/
public function __construct()
{
// NOTE(chris): additional permission checks will be done in SearchBarLib
parent::__construct([
'search' => self::PERM_LOGGED
]);
// Load the library SearchBarLib
$this->load->library('SearchBarLib');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function search()
{
$this->load->library('form_validation');
// Checks if the searchstr and the types parameters are in the POSTed JSON
$this->form_validation->set_rules(self::SEARCHSTR_PARAM, null, 'required');
$this->form_validation->set_rules(self::TYPES_PARAM . '[]', null, 'required');
if (!$this->form_validation->run())
$this->terminateWithError(SearchBarLib::ERROR_WRONG_JSON, self::ERROR_TYPE_GENERAL);
// Convert to json the result from searchbarlib->search
$result = $this->searchbarlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM));
if (property_exists($result, 'error'))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess($result);
}
}
@@ -0,0 +1,387 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class BetriebsmittelP extends FHCAPI_Controller
{
private $person_id = null;
public function __construct()
{
parent::__construct([
'getAllBetriebsmittel' => ['admin:r', 'assistenz:r'],
'addNewBetriebsmittel' => self::PERM_LOGGED,
'updateBetriebsmittel' => self::PERM_LOGGED,
'loadBetriebsmittel' => ['admin:r', 'assistenz:r'],
'deleteBetriebsmittel' => self::PERM_LOGGED,
'getTypenBetriebsmittel' => ['admin:r', 'assistenz:r'],
'loadInventarliste' => ['admin:r', 'assistenz:r']
]);
//Load Models
$this->load->model('ressource/Betriebsmittel_model', 'BetriebsmittelModel');
$this->load->model('ressource/Betriebsmittelperson_model', 'BetriebsmittelpersonModel');
// Additional Permission Checks
if ($this->router->method == 'addNewBetriebsmittel') {
$this->person_id = current(array_slice($this->uri->rsegments, 2));
$this->checkPermissionsForPerson(
$this->person_id,
['admin:rw', 'mitarbeiter:rw', 'basis/betriebsmittel:rw'],
['admin:rw', 'assistenz:rw', 'basis/betriebsmittel:rw']
);
} elseif ($this->router->method == 'updateBetriebsmittel' || $this->router->method == 'deleteBetriebsmittel') {
$betriebsmittelperson_id = current(array_slice($this->uri->rsegments, 2));
$result = $this->BetriebsmittelpersonModel->load($betriebsmittelperson_id);
if (!hasData($result))
show_404();
$this->person_id = current(getData($result))->person_id;
$this->checkPermissionsForPerson(
$this->person_id,
['admin:rw', 'mitarbeiter:rw', 'basis/betriebsmittel:rw'],
['admin:rw', 'assistenz:rw', 'basis/betriebsmittel:rw']
);
}
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'wawi'
]);
}
public function getAllBetriebsmittel($type_id, $id)
{
$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($id, $type_id);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
protected function validateNewOrUpdate()
{
$this->form_validation->set_rules('betriebsmitteltyp', 'Typ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired')
]);
$this->form_validation->set_rules('kaution', 'Kaution', 'numeric|less_than_equal_to[9999.99]', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric')
]);
$this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required|is_valid_date', [
'required' => $this->p->t('ui', 'error_fieldRequired')
]);
if ($this->input->post('ausgegebenam') && $this->input->post('retouram')) {
$this->form_validation->set_rules('retouram', 'Retour am', [
'is_valid_date',
['is_not_before_ausgegebenam', function ($value) {
return (new DateTime($value) >= new DateTime($this->input->post('ausgegebenam')));
}]
], [
'is_not_before_ausgegebenam' => $this->p->t('wawi', 'error_retourdatumVorAusgabe')
]);
} else {
$this->form_validation->set_rules('retouram', 'Retour am', 'is_valid_date');
}
$this->form_validation->set_rules('anmerkung', 'Anmerkung', 'max_length[256]');
if ($this->input->post('betriebsmitteltyp') == 'Inventar') {
// Inventar
$this->form_validation->set_rules('betriebsmittel_id', 'Inventarnummer', 'required');
} elseif ($this->input->post('betriebsmitteltyp') == 'Zutrittskarte') {
// Zutrittskarte
if ($this->input->post('nummer') === null && $this->input->post('nummer') === null) {
$this->form_validation->set_rules('nummer', 'Nummer', 'required', [
'required' => $this->p->t('wawi', 'error_zutrittskarteOhneNummer')
]);
$this->form_validation->set_rules('nummer2', 'Nummer2', 'required', [
'required' => $this->p->t('wawi', 'error_zutrittskarteOhneNummer')
]);
} else {
if ($this->input->post('nummer') === null) {
$result = $this->BetriebsmittelpersonModel->loadViewWhere([
'betriebsmitteltyp' => $this->input->post('betriebsmitteltyp'),
'nummer2' => $this->input->post('nummer2'),
'person_id !=' => $this->person_id,
'retouram IS NULL' => null
]);
if (hasData($result))
$this->form_validation->set_rules('nummer2', 'Nummer2', 'is_array', [
'is_array' => $this->p->t('wawi', 'error_bmZutrittskarteOccupied', (array)current(getData($result)))
]);
} else {
$result = $this->BetriebsmittelpersonModel->loadViewWhere([
'betriebsmitteltyp' => $this->input->post('betriebsmitteltyp'),
'nummer' => $this->input->post('nummer'),
'person_id !=' => $this->person_id,
'retouram IS NULL' => null
]);
if (hasData($result))
$this->form_validation->set_rules('nummer', 'Nummer', 'is_array', [
'is_array' => $this->p->t('wawi', 'error_bmZutrittskarteOccupied', (array)current(getData($result)))
]);
}
}
}
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
public function addNewBetriebsmittel($person_id)
{
$this->form_validation->set_rules('uid', 'UID', [
['uid_in_person', function ($value) use ($person_id) {
if ($value === null)
return true;
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere([
'uid' => $value,
'person_id' => $person_id
]);
return hasData($result);
}]
], [
'uid_in_person' => $this->p->t('person', 'error_uidNotInPerson')
]);
$this->validateNewOrUpdate();
$betriebsmitteltyp = $this->input->post('betriebsmitteltyp');
$nummer = $this->input->post('nummer');
$nummer2 = $this->input->post('nummer2');
$beschreibung = $this->input->post('beschreibung');
$betriebsmittel_id = $this->input->post('betriebsmittel_id');
$anmerkung = $this->input->post('anmerkung');
$kaution = $this->input->post('kaution');
$ausgegebenam = $this->input->post('ausgegebenam');
$retouram = $this->input->post('retouram');
$uid = $this->input->post('uid');
// NOTE(chris): transform_kartennummer
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
$nummer = is_numeric($nummer) ? ltrim($nummer, "0") : hexdec(implode("", array_reverse(str_split(trim($nummer)))));
$this->db->trans_start();
if ($betriebsmitteltyp != 'Inventar') {
$this->BetriebsmittelModel->addOrder('updateamum', 'DESC');
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer === null) {
$result = $this->BetriebsmittelModel->loadWhere([
'betriebsmitteltyp' => $betriebsmitteltyp,
'nummer2' => $nummer2
]);
} else {
$result = $this->BetriebsmittelModel->loadWhere([
'betriebsmitteltyp' => $betriebsmitteltyp,
'nummer' => $nummer
]);
}
$data = $this->getDataOrTerminateWithError($result);
if ($data) {
$data = current($data);
if ($data->nummer !== $nummer || $data->nummer2 !== $nummer2 || $data->beschreibung !== $beschreibung) {
$result = $this->BetriebsmittelModel->update($data->betriebsmittel_id, [
'nummer' => $nummer,
'nummer2' => $nummer2,
'beschreibung' => $beschreibung,
'updateamum' => date('c'),
'updatevon' => getAuthUID()
]);
$this->getDataOrTerminateWithError($result);
}
$betriebsmittel_id = $data->betriebsmittel_id;
} else {
$result = $this->BetriebsmittelModel->insert([
'betriebsmitteltyp' => $betriebsmitteltyp,
'nummer' => $nummer,
'nummer2' => $nummer2,
'beschreibung' => $beschreibung,
'reservieren' => false,
'ort_kurzbz' => null,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
]);
$betriebsmittel_id = $this->getDataOrTerminateWithError($result);
}
}
$result = $this->BetriebsmittelpersonModel->insert([
'person_id' => $person_id,
'betriebsmittel_id' => $betriebsmittel_id,
'anmerkung' => $anmerkung,
'kaution' => $kaution,
'ausgegebenam' => $ausgegebenam,
'retouram' => $retouram,
'uid' => $uid,
'insertamum' => date('c'),
'insertvon' => getAuthUID()
]);
$data = $this->getDataOrTerminateWithError($result);
$this->db->trans_complete();
$this->terminateWithSuccess(true);
}
public function updateBetriebsmittel($betriebsmittelperson_id)
{
$this->validateNewOrUpdate();
$betriebsmitteltyp = $this->input->post('betriebsmitteltyp');
$nummer = $this->input->post('nummer');
$nummer2 = $this->input->post('nummer2');
$beschreibung = $this->input->post('beschreibung');
$betriebsmittel_id = $this->input->post('betriebsmittel_id');
$anmerkung = $this->input->post('anmerkung');
$kaution = $this->input->post('kaution');
$ausgegebenam = $this->input->post('ausgegebenam');
$retouram = $this->input->post('retouram');
// NOTE(chris): transform_kartennummer
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
$nummer = is_numeric($nummer) ? ltrim($nummer, "0") : hexdec(implode("", array_reverse(str_split(trim($nummer)))));
$this->db->trans_start();
if ($betriebsmitteltyp != 'Inventar') {
$found = false;
if ($nummer !== null && $betriebsmittel_id !== null) {
$result = $this->BetriebsmittelModel->load($betriebsmittel_id);
$data = $this->getDataOrTerminateWithError($result);
if ($data && current($data)->nummer == $nummer) {
$found = true;
}
}
if (!$found) {
$this->BetriebsmittelModel->addOrder('updateamum', 'DESC');
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer === null) {
$result = $this->BetriebsmittelModel->loadWhere([
'betriebsmitteltyp' => $betriebsmitteltyp,
'nummer2' => $nummer2
]);
} else {
$result = $this->BetriebsmittelModel->loadWhere([
'betriebsmitteltyp' => $betriebsmitteltyp,
'nummer' => $nummer
]);
}
$data = $this->getDataOrTerminateWithError($result);
}
if ($data) {
$data = current($data);
if ($data->nummer !== $nummer || $data->nummer2 !== $nummer2 || $data->beschreibung !== $beschreibung) {
$result = $this->BetriebsmittelModel->update($data->betriebsmittel_id, [
'nummer' => $nummer,
'nummer2' => $nummer2,
'beschreibung' => $beschreibung,
'updateamum' => date('c'),
'updatevon' => getAuthUID()
]);
$this->getDataOrTerminateWithError($result);
}
$betriebsmittel_id = $data->betriebsmittel_id;
} else {
$result = $this->BetriebsmittelModel->insert([
'betriebsmitteltyp' => $betriebsmitteltyp,
'nummer' => $nummer,
'nummer2' => $nummer2,
'beschreibung' => $beschreibung,
'reservieren' => false,
'ort_kurzbz' => null,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
]);
$betriebsmittel_id = $this->getDataOrTerminateWithError($result);
}
}
$result = $this->BetriebsmittelpersonModel->update($betriebsmittelperson_id, [
'betriebsmittel_id' => $betriebsmittel_id,
'anmerkung' => $anmerkung,
'kaution' => $kaution,
'ausgegebenam' => $ausgegebenam,
'retouram' => $retouram,
'updateamum' => date('c'),
'updatevon' => getAuthUID()
]);
$data = $this->getDataOrTerminateWithError($result);
$this->db->trans_complete();
$this->terminateWithSuccess(true);
}
public function loadBetriebsmittel($betriebsmittelperson_id)
{
$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($betriebsmittelperson_id, 'betriebsmittelperson_id');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (!hasData($result)) {
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(current(getData($result)));
}
public function deleteBetriebsmittel($betriebsmittelperson_id)
{
$result = $this->BetriebsmittelpersonModel->delete(
array('betriebsmittelperson_id' => $betriebsmittelperson_id,
)
);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (!hasData($result)) {
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(current(getData($result)));
}
public function getTypenBetriebsmittel()
{
$this->load->model('ressource/Betriebsmitteltyp_model', 'BetriebsmitteltypModel');
$this->BetriebsmitteltypModel->addOrder('beschreibung', 'ASC');
$result = $this->BetriebsmitteltypModel->load(); // load All
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function loadInventarliste($searchString)
{
$result = $this->BetriebsmittelModel->loadInventarliste($searchString);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,187 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \REST_Controller as REST_Controller;
use \Studierendenantrag_model as Studierendenantrag_model;
/**
* This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Abmeldung extends FHCAPI_Controller
{
/**
* Calls the parent's constructor and loads the AntragLib
*/
public function __construct()
{
parent::__construct([
'getDetailsForNewAntrag' => self::PERM_LOGGED,
'getDetailsForAntrag' => self::PERM_LOGGED,
'createAntrag' => self::PERM_LOGGED,
'cancelAntrag' => self::PERM_LOGGED
]);
// Libraries
$this->load->library('AntragLib');
// Load language phrases
$this->loadPhrases([
'studierendenantrag'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves data of the current studiengang for the current user
*/
public function getDetailsForNewAntrag($prestudent_id)
{
if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, true))
$this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
$result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
if (!$result) {
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_no_student'),
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
} elseif ($result == -3) {
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_stg_blacklist'),
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
} elseif ($result == -1) {
$result = $this->antraglib->getDetailsForLastAntrag(
$prestudent_id,
[
Studierendenantrag_model::TYP_ABMELDUNG,
Studierendenantrag_model::TYP_ABMELDUNG_STGL
]
);
$data = $this->getDataOrTerminateWithError($result);
$data->canCancel = (
$data->status == Studierendenantragstatus_model::STATUS_CREATED &&
$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id)
);
$this->terminateWithSuccess($data);
}
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getDetailsForAntrag($studierendenantrag_id)
{
if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id))
return show_404();
$result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id);
$data = $this->getDataOrTerminateWithError($result);
if ($data->typ !== Studierendenantrag_model::TYP_ABMELDUNG_STGL && $data->typ !== Studierendenantrag_model::TYP_ABMELDUNG)
return show_404();
$data->canCancel = (
$data->status == Studierendenantragstatus_model::STATUS_CREATED &&
$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id)
);
$this->terminateWithSuccess($data);
}
public function createAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
$this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
$this->form_validation->set_rules('grund', 'Grund', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$grund = $this->input->post('grund');
$studiensemester = $this->input->post('studiensemester');
$prestudent_id = $this->input->post('prestudent_id');
$result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
if (!$result)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
elseif ($result == -3)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_stg_blacklist'), self::ERROR_TYPE_GENERAL);
elseif ($result < 0)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_exists'), self::ERROR_TYPE_GENERAL);
$result = $this->antraglib->createAbmeldung($prestudent_id, $studiensemester, getAuthUID(), $grund);
$data = $this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getDetailsForAntrag($data);
if (!hasData($result))
return $this->terminateWithSuccess(true);
$data = getData($result);
$data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id);
$this->terminateWithSuccess($data);
}
public function cancelAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$antrag_id = $this->input->post('antrag_id');
if (!$this->antraglib->isEntitledToCancelAntrag($antrag_id))
$this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
$result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
if (!hasData($result))
$this->terminateWithSuccess($antrag_id);
$data = getData($result);
$this->terminateWithSuccess($data);
}
}
@@ -0,0 +1,428 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
use \Studierendenantrag_model as Studierendenantrag_model;
/**
* This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Leitung extends FHCAPI_Controller
{
/**
* Calls the parent's constructor and loads the AntragLib
*/
public function __construct()
{
parent::__construct([
'getActiveStgs' => ['student/antragfreigabe:r', 'student/studierendenantrag:r'],
'getAntraege' => ['student/antragfreigabe:r', 'student/studierendenantrag:r'],
'getHistory' => ['student/antragfreigabe:r', 'student/studierendenantrag:r'],
'getPrestudents' => 'student/studierendenantrag:w',
'approveAntrag' => 'student/antragfreigabe:w',
'rejectAntrag' => 'student/antragfreigabe:w',
'reopenAntrag' => 'student/studierendenantrag:w',
'pauseAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'unpauseAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'objectAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'approveObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'denyObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w']
]);
// Libraries
$this->load->library('AntragLib');
// Load language phrases
$this->loadPhrases([
'studierendenantrag'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getActiveStgs()
{
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
$studiengaenge = array_merge($studiengaenge, $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []);
$result = $this->StudierendenantragModel->loadStgsWithAntraege($studiengaenge);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getAntraege($studiengang = null, $extra = null)
{
if ($studiengang && $studiengang == 'todo') {
$studiengang = $extra;
$extra = true;
} else {
$extra = false;
}
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
if(!is_array($studiengaenge))
$studiengaenge = [];
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
if(!is_array($stgsNeuanlage))
$stgsNeuanlage = [];
$studiengaenge = array_unique(array_merge($studiengaenge, $stgsNeuanlage));
if ($studiengang) {
if (!in_array($studiengang, $studiengaenge))
$this->terminateWithError(
'Forbidden',
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
$studiengaenge = [$studiengang];
}
$antraege = [];
if ($studiengaenge) {
$result = $extra
? $this->StudierendenantragModel->loadActiveForStudiengaenge($studiengaenge)
: $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
$antraege = $this->getDataOrTerminateWithError($result);
}
$this->terminateWithSuccess($antraege ?: []);
}
public function getHistory($studierendenantrag_id)
{
if (!$this->antraglib->isEntitledToSeeHistoryForAntrag($studierendenantrag_id))
$this->terminateWithError(
'Forbidden',
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
$result = $this->antraglib->getAntragHistory($studierendenantrag_id);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data ?: []);
}
public function getPrestudents()
{
$query = $this->input->post('query');
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
$result = $this->antraglib->getAktivePrestudentenInStgs($studiengaenge, $query);
$result = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($result ?: []);
}
public function approveAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToApproveAntrag', [$this->antraglib, 'isEntitledToApproveAntrag']],
],
[
'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag', 'error_no_right')
]
);
$this->form_validation->set_rules(
'typ',
'Typ',
'required|in_list[' . implode(',', [
Studierendenantrag_model::TYP_ABMELDUNG,
Studierendenantrag_model::TYP_ABMELDUNG_STGL,
Studierendenantrag_model::TYP_UNTERBRECHUNG,
Studierendenantrag_model::TYP_WIEDERHOLUNG
]) . ']'
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
switch ($this->input->post('typ')) {
case Studierendenantrag_model::TYP_ABMELDUNG:
case Studierendenantrag_model::TYP_ABMELDUNG_STGL:
$result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID());
break;
case Studierendenantrag_model::TYP_UNTERBRECHUNG:
$result = $this->antraglib->approveUnterbrechung([$studierendenantrag_id], getAuthUID());
break;
case Studierendenantrag_model::TYP_WIEDERHOLUNG:
$result = $this->antraglib->approveWiederholung($studierendenantrag_id, getAuthUID());
break;
}
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function rejectAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToRejectAntrag', [$this->antraglib, 'isEntitledToRejectAntrag']],
],
[
'isEntitledToRejectAntrag' => $this->p->t('studierendenantrag', 'error_no_right')
]
);
$this->form_validation->set_rules('grund', 'Grund', 'required');
$this->form_validation->set_rules(
'typ',
'Typ',
'required|in_list[' . implode(',', [
Studierendenantrag_model::TYP_UNTERBRECHUNG
]) . ']'
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$grund = $this->input->post('grund');
$result = $this->antraglib->rejectUnterbrechung([$studierendenantrag_id], getAuthUID(), $grund);
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function reopenAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToReopenAntrag', [$this->antraglib, 'isEntitledToReopenAntrag']],
],
[
'isEntitledToReopenAntrag' => $this->p->t('studierendenantrag', 'error_no_right')
]
);
$this->form_validation->set_rules(
'typ',
'Typ',
'required|in_list[' . implode(',', [
Studierendenantrag_model::TYP_WIEDERHOLUNG
]) . ']'
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->reopenWiederholung($studierendenantrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function pauseAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToPauseAntrag', [$this->antraglib, 'isEntitledToPauseAntrag']],
['antragCanBeManualPaused', [$this->antraglib, 'antragCanBeManualPaused']]
],
[
'isEntitledToPauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'antragCanBeManualPaused' => $this->p->t(
'studierendenantrag',
'error_not_pauseable',
['id' => $this->input->post('studierendenantrag_id')]
)
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->pauseAntrag($studierendenantrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function unpauseAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToUnpauseAntrag', [$this->antraglib, 'isEntitledToUnpauseAntrag']],
['antragCanBeManualUnpaused', [$this->antraglib, 'antragCanBeManualUnpaused']]
],
[
'isEntitledToUnpauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'antragCanBeManualUnpaused' => $this->p->t(
'studierendenantrag',
'error_not_paused',
['id' => $this->input->post('studierendenantrag_id')]
)
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->unpauseAntrag($studierendenantrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function objectAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToObjectAntrag', [$this->antraglib, 'isEntitledToObjectAntrag']],
['canBeObjected', function ($a) {
return $this->antraglib->hasType($a, Studierendenantrag_model::TYP_ABMELDUNG_STGL);
}]
],
[
'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'canBeObjected' => $this->p->t(
'studierendenantrag',
'error_no_objection'
)
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->objectAbmeldung($studierendenantrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function approveObjection()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToObjectAntrag', [$this->antraglib, 'isEntitledToObjectAntrag']],
['isObjected', function ($a) {
return $this->antraglib->hasStatus($a, Studierendenantragstatus_model::STATUS_OBJECTED);
}]
],
[
'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'isObjected' => $this->p->t(
'studierendenantrag',
'error_not_objected'
)
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->cancelAntrag($studierendenantrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function denyObjection()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToObjectAntrag', [$this->antraglib, 'isEntitledToObjectAntrag']],
['isObjected', function ($a) {
return $this->antraglib->hasStatus($a, Studierendenantragstatus_model::STATUS_OBJECTED);
}]
],
[
'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'isObjected' => $this->p->t(
'studierendenantrag',
'error_not_objected'
)
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$grund = $this->input->post('grund');
$result = $this->antraglib->denyObjectionAbmeldung($studierendenantrag_id, getAuthUID(), $grund);
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
}
@@ -0,0 +1,226 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \Studierendenantrag_model as Studierendenantrag_model;
use \DateTime as DateTime;
/**
* This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Unterbrechung extends FHCAPI_Controller
{
/**
* Calls the parent's constructor and loads the AntragLib
*/
public function __construct()
{
parent::__construct([
'getDetailsForNewAntrag' => self::PERM_LOGGED,
'getDetailsForAntrag' => self::PERM_LOGGED,
'createAntrag' => self::PERM_LOGGED,
'cancelAntrag' => self::PERM_LOGGED
]);
// Configs
$this->load->config('studierendenantrag');
// Libraries
$this->load->library('AntragLib');
// Load language phrases
$this->loadPhrases([
'studierendenantrag',
'ui'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getDetailsForNewAntrag($prestudent_id)
{
if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false))
$this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
if (!$result) {
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_no_student'),
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
} elseif ($result == -1) {
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_UNTERBRECHUNG);
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($data);
} elseif ($result == -2) {
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_pending', [
'typ' => $this->p->t('studierendenantrag', 'antrag_typ_' . $result->typ)
]));
} elseif ($result == -3) {
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_stg_blacklist'),
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
}
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($prestudent_id, null);
$this->terminateWithSuccess($data);
}
public function getDetailsForAntrag($studierendenantrag_id)
{
if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id))
return show_404();
$result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id);
$data = $this->getDataOrTerminateWithError($result);
if ($data->typ !== Studierendenantrag_model::TYP_UNTERBRECHUNG)
return show_404();
$this->terminateWithSuccess($data);
}
public function createAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
$this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
$this->form_validation->set_rules('grund', 'Grund', 'required');
$this->form_validation->set_rules(
'datum_wiedereinstieg',
'Datum Wiedereinstieg',
'required|callback_isValidDate|callback_isDateInFuture',
[
'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
]
);
if (!$this->form_validation->run()) {
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$grund = $this->input->post('grund');
$studiensemester = $this->input->post('studiensemester');
$prestudent_id = $this->input->post('prestudent_id');
$datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg');
$dms_id = null;
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester, $datum_wiedereinstieg);
$result = $this->getDataOrTerminateWithError($result);
if (!$result)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
elseif ($result == -3)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_stg_blacklist'), self::ERROR_TYPE_GENERAL);
elseif ($result < 0)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_exists'), self::ERROR_TYPE_GENERAL);
if (isset($_FILES['attachment']) && (!isset($_FILES['attachment']['error']) || $_FILES['attachment']['error'] != UPLOAD_ERR_NO_FILE)) {
$this->load->library('DmsLib');
$dms = $this->config->item('unterbrechung_dms');
if (!count(array_filter($dms, function ($v) {
return $v !== null;
})))
$dms = ['kategorie_kurzbz' => 'Akte'];
$dms['version'] = 0;
$allowed_filetypes = $this->config->item('unterbrechung_dms_filetypes') ?: ['*'];
$result = $this->dmslib->upload($dms, 'attachment', $allowed_filetypes);
$data = $this->getDataOrTerminateWithError($result);
$dms_id = $data['dms_id'];
}
$result = $this->antraglib->createUnterbrechung($prestudent_id, $studiensemester, getAuthUID(), $grund, $datum_wiedereinstieg, $dms_id);
$antragId = $this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getDetailsForAntrag($antragId);
if (!hasData($result))
$this->terminateWithSuccess($antragId);
$this->terminateWithSuccess(getData($result));
}
public function cancelAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required');
if (!$this->form_validation->run()) {
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$antrag_id = $this->input->post('antrag_id');
$result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
if (!hasData($result))
return $this->terminateWithSuccess($antrag_id);
$this->terminateWithSuccess(getData($result));
}
public function isValidDate($date)
{
try {
new DateTime($date);
} catch (Exception $e) {
return false;
}
return true;
}
public function isDateInFuture($date)
{
return new DateTime() < new DateTime($date);
}
}
@@ -0,0 +1,258 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \REST_Controller as REST_Controller;
use \Studierendenantragstatus_model as Studierendenantragstatus_model;
/**
* This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Wiederholung extends FHCAPI_Controller
{
/**
* Calls the parent's constructor and loads the FilterCmptLib
*/
public function __construct()
{
parent::__construct([
'getDetailsForNewAntrag' => self::PERM_LOGGED,
'createAntrag' => self::PERM_LOGGED,
'cancelAntrag' => self::PERM_LOGGED,
'getLvs' => self::PERM_LOGGED,
'saveLvs' => ['student/studierendenantrag:w']
]);
// Libraries
$this->load->library('AntragLib');
// Load language phrases
$this->loadPhrases([
'global',
'studierendenantrag'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves data of the current studiengang for the current user
*/
public function getDetailsForNewAntrag($prestudent_id)
{
if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false))
$this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
$result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
if (!$result) {
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_no_student_no_failed_exam'),
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
} elseif ($result == -1) {
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_WIEDERHOLUNG);
$data = $this->getDataOrTerminateWithError($result);
$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));
$data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
$data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
$data->pruefungsdatum = $pruefungsdata->datum;
$this->terminateWithSuccess($data);
} elseif ($result == -2) {
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_antrag_pending', [
'typ' => $this->p->t('studierendenantrag', 'antrag_typ_' . $result->typ)
]),
self::ERROR_TYPE_GENERAL,
REST_Controller::HTTP_BAD_REQUEST
);
} elseif ($result == -3) {
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_stg_blacklist'),
self::ERROR_TYPE_GENERAL,
REST_Controller::HTTP_BAD_REQUEST
);
}
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
// NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
$pruefungsdata = current(getData($result));
$data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
$data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
$data->pruefungsdatum = $pruefungsdata->datum;
$this->terminateWithSuccess($data);
}
public function createAntrag()
{
$this->createAntragWithStatus(true);
}
public function cancelAntrag()
{
$this->createAntragWithStatus(false);
}
protected function createAntragWithStatus($repeat)
{
$this->load->library('form_validation');
$this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$prestudent_id = $this->input->post('prestudent_id');
$studiensemester = $this->input->post('studiensemester');
$result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
if (!$result) {
$this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
} elseif ($result == -1) {
$result = $this->PrestudentstatusModel->getLastStatus($prestudent_id);
$result = $this->getDataOrTerminateWithError($result);
if (!$result)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_no_prestudentstatus', [
'prestudent_id' => $prestudent_id
]), self::ERROR_TYPE_GENERAL);
if (!in_array(current($result)->status_kurzbz, $this->config->item('antrag_prestudentstatus_whitelist')))
$this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
} elseif ($result == -2) {
$this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_exists'), self::ERROR_TYPE_GENERAL);
} elseif ($result == -3) {
$this->terminateWithError($this->p->t('studierendenantrag', 'error_stg_blacklist'), self::ERROR_TYPE_GENERAL);
}
$result = $this->antraglib->createWiederholung($prestudent_id, $studiensemester, getAuthUID(), $repeat);
$antragId = $this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getDetailsForAntrag($antragId);
if (!hasData($result))
$this->terminateWithSuccess(true);
$data = getData($result);
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
// NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
$pruefungsdata = current(getData($result));
$data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
$data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
$data->pruefungsdatum = $pruefungsdata->datum;
$this->terminateWithSuccess($data);
}
public function getLvs($antrag_id)
{
$result = $this->antraglib->getLvsForAntrag($antrag_id);
if (isError($result)) {
$error = getError($result);
if ($error == 'Forbidden')
$this->terminateWithError(
$error,
self::ERROR_TYPE_AUTH,
REST_Controller::HTTP_FORBIDDEN
);
$this->terminateWithError(
$error,
self::ERROR_TYPE_GENERAL
);
}
$lvs = getData($result);
$this->terminateWithSuccess($lvs);
}
public function saveLvs()
{
$forbiddenLvs = $this->input->post('forbiddenLvs');
$mandatoryLvs = $this->input->post('mandatoryLvs');
$antragsLvs = array_merge($forbiddenLvs, $mandatoryLvs);
if (!$antragsLvs)
$this->terminateWithError($this->p->t('studierendenantrag', 'error_no_lv'), self::ERROR_TYPE_GENERAL);
$insert = array_map(function ($lv) {
return [
'studierendenantrag_id' => $lv['studierendenantrag_id'],
'lehrveranstaltung_id' => $lv['lehrveranstaltung_id'],
'note' => $lv['zugelassen']
? ($lv['zugelassen'] == 1 ? 0 : $this->config->item('wiederholung_note_angerechnet'))
: $this->config->item('wiederholung_note_nicht_zugelassen'),
'anmerkung' => $lv['anmerkung'],
'insertvon' => getAuthUID(),
'studiensemester_kurzbz' => $lv['studiensemester_kurzbz']
];
}, $antragsLvs);
$antrag_ids = array_unique(array_map(function ($lv) {
return $lv['studierendenantrag_id'];
}, $insert));
foreach ($antrag_ids as $antrag_id) {
$result = $this->StudierendenantragModel->loadIdAndStatusWhere([
'studierendenantrag_id' => $antrag_id
]);
$antrag = $this->getDataOrTerminateWithError($result);
if (!$antrag)
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id]),
self::ERROR_TYPE_GENERAL
);
$antrag = current($antrag);
if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED
&& $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED)
$this->terminateWithError(
$this->p->t('studierendenantrag', 'error_antrag_locked'),
self::ERROR_TYPE_GENERAL
);
}
$result = $this->antraglib->saveLvs($insert);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
@@ -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));
}
}
+438
View File
@@ -0,0 +1,438 @@
<?php
if (! defined("BASEPATH")) exit("No direct script access allowed");
class UHSTAT1 extends FHC_Controller
{
const BERECHTIGUNG_UHSTAT_VERWALTEN = 'student/uhstat1daten_verwalten';
const PERSON_ID_SESSION_INDEX = 'bewerbung/personId';
const CODEX_OESTERREICH = 'A';
const LOWER_BOUNDARY_YEARS = 160;
const UPPER_BOUNDARY_YEARS = 20;
private $_uid;
private $_uhstat1Fields = array();
public function __construct()
{
parent::__construct();
// load ci libs
$this->load->library('form_validation');
// load ci helpers
$this->load->helper(array('form', 'url'));
// load libraries
$this->load->library('AuthLib');
$this->load->library('PermissionLib');
// load models
$this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->load->model('codex/Abschluss_model', 'AbschlussModel');
$this->load->model('codex/Uhstat1daten_model', 'Uhstat1datenModel');
$this->loadPhrases(
array(
'ui',
'uhstat'
)
);
$this->_uid = getAuthUID();
// set form field information
$this->_uhstat1Fields = array(
'mutter_geburtsstaat' => array('name' => 'Geburtsstaat Mutter'),
'mutter_geburtsjahr' => array('name' => 'Geburtsjahr Mutter'),
'mutter_bildungsstaat' => array('name' => 'Bildungsstaat Mutter'),
'mutter_bildungmax' => array(
'name' => 'Geburtsjahr Mutter',
'rules' => array(
'callback_bildungsstaat_bildungmax_check[m]' => array(
'bildungsstaat_bildungmax_check' => $this->p->t('uhstat', 'ausbildungBildungsstaatUebereinstimmung')
)
)
),
'vater_geburtsstaat' => array('name' => 'Geburtsstaat Vater'),
'vater_geburtsjahr' => array('name' => 'Geburtsjahr Vater'),
'vater_bildungsstaat' => array('name' => 'Bildungsstaat Vater'),
'vater_bildungmax' => array('name' => 'Geburtsjahr Vater'),
'vater_bildungmax' => array(
'name' => 'Geburtsjahr Vater',
'rules' => array(
'callback_bildungsstaat_bildungmax_check[v]' => array(
'bildungsstaat_bildungmax_check' => $this->p->t('uhstat', 'ausbildungBildungsstaatUebereinstimmung')
)
)
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
public function index()
{
$formMetaData = $this->_getFormMetaData();
if (isError($formMetaData)) show_error(getError($formMetaData));
if (!hasData($formMetaData)) show_error("No form meta data could be loaded");
$uhstatData = $this->_getUHSTAT1Data();
if (isError($uhstatData)) show_error(getError($uhstatData));
$this->load->view("codex/uhstat1.php", array(
'formMetaData' => getData($formMetaData),
'uhstatData' => getData($uhstatData)
)
);
}
/**
* Add or update UHSTAT1 data
*/
public function saveUHSTAT1Data()
{
$saved = false;
$person_id = $this->_getValidPersonId('sui');
$this->form_validation->set_error_delimiters('<span class="text-danger">', '</span>');
foreach ($this->_uhstat1Fields as $field => $params)
{
// all fields are required
$ruleNames = 'required';
$ruleMessages = array('required' => $this->p->t('uhstat', 'angabeFehlt'));
// add additional rules
if (isset($params['rules']))
{
foreach ($params['rules'] as $ruleName => $ruleMessage)
{
$ruleNames .= '|'.$ruleName;
$ruleMessages = array_merge($ruleMessages, $ruleMessage);
}
}
$this->form_validation->set_rules(
$field,
$params['name'],
$ruleNames,
$ruleMessages
);
}
$uhstat1datenRes = null;
if ($this->form_validation->run()) // if valid
{
// get post fields
$uhstatData = array();
foreach ($this->_uhstat1Fields as $field => $params)
{
$uhstatData[$field] = $this->input->post($field);
}
// check if entry already exists
$uhstat1datenloadRes = $this->Uhstat1datenModel->loadWhere(array('person_id' => $person_id));
// if yes, update
if (hasData($uhstat1datenloadRes))
{
$uhstatData['updateamum'] = 'NOW()';
$uhstatData['updatevon'] = $this->_uid;
$uhstat1datenRes = $this->Uhstat1datenModel->update(
array('person_id' => $person_id),
$uhstatData
);
}
else // otherwise insert
{
$uhstatData['insertamum'] = 'NOW()';
$uhstatData['insertvon'] = $this->_uid;
$uhstat1datenRes = $this->Uhstat1datenModel->insert(
array_merge($uhstatData, array('person_id' => $person_id))
);
}
}
$formMetaData = $this->_getFormMetaData();
if (isError($formMetaData)) show_error(getError($formMetaData));
if (!hasData($formMetaData)) show_error("No form meta data could be loaded");
$successMessage = '';
$errorMessage = '';
// pass success/error messages to view
if (isset($uhstat1datenRes))
{
if (isSuccess($uhstat1datenRes))
{
$successMessage = $this->p->t('uhstat', 'erfolgreichGespeichert');
$saved = true;
}
else
$errorMessage = $this->p->t('uhstat', 'fehlerBeimSpeichern');
}
// load view with form data
$this->load->view("codex/uhstat1.php", array(
'formMetaData' => getData($formMetaData),
'saved' => $saved,
'successMessage' => $successMessage,
'errorMessage' => $errorMessage
)
);
}
/**
* Check callback for Bildungsstaat - if Bildungsstaat is Austria, a highest education should be in Austria.
* @param $bildungmax
* @param $bildungsstaat_typ - mother (m) or father (v)
* @return bool true if valid, false otherwise
*/
public function bildungsstaat_bildungmax_check($bildungmax, $bildungsstaat_typ)
{
// valid if no type passed
if (!isset($bildungsstaat_typ) || !isset($bildungmax)) return true;
// get correct input
if ($bildungsstaat_typ == 'm') // mutter
$bildungsstaat = $this->input->post('mutter_bildungsstaat');
elseif ($bildungsstaat_typ == 'v') // vater
$bildungsstaat = $this->input->post('vater_bildungsstaat');
else
return true;
if (!isset($bildungsstaat)) return true;
// find out if abschluss is in Austria
$this->AbschlussModel->addSelect("in_oesterreich");
$abschlussRes = $this->AbschlussModel->load($bildungmax);
if (hasData($abschlussRes))
{
$in_oesterreich = getData($abschlussRes)[0]->in_oesterreich;
// invalid if abschluss in Austria, but not Bildungsstaat, or abschluss not in Austria, but Bildungsstaat in Austria
return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH) || (!$in_oesterreich && $bildungsstaat != self::CODEX_OESTERREICH);
}
return false;
}
/**
* Deletes UHSTAT1 entry.
*/
public function deleteUHSTAT1Data()
{
$saved = false;
// uhstat data can only be deleted with permission
if (!$this->_checkPermission('suid')) show_error('no permission');
$person_id = $this->_getValidPersonId('suid');
$uhstat1datenRes = $this->Uhstat1datenModel->delete(
array('person_id' => $person_id)
);
$formMetaData = $this->_getFormMetaData();
if (isError($formMetaData)) show_error(getError($formMetaData));
if (!hasData($formMetaData)) show_error("No form meta data could be loaded");
$successMessage = '';
$errorMessage = '';
// pass success/error messages to view
if (isset($uhstat1datenRes))
{
if (isSuccess($uhstat1datenRes))
{
$successMessage = $this->p->t('uhstat', 'erfolgreichGeloescht');
}
else
$errorMessage = $this->p->t('uhstat', 'fehlerBeimLoeschen');
}
// load view with form data
$this->load->view("codex/uhstat1.php", array(
'formMetaData' => getData($formMetaData),
'successMessage' => $successMessage,
'errorMessage' => $errorMessage
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Gets initial data needed to display UHSTAT1 form.
*/
private function _getFormMetaData()
{
$person_id = $this->_getValidPersonId('s');
// read only display param
$readOnly = $this->input->get('readOnly');
// depending on permissions, editing or deleting is possible
$editPermission = $this->_checkPermission('sui');
$deletePermission = $this->_checkPermission('suid');
$languageIdx = $this->_getLanguageIndex();
$formMetaData = array(
'nation' => array(),
'abschluss_oesterreich' => array(),
'abschluss_nicht_oesterreich' => array(),
'jahre' => array(),
'person_id' => $person_id,
'editPermission' => $editPermission,
'deletePermission' => $deletePermission,
'readOnly' => $readOnly
);
// get person data
$this->load->model('person/Person_model', 'PersonModel');
$this->PersonModel->addSelect("vorname, nachname");
$personRes = $this->PersonModel->load($person_id);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$person = getData($personRes)[0];
$formMetaData['vorname'] = $person->vorname;
$formMetaData['nachname'] = $person->nachname;
}
$nationTextFieldName = $languageIdx == 1 ? 'langtext' : 'engltext';
// get nation list
$this->load->model('codex/Nation_model', 'NationModel');
$this->NationModel->addSelect("nation_code, $nationTextFieldName AS nation_text");
$this->NationModel->addOrder("nation_text");
$nationRes = $this->NationModel->loadWhere('sperre IS NULL OR sperre = FALSE');
if (isError($nationRes)) return $nationRes;
if (hasData($nationRes))
{
$nations = getData($nationRes);
// put austria in beginning of selection
foreach ($nations as $nation)
{
if ($nation->nation_code == self::CODEX_OESTERREICH) array_unshift($nations, $nation);
}
$formMetaData['nation'] = $nations;
}
// get abschluss list
$abschlussRes = $this->AbschlussModel->getActiveAbschluesse($languageIdx);
if (isError($abschlussRes)) return $abschlussRes;
$abschlussData = getData($abschlussRes);
if (hasData($abschlussRes))
{
foreach (getData($abschlussRes) as $abschluss)
{
if ($abschluss->in_oesterreich === true)
$formMetaData['abschluss_oesterreich'][] = $abschluss;
elseif ($abschluss->in_oesterreich === false)
$formMetaData['abschluss_nicht_oesterreich'][] = $abschluss;
else
{
$formMetaData['abschluss_oesterreich'][] = $abschluss;
$formMetaData['abschluss_nicht_oesterreich'][] = $abschluss;
}
}
}
// get realistic birth years, dated back from current year
$currYear = date("Y");
$formMetaData['jahre'] = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS);
return success($formMetaData);
}
/**
* Gets initial data needed to display UHSTAT1 form.
*/
private function _getUHSTAT1Data()
{
$person_id = $this->_getValidPersonId('s');
$this->Uhstat1datenModel->addSelect(
implode(', ', array_keys($this->_uhstat1Fields))
);
$uhstatRes = $this->Uhstat1datenModel->loadWhere(array('person_id' => $person_id));
if (isError($uhstatRes)) return $uhstatRes;
return success(hasData($uhstatRes) ? getData($uhstatRes)[0] : null);
}
/**
* Gets language index of currently logged in user.
* @return int (the index, start at 1)
*/
private function _getLanguageIndex()
{
$idx = 1;
$this->SpracheModel->addSelect('index');
$langRes = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
if (hasData($langRes))
{
$idx = getData($langRes)[0]->index;
}
return $idx;
}
/**
* Gets Id of person having permissions to manage UHSTAT1 data.
* Can be passed as parameter or be in session.
* @return int person_id
*/
private function _getValidPersonId($berechtigungsArt)
{
// if coming from bewerbungstool - person id is in session (person must be logged in bewerbungstool)
if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX]) && is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX]))
return $_SESSION[self::PERSON_ID_SESSION_INDEX];
// if person id passed directly...
$person_id = $this->input->post('person_id');
if (!isset($person_id)) $person_id = $this->input->get('person_id');
if (!isset($person_id) || !is_numeric($person_id)) show_error("invalid person id");
// ...check if there is a permission for editing UHSTAT1 data
if ($this->_checkPermission($berechtigungsArt)) return $person_id;
show_error("No permission");
}
/**
* Checks if logged user has the UHSTAT management permission.
* @param $art - type of permission, e.g. suid for full permissions
* @return bool
*/
private function _checkPermission($art)
{
return $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_UHSTAT_VERWALTEN, $art);
}
}
@@ -0,0 +1,211 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the FilterCmptLib (back-end)
* Provides data to the ajax get calls about the filter component
* Listens to ajax post calls to change the filter data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
* NOTE: extends the FHC_Controller instead of the Auth_Controller because the FilterCmpt has its
* own permissions check
* TODO(chris): deprecated
*/
class Filter extends FHC_Controller
{
const FILTER_UNIQUE_ID = 'filterUniqueId'; // Name of the filter cmpt unique id (mandatory)
const FILTER_TYPE = 'filterType'; // The filter type (PHP filter definition) used (mandatory)
const FILTER_ID = 'filterId'; // The id of the used filter (optional)
/**
* Calls the parent's constructor and loads the FilterCmptLib
*/
public function __construct()
{
parent::__construct();
// 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();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves data about the current filter from the session and will be written on the output in JSON format
*/
public function getFilter()
{
$this->outputJsonSuccess($this->filtercmptlib->getSession());
}
/**
* Remove an applied filter (SQL where condition) from the current filter
*/
public function removeFilterField()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterField')
&& $this->filtercmptlib->removeFilterField($request->filterField) == true)
{
$this->outputJsonSuccess('Field removed');
}
else
{
$this->outputJsonError('Error occurred');
}
}
/**
* Add a filter (SQL where clause) to be applied to the current filter
*/
public function addFilterField()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterField')
&& $this->filtercmptlib->addFilterField($request->filterField) == true)
{
$this->outputJsonSuccess('Field added');
}
else
{
$this->outputJsonError('Error occurred');
}
}
/**
* Apply the filter changes
*/
public function applyFilterFields()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterFields')
&& $this->filtercmptlib->applyFilterFields($request->filterFields) == true)
{
$this->outputJsonSuccess('Applied');
}
else
{
$this->outputJsonError('Error occurred');
}
}
/**
* Save the current filter as a custom filter for this user with the given description
*/
public function saveCustomFilter()
{
$request = $this->getPostJSON();
if (property_exists($request, 'customFilterName')
&& $this->filtercmptlib->saveCustomFilter($request->customFilterName) == true)
{
$this->outputJsonSuccess('Saved');
}
else
{
$this->outputJsonError('An error occurred while saving a custom filter');
}
}
/**
* Remove a custom filter by its filterId
*/
public function removeCustomFilter()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterId')
&& $this->filtercmptlib->removeCustomFilter($request->filterId) == true)
{
$this->outputJsonSuccess('Removed');
}
else
{
$this->outputJsonError('Wrong parameter');
}
}
/**
* Reloads the dataset
*/
public function reloadDataset()
{
$this->filtercmptlib->reloadDataset();
$this->outputJsonSuccess('Success');
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Loads the FilterCmptLib with the FILTER_UNIQUE_ID parameter
* If the parameter FILTER_UNIQUE_ID is not given then the execution of the controller is terminated and
* an error message is printed
*/
private function _startFilterCmptLib()
{
$filterUniqueId = null;
$filterType = null;
$filterId = null;
// Try to get the POSTed JSON
$postJSON = $this->getPostJSON();
// POSTed JSON
if ($postJSON != null)
{
// If the mandatory parameters FILTER_UNIQUE_ID and FILTER_TYPE have been provided
if (property_exists($postJSON, self::FILTER_UNIQUE_ID) && property_exists($postJSON, self::FILTER_TYPE))
{
// Retrives them from the POSTed JSON
$filterUniqueId = $postJSON->{self::FILTER_UNIQUE_ID};
$filterType = $postJSON->{self::FILTER_TYPE};
}
// If the optional parameter FILTER_ID has been provided
if (property_exists($postJSON, self::FILTER_ID)) $filterId = $postJSON->{self::FILTER_ID};
}
else // otherwise it is an HTTP GET call
{
// If the mandatory parameters FILTER_UNIQUE_ID and FILTER_TYPE have been provided
if (isset($_GET[self::FILTER_UNIQUE_ID]) && isset($_GET[self::FILTER_TYPE]))
{
// Retrives them from the HTTP GET
$filterUniqueId = $this->input->get(self::FILTER_UNIQUE_ID);
$filterType = $this->input->get(self::FILTER_TYPE);
}
// If the optional parameter FILTER_ID has been provided
if (isset($_GET[self::FILTER_ID])) $filterId = $filterId = $this->input->get(self::FILTER_ID);
}
// If the mandatory parameters have _not_ been provided, then terminate the execution and return an error
if ($filterUniqueId == null) $this->terminateWithJsonError('Parameter "'.self::FILTER_UNIQUE_ID.'" not provided!');
if ($filterType == null) $this->terminateWithJsonError('Parameter "'.self::FILTER_TYPE.'" not provided!');
// Loads the FilterCmptLib that contains all the used logic
$this->load->library(
'FilterCmptLib',
array(
'filterUniqueId' => $filterUniqueId,
'filterType' => $filterType,
'filterId' => $filterId
)
);
// Start the component
$this->filtercmptlib->start();
}
}
@@ -0,0 +1,22 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* TODO(chris): deprecated
*/
class Phrasen extends FHC_Controller
{
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @param string $module
*/
public function loadModule($module)
{
$this->load->library('PhrasesLib', [$module], 'pj');
$this->outputJsonSuccess(json_decode($this->pj->getJSON()));
}
}
@@ -0,0 +1,60 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* TODO(chris): deprecated
*/
class SearchBar extends FHC_Controller
{
const SEARCHSTR_PARAM = 'searchstr';
const TYPES_PARAM = 'types';
/**
* Object initialization
*/
public function __construct()
{
parent::__construct();
// Loads the AuthLib _without_ starting the authentication
// NOTE:
// - A user must be authenticated via another controller to access this one
// - It is loaded to be able to call the isLogged function later
$this->load->library('AuthLib');
// Load the library SearchBarLib
$this->load->library('SearchBarLib');
// Checks if the user is authenticated, otherwise returns an error code in JSON format
if (!isLogged()) $this->terminateWithJsonError(SearchBarLib::ERROR_NOT_AUTH);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function search()
{
$json = json_decode($this->input->raw_input_stream);
// Checks if the searchstr and the types parameters are in the POSTed JSON
if (isset($json->{self::SEARCHSTR_PARAM}) && isset($json->{self::TYPES_PARAM}))
{
// Convert to json the result from searchbarlib->search
$this->outputJson(
$this->searchbarlib->search(
$json->{self::SEARCHSTR_PARAM},
$json->{self::TYPES_PARAM}
)
);
}
else // otherwise return an error in JSON format
{
$this->outputJsonError(SearchBarLib::ERROR_WRONG_JSON);
}
}
}
+85 -6
View File
@@ -37,6 +37,9 @@ class AnrechnungJob extends JOB_Controller
$this->load->helper('hlp_sancho_helper');
$this->load->library('AnrechnungLib');
// Load configs
$this->load->config('anrechnung');
}
/**
@@ -213,7 +216,7 @@ class AnrechnungJob extends JOB_Controller
'datentabelle' => $anrechnungen_table,
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
// Send mail
sendSanchoMail(
'AnrechnungAntragStellen',
@@ -227,6 +230,82 @@ class AnrechnungJob extends JOB_Controller
$this->logInfo('SUCCEDED: Sending emails to STGL about yesterdays new Anrechnungen succeded.');
}
// Send Sancho mail to LV-Leitung (fallback Lectors) that were requested for recommendation yesterday.
public function sendMailRecommendationRequests(){
$this->logInfo('Start AnrechnungJob sendMailRecommendationRequests to inform lecturers about yesterdays requests for recommendation.');
// Get Anrechnungen, für die gestern eine Empfehlung angefragt worden ist
$this->AnrechnungModel->addSelect('astat.anrechnung_id, astat.datum, astat.insertamum');
$this->AnrechnungModel->addDistinct('astat.anrechnung_id');
$this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus astat', 'anrechnung_id');
$result = $this->AnrechnungModel->loadWhere('
studiensemester_kurzbz = (SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende)
AND genehmigt_von IS NULL
AND empfehlung_anrechnung IS NULL
AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor
AND NOW()::date = (astat.datum + interval \'1 day\') -- nur gestrige Empfehlungsanfrage
ORDER BY astat.anrechnung_id, astat.datum DESC, astat.insertamum DESC -- nur letzten status dabei prüfen
');
// Exit, wenn es gestern keine Empfehlungsanfragen gab
if (!hasData($result))
{
$this->logInfo('End AnrechnungJob sendMailRecommendationRequests, because no recommendations were requested yesterday.');
exit;
}
$anrechnung_id_arr = array_column(getData($result), 'anrechnung_id');
$arr_lvLector_arr = array();
foreach ($anrechnung_id_arr as $anrechnung_id)
{
// Get full name of Fachbereichsleitung or LV Leitung.
if($this->config->item('fbl') === TRUE)
{
$arr_lvLector_arr[] = $this->anrechnunglib->getLeitungOfLvOe($anrechnung_id);
}
else
{
$arr_lvLector_arr[] = $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV.
}
}
// Unique lector array to send only one mail per lector
$arr_lvLector_arr = array_unique($arr_lvLector_arr, SORT_REGULAR);
// Link to 'Anrechnungen prüfen' dashboard
$url =
CIS_ROOT. 'cis/index.php?menu='.
CIS_ROOT. 'cis/menu.php?content_id=&content='.
CIS_ROOT. index_page(). self::REVIEW_ANRECHNUNG_URI;
foreach ($arr_lvLector_arr as $lvLector_arr)
{
foreach ($lvLector_arr as $lector)
{
// Prepare mail content
$fields = array(
'vorname' => $lector->vorname,
'stgl_name' => 'Die Studiengangsleitung',
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
// Send mail
sendSanchoMail(
'AnrechnungEmpfehlungAnfordern',
$fields,
$lector->uid. '@'. DOMAIN,
'Deine Empfehlung wird benötigt zur Anerkennung nachgewiesener Kenntnisse'
);
}
}
$this->logInfo('SUCCEDED AnrechnungJob sendMailRecommendationRequests');
}
/**
* Send Sancho mail to students, whose Anrechnungen were approved 24 hours ago.
*/
@@ -308,7 +387,7 @@ class AnrechnungJob extends JOB_Controller
$db = new DB_Model();
$result = $db->execReadOnlyQuery($qry);
// Exit if there are no rejected Anrechnungen
if (!hasData($result))
{
@@ -361,9 +440,9 @@ html;
$result = $this->AnrechnungModel->loadWhere('
studiensemester_kurzbz = (
SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende)
SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende
)
AND genehmigt_von IS NULL
AND genehmigt_von IS NULL
AND empfehlung_anrechnung IS NULL
AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor
AND NOW()::date = (astat.datum + interval \'1 week\') -- eine Woche nach Empfehlungsanfrage
@@ -376,7 +455,7 @@ html;
$this->logInfo('End AnrechnungJob sendMailRemindRecommendation, because no recommendations to be done.');
exit;
}
$anrechnung_id_arr = array_column(getData($result), 'anrechnung_id');
$arr_lvLector_arr = array();
@@ -435,7 +514,7 @@ html;
'vorname' => $stgl->vorname
);
}
return $stglMailAdress_arr;
}
// If not available, get assistance mail address
+691
View File
@@ -0,0 +1,691 @@
<?php
if (!defined("BASEPATH")) exit("No direct script access allowed");
use \DateTime as DateTime;
class AntragJob extends JOB_Controller
{
/**
* API constructor
*/
public function __construct()
{
parent::__construct();
// Configs
$this->load->config('studierendenantrag');
// Loads SanchoHelper
$this->load->helper('hlp_sancho_helper');
$this->load->library('AntragLib');
// Load Model
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
$this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel');
$this->load->model('education/Pruefung_model', 'PruefungModel');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
}
/**
* Send infomail to Stgl
*/
public function sendStglSammelmail()
{
$this->load->model('person/Person_model', 'PersonModel');
$this->logInfo('Start Job sendStglSammelmail');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->StudierendenantragModel->addJoin('public.tbl_prestudent', 'prestudent_id');
$this->db->group_start();
$this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG);
$this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
$this->db->group_end();
$this->db->or_group_start();
$this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL);
$this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
$this->db->group_end();
$this->db->or_group_start();
$this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG);
$this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
$this->db->group_end();
$this->db->or_group_start();
$this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG);
$this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED);
$this->db->group_end();
$result = $this->StudierendenantragModel->load();
if(isError($result))
return $this->logError(getError($result));
if(!hasData($result))
return $this->logInfo('End Job sendStglSammelmail: 0 Mails sent');
$antraege = getData($result);
$stgs = array();
$stgLeitungen = array();
foreach ($antraege as $antrag)
{
if (!isset($stgs[$antrag->studiengang_kz]))
{
$result = $this->StudiengangModel->getLeitung($antrag->studiengang_kz);
if (isError($result))
{
$this->logError(getError($result));
continue;
}
if (!hasData($result))
{
$this->logError('Keine Leitung für Studiengang ' . $antrag->studiengang_kz . ' gefunden!');
continue;
}
$leitung = current(getData($result));
if (!isset($stgLeitungen[$leitung->uid]))
{
$stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ];
}
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
$result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
if (isError($result))
{
$this->logError(getError($result));
continue;
}
if (!hasData($result))
{
$this->logError('Keine Details für Studiengang ' . $antrag->studiengang_kz . ' gefunden!');
continue;
}
$details = current(getData($result));
$stgs[$antrag->studiengang_kz] = [
'Abmeldung' => [],
'Unterbrechung' => [],
'Wiederholung' => [],
'Details' => $details
];
}
$stgs[$antrag->studiengang_kz][str_replace('Stgl', '', $antrag->typ)] = $antrag;
}
$this->load->model('system/Sprache_model', 'SpracheModel');
$result = $this->SpracheModel->loadWhere(['content' => true]);
if (isError($result)) {
$this->logError(getError($result));
$languages = [DEFAULT_LANGUAGE];
} elseif (!hasData($result)) {
$languages = [DEFAULT_LANGUAGE];
} else {
$languages = array_map(function ($row) {
return $row->sprache;
}, getData($result));
}
$count = 0;
foreach ($stgLeitungen as $leitung)
{
$data = [
'name' => trim($leitung['Details']->vorname . ' ' . $leitung['Details']->nachname),
'vorname' => $leitung['Details']->vorname,
'nachname' => $leitung['Details']->nachname
];
foreach ($languages as $lang) {
unset($this->p);
$this->loadPhrases(['studierendenantrag'], $lang);
$table = '';
foreach ($leitung['stgs'] as $studiengang_kz) {
$rows = '';
$stg = $stgs[$studiengang_kz];
foreach (['Abmeldung', 'Unterbrechung', 'Wiederholung'] as $typ) {
$c = count($stg[$typ]);
if ($c) {
$rows .= $this->p->t('studierendenantrag', 'mail_part_x_new_' . $typ, ['count' => $c]);
}
}
$table .= $this->p->t('studierendenantrag', 'mail_part_table', [
'stg_bezeichnung' => $stg['Details']->bezeichnung,
'stg_orgform_kurzbz' => $stg['Details']->orgform_kurzbz,
'rows' => $rows
]);
}
$data['table_' . $lang] = $table;
}
$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,
$to,
'Anträge - Aktion(en) erforderlich',
DEFAULT_SANCHO_HEADER_IMG,
DEFAULT_SANCHO_FOOTER_IMG,
'',
$cc
))
$count++;
}
$this->logInfo($count . " Emails erfolgreich versandt");
$this->logInfo('End Job sendStglSammelmail');
}
/**
* Send reminder to Assistant for Wiedereinstieg Unterbrecher
*
*/
public function sendReminderWiedereinstieg()
{
$now = new DateTime();
$modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier');
if (!$modifier)
return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt');
$end = new DateTime();
$end->modify($modifier);
$this->logInfo(sprintf(
'Start Job sendReminderWiedereinstieg (Wiedereinstieg zwischen %s - %s)',
$now->format('Y-m-d'),
$end->format('Y-m-d')
));
$result = $this->StudierendenantragModel->getAntraegeWhereWiedereinstiegBetween($now, $end);
if(isError($result))
{
$this->logError(getError($result));
$this->logInfo('Ende Job sendReminderWiedereinstieg');
return;
}
$antraege = getData($result) ?: [];
$count = 0;
foreach ($antraege as $antrag)
{
$res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
$stg = '';
$orgform = '';
if (hasData($res)) {
$studiengang = current(getData($res));
$stg = $studiengang->bezeichnung;
$orgform = $studiengang->orgform_kurzbz;
}
$datum = new DateTime($antrag->datum_wiedereinstieg);
$data = array(
'prestudent' => $antrag->prestudent_id,
'name' => trim($antrag->vorname . ' '. $antrag->nachname),
'datum_wiedereinstieg' => $datum->format('d.m.Y'),
'vorname' => $antrag->vorname,
'nachname' => $antrag->nachname,
'Orgform' => $orgform,
'stg' => $stg
);
$result = $this->StudentModel->loadWhere(['prestudent_id'=> $antrag->prestudent_id]);
if (hasData($result)) {
$student = current(getData($result));
$data['UID'] = $student->student_uid;
}
// NOTE(chris): Sancho mail
if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg'))
{
$count++;
$this->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag->studierendenantrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT,
'insertvon' => 'AntragJob'
]);
}
}
$this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg');
}
/**
* Set Wiederholer after deadline to Abbrecher
*
*/
public function handleWiederholerDeadline()
{
$this->logInfo('Start Job handleWiederholerDeadline');
$this->load->library('PrestudentLib');
$insertvon = $this->config->item('antrag_job_systemuser');
if (!$insertvon) {
$this->logError('Config "antrag_job_systemuser" nicht gesetzt');
$this->logInfo('Ende Job handleWiederholerDeadline');
return;
}
$modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier');
if (!$modifier_deadline) {
$this->logError('Config "wiederholung_job_deadline_date_modifier" nicht gesetzt');
$this->logInfo('Ende Job handleWiederholerDeadline');
return;
}
$digi_start= $this->config->item('digitalization_start');
if($digi_start)
$digi_start = new DateTime($digi_start);
$dateDeadline = new DateTime();
$dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline));
$result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed(
[
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
Studierendenantragstatus_model::STATUS_REQUESTSENT_2
],
$dateDeadline,
$digi_start
);
if(isError($result))
{
$this->logError(getError($result));
}
else
{
$prestudents = getData($result) ?: [];
$count = 0;
$prestudents = $this->prestudentsGetUnique($prestudents);
foreach ($prestudents as $prestudent)
{
$result = $this->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $prestudent->studierendenantrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED,
'insertvon' => 'AntragJob'
]);
if (isError($result)) {
$this->logError(getError($result));
} else {
$deregisterStatus = getData($result);
$result = $this->antraglib->pauseAntrag(
$prestudent->studierendenantrag_id,
Studierendenantragstatus_model::INSERTVON_DEREGISTERED
);
if (isError($result))
$this->logError(getError($result));
$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, '', $insertvon);
if (isError($result)) {
$this->StudierendenantragstatusModel->delete($deregisterStatus);
$this->logError(getError($result));
} else {
$count++;
$datum_kp = new DateTime($prestudent->datum);
$dataMail = array(
'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
'vorname' => $prestudent->vorname,
'nachname' => $prestudent->nachname,
'pers_kz'=> $prestudent->matrikelnr,
'stg' => $prestudent->bezeichnung,
'lvbezeichnung' => $prestudent->lvbezeichnung,
'datum_kp' => $datum_kp->format('d.m.Y'),
'studiensemester'=> $prestudent->studiensemester_kurzbz,
'Orgform'=> $prestudent->orgform,
'prestudent_id' => $prestudent->prestudent_id,
'fristablauf' => $dateDeadline->format('d.m.Y')
);
$email = $this->StudentModel->getEmailFH($this->StudentModel->getUID($prestudent->prestudent_id));
// Mail to Student
if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Stud', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) {
$this->logWarning("Failed to send Notification to " . $email);
}
$result = $this->StudiengangModel->load($prestudent->studiengang_kz);
if (!hasData($result)) {
$this->logWarning('No Studiengang found');
continue;
}
$studiengang = current(getData($result));
$email = $studiengang->email;
// Mail to Assistenz
if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Assist', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) {
$this->logWarning("Failed to send Notification to " . $email);
}
}
}
}
$this->logInfo($count . " Students set to Abbrecher");
}
$this->logInfo('Ende Job handleWiederholerDeadline');
}
/**
* Set Abmeldungen after deadline to Abbrecher
*
*/
public function handleAbmeldungenStglDeadline()
{
$this->logInfo('Start Job handleAbmeldungenStglDeadline');
$insertvon = $this->config->item('antrag_job_systemuser');
if (!$insertvon) {
$this->logError('Config "antrag_job_systemuser" nicht gesetzt');
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
return;
}
$modifier_deadline = $this->config->item('abmeldung_job_deadline_date_modifier');
if (!$modifier_deadline) {
$this->logError('Config "abmeldung_job_deadline_date_modifier" nicht gesetzt');
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
return;
}
$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->addJoin('public.tbl_student pts', 'prestudent_id');
$this->StudierendenantragModel->addSelect('pts.student_uid');
$this->StudierendenantragModel->db->where_in(
'public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)',
$this->config->item('antrag_prestudentstatus_whitelist')
);
$result = $this->StudierendenantragModel->getWithLastStatusWhere([
'typ' => Studierendenantrag_model::TYP_ABMELDUNG_STGL,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
's.insertamum <=' => $dateDeadline->format('c')
]);
if(isError($result))
{
$this->logError(getError($result));
}
else
{
$antraege = getData($result) ?: [];
$count = 0;
foreach ($antraege as $antrag)
{
$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 {
$deregisterStatus = getData($result);
$result = $this->antraglib->pauseAntrag($antrag->studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
if (isError($result))
$this->logError(getError($result));
$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' => 'UID: ' . $antrag->student_uid . ', PreStudentId: ' . $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 . "/" . count($antraege) . " Students set to Abbrecher");
}
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
}
/**
* Send Request to Student do Decide between Wiederholung and Verzicht
*
*/
public function sendAufforderungWiederholer()
{
$this->logInfo('Start Job sendAufforderungWiederholer');
$modifier_request_1 = $this->config->item('wiederholung_job_request_1_date_modifier');
$modifier_request_2 = $this->config->item('wiederholung_job_request_2_date_modifier');
$modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier');
$digi_start = $this->config->item('digitalization_start');
if ($digi_start) {
try {
$digi_start = new DateTime($digi_start);
} catch(Exception $e) {
}
}
if ($modifier_deadline) {
$dateDeadline = new DateTime();
$dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline));
if ($digi_start)
$dateDeadline = max($digi_start, $dateDeadline);
} else {
$dateDeadline = $digi_start ?: null;
}
//first request
if ($modifier_request_1) {
$dateStichtag = new DateTime();
$dateStichtag->sub(DateInterval::createFromDateString($modifier_request_1));
if (!$dateDeadline || $dateStichtag > $dateDeadline)
$this->sendReminder(
'Request1',
null,
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
$dateDeadline,
$dateStichtag,
$modifier_deadline,
'Aufforderung: Bekanntgabe Wiederholung'
);
} else
$this->logError('Config "wiederholung_job_request_1_date_modifier" nicht gesetzt');
//second request
if ($modifier_request_2) {
$dateStichtag = new DateTime();
$dateStichtag->sub(DateInterval::createFromDateString($modifier_request_2));
if (!$dateDeadline || $dateStichtag > $dateDeadline)
$this->sendReminder(
'Request2',
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
Studierendenantragstatus_model::STATUS_REQUESTSENT_2,
$dateDeadline,
$dateStichtag,
$modifier_deadline,
'Reminder Aufforderung: Bekanntgabe Wiederholung'
);
} else
$this->logError('Config "wiederholung_job_request_2_date_modifier" nicht gesetzt');
$this->logInfo('Ende Job sendAufforderungWiederholer');
}
protected function prestudentsGetUnique($prestudents)
{
$result = [];
foreach ($prestudents as $prestudent) {
if (!isset($result[$prestudent->prestudent_id]))
$result[$prestudent->prestudent_id] = $prestudent;
else {
if ($result[$prestudent->prestudent_id]->datum > $prestudent->datum)
$result[$prestudent->prestudent_id] = $prestudent;
}
}
return $result;
}
protected function sendReminder($name, $status_from, $status_to, $deadline, $date_stichtag, $modifier_deadline, $subject)
{
$this->logInfo('Start Job sendAufforderungWiederholer ' . $name);
$result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed($status_from, $date_stichtag, $deadline);
if(isError($result))
{
$this->logError(getError($result));
}
else
{
$prestudents = getData($result) ?: [];
$count = 0;
$prestudents = $this->prestudentsGetUnique($prestudents);
foreach ($prestudents as $prestudent)
{
$stg_kz = $prestudent->studiengang_kz;
if (in_array($stg_kz, $this->config->item('stgkz_blacklist_wiederholung')))
continue;
$url = site_url('lehre/Studierendenantrag/wiederholung/' . $prestudent->prestudent_id);
$urlCIS = CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/wiederholung/' . $prestudent->prestudent_id;
$email = $this->StudentModel->getEmailFH($this->StudentModel->getUID($prestudent->prestudent_id));
$fristende = new DateTime($prestudent->datum);
$fristende->add(DateInterval::createFromDateString($modifier_deadline));
$datum_kp = new DateTime($prestudent->datum);
$result = $this->StudiensemesterModel->getNextFrom($prestudent->studiensemester_kurzbz);
$next_sem = "";
$sem_after_next_sem = "";
if (hasData($result)) {
$next_sem = current(getData($result))->studiensemester_kurzbz;
$result = $this->StudiensemesterModel->getNextFrom($next_sem);
if (hasData($result)) {
$sem_after_next_sem = current(getData($result))->studiensemester_kurzbz;
}
}
$dataMail = array(
'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
'vorname' => $prestudent->vorname,
'nachname' => $prestudent->nachname,
'pers_kz'=> $prestudent->matrikelnr,
'stg' => $prestudent->bezeichnung,
'lvbezeichnung' => $prestudent->lvbezeichnung,
'datum_kp' => $datum_kp->format('d.m.Y'),
'studiensemester'=> $prestudent->studiensemester_kurzbz,
'Orgform'=> $prestudent->orgform,
'prestudent_id' => $prestudent->prestudent_id,
'url' => $url,
'urlCIS' => $urlCIS,
'fristablauf' => $fristende->format('d.m.Y'),
'pre_wiederholer_sem' => $next_sem,
'wiederholer_sem' => $sem_after_next_sem,
'sem' => $prestudent->ausbildungssemester
);
// NOTE(chris): Sancho mail
if(sendSanchoMail('Sancho_Mail_Antrag_W_' . $name, $dataMail, $email, $subject))
{
$antrag_id = null;
$result = $this->StudierendenantragModel->loadWhere([
'prestudent_id' => $prestudent->prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
]);
if (isError($result))
$this->logError(getError($result));
elseif (hasData($result))
$antrag_id = current(getData($result) ?: []) -> studierendenantrag_id;
if ($antrag_id == null)
{
$result = $this->StudierendenantragModel->insert([
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz'=> $prestudent->studiensemester_kurzbz,
'datum' => date('c'),
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'insertvon' => 'AntragJob'
]);
if (isError($result))
$this->logError(getError($result));
else
$antrag_id = getData($result);
}
if ($antrag_id)
{
$result = $this->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
'studierendenantrag_statustyp_kurzbz' => $status_to,
'insertvon' => 'AntragJob'
]);
if (isError($result))
$this->logError(getError($result));
}
$count++;
}
}
$this->logInfo($count . " Mails '" . $subject . "' sent");
}
$this->logInfo('Ende Job sendAufforderungWiederholer ' . $name);
}
}
+165
View File
@@ -0,0 +1,165 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
require_once('schedulers/ESIScheduler.php');
/**
* Controller for initialising generateESI job
*/
class ESIJob extends JQW_Controller
{
const ESI_PREFIX = 'urn:schac:personalUniqueCode:int:esi:at:';
const INSERT_VON = 'generateEsiJob';
/**
* Controller initialization
*/
public function __construct()
{
parent::__construct();
// load models
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('person/Kennzeichen_model', 'KennzeichenModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Initialises generateESI job, handles job queue, logs infos/errors
*/
public function generateESI()
{
//$jobType = 'DVUHSendPruefungsaktivitaeten';
$this->logInfo(ESIScheduler::JOB_TYPE_GENERATE_ESI.' job start');
// Gets the latest jobs
$lastJobs = $this->getLastJobs(ESIScheduler::JOB_TYPE_GENERATE_ESI);
if (isError($lastJobs))
{
$this->logError(getCode($lastJobs).': '.getError($lastJobs), ESIScheduler::JOB_TYPE_GENERATE_ESI);
}
else
{
$this->updateJobs(
getData($lastJobs), // Jobs to be updated
array(JobsQueueLib::PROPERTY_START_TIME), // Job properties to be updated
array(date('Y-m-d H:i:s')) // Job properties new values
);
$person_arr = $this->_getInputObjArray(getData($lastJobs));
foreach ($person_arr as $persobj)
{
if (!isset($persobj->person_id))
$this->logError("Error when generating ESI: invalid parameters");
else
{
$person_id = $persobj->person_id;
// check if there already is an active ESI
$this->KennzeichenModel->addSelect('1');
$activeKennzeichenRes = $this->KennzeichenModel->loadWhere(
array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ, 'aktiv' => true)
);
if (hasData($activeKennzeichenRes))
{
$this->logError("Active ESI for person Id $person_id already exists");
continue;
}
// get Matrikelnr for person for which ESI should be generated
$this->PersonModel->addSelect('matr_nr');
$personRes = $this->PersonModel->load($person_id);
if (!hasData($personRes))
{
$this->logError("Person with Id $person_id not found");
continue;
}
$matr_nr = getData($personRes)[0]->matr_nr;
if (isEmptyString($matr_nr))
{
$this->logError("Matrikelnummer for person with Id $person_id is empty");
continue;
}
$esi = self::ESI_PREFIX.$matr_nr;
// check if ESI was already used
$this->KennzeichenModel->addSelect('1');
$existingKennzeichenRes = $this->KennzeichenModel->loadWhere(
array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ, 'inhalt' => $esi)
);
if (hasData($existingKennzeichenRes))
{
$this->logError("ESI $esi for person Id $person_id already exists");
continue;
}
// if everything ok, save the esi for the person
$saveEsiResult = $this->KennzeichenModel->insert(
array(
'person_id' => $person_id,
'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ,
'inhalt' => $esi,
'aktiv' => true,
'insertvon' => self::INSERT_VON
)
);
if (isError($saveEsiResult))
{
$this->logError("Error when sending ESI, person Id $person_id ".getError($saveEsiResult));
}
}
}
// Update jobs properties values
$this->updateJobs(
getData($lastJobs), // Jobs to be updated
array(JobsQueueLib::PROPERTY_STATUS, JobsQueueLib::PROPERTY_END_TIME), // Job properties to be updated
array(JobsQueueLib::STATUS_DONE, date('Y-m-d H:i:s')) // Job properties new values
);
if (hasData($lastJobs)) $this->updateJobsQueue(ESIScheduler::JOB_TYPE_GENERATE_ESI, getData($lastJobs));
}
$this->logInfo(ESIScheduler::JOB_TYPE_GENERATE_ESI.' job stop');
}
// --------------------------------------------------------------------------------------------
// Private methods
/**
* Extracts input data from jobs.
* @param $jobs
* @return array with jobinput
*/
private function _getInputObjArray($jobs)
{
$mergedUsersArray = array();
if (count($jobs) == 0) return $mergedUsersArray;
foreach ($jobs as $job)
{
$decodedInput = json_decode($job->input);
if ($decodedInput != null)
{
foreach ($decodedInput as $el)
{
$mergedUsersArray[] = $el;
}
}
}
return $mergedUsersArray;
}
}
+28 -1
View File
@@ -22,7 +22,34 @@ class IssueResolver extends IssueResolver_Controller
'CORE_INOUT_0003' => 'CORE_INOUT_0003',
'CORE_INOUT_0004' => 'CORE_INOUT_0004',
'CORE_INOUT_0005' => 'CORE_INOUT_0005',
'CORE_INOUT_0006' => 'CORE_INOUT_0006'
'CORE_INOUT_0006' => 'CORE_INOUT_0006',
'CORE_INOUT_0007' => 'CORE_INOUT_0007',
'CORE_INOUT_0008' => 'CORE_INOUT_0008',
'CORE_INOUT_0009' => 'CORE_INOUT_0009',
'CORE_STG_0001' => 'CORE_STG_0001',
'CORE_STG_0002' => 'CORE_STG_0002',
'CORE_STG_0003' => 'CORE_STG_0003',
'CORE_STG_0004' => 'CORE_STG_0004',
'CORE_STUDENTSTATUS_0001' => 'CORE_STUDENTSTATUS_0001',
'CORE_STUDENTSTATUS_0002' => 'CORE_STUDENTSTATUS_0002',
'CORE_STUDENTSTATUS_0003' => 'CORE_STUDENTSTATUS_0003',
'CORE_STUDENTSTATUS_0004' => 'CORE_STUDENTSTATUS_0004',
'CORE_STUDENTSTATUS_0005' => 'CORE_STUDENTSTATUS_0005',
'CORE_STUDENTSTATUS_0006' => 'CORE_STUDENTSTATUS_0006',
'CORE_STUDENTSTATUS_0007' => 'CORE_STUDENTSTATUS_0007',
'CORE_STUDENTSTATUS_0008' => 'CORE_STUDENTSTATUS_0008',
'CORE_STUDENTSTATUS_0009' => 'CORE_STUDENTSTATUS_0009',
'CORE_STUDENTSTATUS_0010' => 'CORE_STUDENTSTATUS_0010',
'CORE_STUDENTSTATUS_0011' => 'CORE_STUDENTSTATUS_0011',
'CORE_STUDENTSTATUS_0012' => 'CORE_STUDENTSTATUS_0012',
'CORE_STUDENTSTATUS_0013' => 'CORE_STUDENTSTATUS_0013',
'CORE_STUDENTSTATUS_0014' => 'CORE_STUDENTSTATUS_0014',
'CORE_STUDENTSTATUS_0015' => 'CORE_STUDENTSTATUS_0015',
'CORE_STUDENTSTATUS_0016' => 'CORE_STUDENTSTATUS_0016',
'CORE_PERSON_0001' => 'CORE_PERSON_0001',
'CORE_PERSON_0002' => 'CORE_PERSON_0002',
'CORE_PERSON_0003' => 'CORE_PERSON_0003',
'CORE_PERSON_0004' => 'CORE_PERSON_0004'
);
}
}
@@ -0,0 +1,42 @@
<?php
/**
* Job for producing core Plausicheck issues
*/
class PlausiIssueProducer extends PlausiIssueProducer_Controller
{
private $_currentStudiensemester;
protected $_app = 'core';
public function __construct()
{
parent::__construct();
$this->load->library('issues/PlausicheckDefinitionLib');
// load models
$this->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
// get current Studiensemester
$studiensemesterRes = $this->StudiensemesterModel->getAkt();
if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz;
// set fehler which can be produced by the job
// structure: fehler_kurzbz => class (library) name for resolving
$this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings();
}
/**
* Runs issue production job.
* @param studiensemester_kurzbz string job is run for students of a certain semester.
* @param studiengang_kz int job is run for students of certain Studiengang.
*/
public function run($studiensemester_kurzbz = null, $studiengang_kz = null)
{
// get Studiensemester
if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester;
// producing issues for semester and optionally Studiengang
$this->producePlausicheckIssues(array('studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz));
}
}
@@ -3,6 +3,9 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
class ReihungstestJob extends JOB_Controller
{
const LAST_DAYS_PRESTUDENTSTATUS = 5;
/**
* Constructor
*/
@@ -464,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
');
@@ -727,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);
@@ -763,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)) {
@@ -826,7 +825,7 @@ class ReihungstestJob extends JOB_Controller
AND tbl_studiengang.typ IN ('b', 'm')
)
SELECT * FROM prst
WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - 1)
WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - ". self::LAST_DAYS_PRESTUDENTSTATUS .")
AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */
FROM prst prstb
WHERE studiengang_typ = 'b'
@@ -868,7 +867,8 @@ class ReihungstestJob extends JOB_Controller
tbl_person.nachname,
tbl_person.vorname,
tbl_prestudent.*,
tbl_studiengang.typ AS studiengang_typ
tbl_studiengang.typ AS studiengang_typ,
tbl_prestudentstatus.datum
FROM PUBLIC.tbl_person
JOIN PUBLIC.tbl_prestudent USING (person_id)
JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id)
@@ -901,7 +901,7 @@ class ReihungstestJob extends JOB_Controller
$mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][]
= $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
}
elseif ($rowNiedrPrios->laststatus == 'Bewerber')
elseif ($rowNiedrPrios->laststatus == 'Bewerber' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum)
{
// Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen
$lastStatus = $this->PrestudentstatusModel->getLastStatus($rowNiedrPrios->prestudent_id);
@@ -927,7 +927,7 @@ class ReihungstestJob extends JOB_Controller
= $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
}
}
elseif ($rowNiedrPrios->laststatus == 'Wartender')
elseif ($rowNiedrPrios->laststatus == 'Wartender' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum)
{
// Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen
// Mail zur Info an Assistenz schicken
@@ -1023,7 +1023,7 @@ class ReihungstestJob extends JOB_Controller
{
$studiengang = $this->StudiengangModel->load($stg);
$mailcontent = '';
$content = false;
foreach ($orgform AS $art=>$value)
{
// Orgform nur dazu schreiben, wenn es mehr als Eine gibt
@@ -1044,6 +1044,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
$mailcontent .= '</tbody></table><br><br>';
$content = true;
}
if (isset($value['AufnahmeHoeherePrio']) && !isEmptyArray($value['AufnahmeHoeherePrio']))
{
@@ -1058,6 +1059,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
$mailcontent .= '</tbody></table>';
$content = true;
}
if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio']))
{
@@ -1071,6 +1073,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
$mailcontent .= '</tbody></table>';
$content = true;
}
if ($bcc != '' && isset($value['AbgewiesenWeilBewerber']) && !isEmptyArray($value['AbgewiesenWeilBewerber']))
{
@@ -1085,13 +1088,14 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
$mailcontent .= '</tbody></table>';
$content = true;
}
}
$mailcontent_data_arr['table'] = $mailcontent;
// Send email in Sancho design
if (!isEmptyString($mailcontent))
if (!isEmptyString($mailcontent) && $content === true)
{
sendSanchoMail(
'Sancho_ReihungstestteilnehmerJob',
@@ -0,0 +1,108 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Scheduler for generating ESI (European Student Identifier)
*/
class ESIScheduler extends JQW_Controller
{
const JOB_TYPE_GENERATE_ESI = 'generateESI';
const KENNZEICHENTYP_KURZBZ = 'esi';
private $_active_status_kurzbz = array('Student', 'Diplomand');
/**
* Controller initialization
*/
public function __construct()
{
parent::__construct();
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Creates jobs queue entries for generateESI job.
* @param string $studiensemester_kurzbz semester for which ESIs should be generated
*/
public function generateESI($studiensemester_kurzbz = null)
{
// if no semester given, get current studiensemester
if (!isset($studiensemester_kurzbz))
{
$semRes = $this->StudiensemesterModel->getAkt();
if (hasData($semRes))
{
$studiensemester_kurzbz = getData($semRes)[0]->studiensemester_kurzbz;
}
}
if (isset($studiensemester_kurzbz))
{
$this->logInfo('Start job queue scheduler '.self::JOB_TYPE_GENERATE_ESI);
$qry = "
SELECT
DISTINCT person_id
FROM
public.tbl_person pers
JOIN public.tbl_prestudent ps USING (person_id)
JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
WHERE
pss.studiensemester_kurzbz = ?
AND pers.matr_nr IS NOT NULL
AND pss.status_kurzbz IN ?
AND NOT EXISTS ( -- has no ESI yet
SELECT 1
FROM
public.tbl_kennzeichen
WHERE
person_id = pers.person_id
AND kennzeichentyp_kurzbz = ?
AND aktiv
)
AND NOT EXISTS ( -- making sure it's not an incoming
SELECT 1
FROM
public.tbl_prestudentstatus
WHERE
prestudent_id = ps.prestudent_id
AND status_kurzbz = 'Incoming'
)";
$db = new DB_Model();
$jobInputResult = $db->execReadOnlyQuery($qry, array($studiensemester_kurzbz, $this->_active_status_kurzbz, self::KENNZEICHENTYP_KURZBZ));
// If an error occured then log it
if (isError($jobInputResult))
{
$this->logError(getError($jobInputResult));
}
elseif (hasData($jobInputResult)) // if persons found
{
// Add the new job to the jobs queue
$addNewJobResult = $this->addNewJobsToQueue(
self::JOB_TYPE_GENERATE_ESI, // job type
$this->generateJobs( // gnerate the structure of the new job
JobsQueueLib::STATUS_NEW,
json_encode(getData($jobInputResult))
)
);
// If error occurred return it
if (isError($addNewJobResult)) $this->logError(getError($addNewJobResult));
}
}
else
{
$this->logError('Error when getting Studiensemester');
}
$this->logInfo('End job queue scheduler '.self::JOB_TYPE_GENERATE_ESI);
}
}
@@ -0,0 +1,114 @@
<?php
if (!defined("BASEPATH")) exit("No direct script access allowed");
use vertragsbestandteil\VertragsbestandteilFactory;
/**
* Description of VertragsbestandteilTest
*
* @author bambi
*/
class VertragsbestandteilTest extends JOB_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('vertragsbestandteil/VertragsbestandteilLib',
null, 'VertragsbestandteilLib');
$this->load->library('vertragsbestandteil/GehaltsbestandteilLib',
null, 'GehaltsbestandteilLib');
}
public function testFetch()
{
$dienstverhaeltnis_id = 1;
$stichtag = null;
foreach($this->VertragsbestandteilLib->fetchVertragsbestandteile(
$dienstverhaeltnis_id, $stichtag) as $vertragsbestandteil)
{
//print_r($vertragsbestandteil);
echo $vertragsbestandteil . "\n";
}
}
public function testUpdate()
{
$now = new DateTime();
$data = new stdClass();
$data->vertragsbestandteil_id = 32;
$data->von = '2022-12-05';
$data->wochenstunden = 45.0;
$data->vertragsbestandteiltyp_kurzbz = VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_STUNDEN;
$vb = VertragsbestandteilFactory::getVertragsbestandteil($data);
try
{
$this->VertragsbestandteilLib->storeVertragsbestandteil($vb);
echo "Update successful.\n";
}
catch( Exception $ex )
{
echo "Update failed.\n";
}
}
public function testInsert()
{
$now = new DateTime();
$data = new stdClass();
$data->dienstverhaeltnis_id = 1;
$data->von = '2022-12-01';
$data->insertamum = $now->format(DateTime::ATOM);
$data->insertvon = 'ma0080';
$data->vertragsbestandteiltyp_kurzbz = VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_FUNKTION;
$data->benutzerfunktion_id = 112667;
$data->anmerkung = 'test funkton';
$data->kuendigungsrelevant = false;
$vb = VertragsbestandteilFactory::getVertragsbestandteil($data);
try
{
$this->VertragsbestandteilLib->storeVertragsbestandteil($vb);
echo "Insert successful.\n";
}
catch( Exception $ex )
{
echo "Insert failed.\n";
}
}
public function testGehaltsbestandteilInsert()
{
$data = new stdClass();
$data->gehaltsbestandteil_id = 2;
/*
$data->dienstverhaeltnis_id = 39;
$data->vertragsbestandteil_id = 123;
$data->gehaltstyp_kurzbz = 'zulage';
$data->von = '2023-04-01';
$data->bis = '2023-08-31';
$data->anmerkung = 'test anmerkung';
$data->grundbetrag = 100;
$data->betrag_valorisiert = 100;
$data->valorisierung = true;
*/
$data->auszahlungen = 12;
$gb = new \vertragsbestandteil\Gehaltsbestandteil();
$gb->hydrateByStdClass($data);
print_r($gb->toStdClass());
$this->GehaltsbestandteilLib->storeGehaltsbestandteil($gb);
}
}
@@ -0,0 +1,82 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \REST_Controller as REST_Controller;
/**
*/
class Attachment extends FHC_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
$this->load->library('DmsLib');
$this->load->library('AuthLib');
$this->load->library('PermissionLib');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @param integer $dms_id
*
* @return void
*/
public function show($dms_id)
{
$result = $this->StudierendenantragModel->loadWhere(['dms_id' => $dms_id]);
if (!getData($result))
return show_404();
if (!$this->permissionlib->isBerechtigt('student/antragfreigabe'))
{
$isSamePerson = false;
$antraege = getData($result);
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
foreach ($antraege as $antrag)
{
$prestudent = $this->PrestudentModel->load($antrag->prestudent_id);
if(hasData($prestudent))
{
if(current(getData($prestudent))->person_id == getAuthPersonId())
{
$isSamePerson = true;
break;
}
}
}
if ($isSamePerson == false)
{
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); // set the HTTP header as unauthorized
$this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
// Prints the main error message
$this->eprintflib->printError('You are not allowed to access to this content');
// Prints the called controller name
$this->eprintflib->printInfo('Controller name: '.$this->router->class);
// Prints the called controller method name
$this->eprintflib->printInfo('Method name: '.$this->router->method);
// Prints the required permissions needed to access to this method
$this->eprintflib->printInfo('Required permissions: student/antragfreigabe');
return show_error('You are not entitled to read this document');
}
}
$result = $this->dmslib->download($dms_id);
if (isError($result))
return show_error(getError($result));
$this->outputFile(getData($result));
}
}
@@ -0,0 +1,48 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
use \Studierendenantrag_model as Studierendenantrag_model;
use \REST_Controller as REST_Controller;
/**
*/
class Wiederholung extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'assistenz'=> 'student/studierendenantrag:w'
]);
$this->load->library('AntragLib');
// Load language phrases
$this->loadPhrases([
'studierendenantrag'
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
public function assistenz($antrag_id)
{
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
if (isError($result))
return show_error(getError($result));
if (!hasData($result))
return show_404();
$this->load->view('lehre/Antrag/Wiederholung/Student', [
'antrag_id' => $antrag_id,
'antrag' => getData($result)
]);
}
}
@@ -0,0 +1,188 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
*/
class Studierendenantrag extends FHC_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
// Load Libraries
$this->load->library('AuthLib');
$this->load->library('AntragLib');
// Load Models
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
// Load language phrases
$this->loadPhrases([
'studierendenantrag'
]);
if (strtolower($this->router->method) === 'leitung')
$this->_isAllowed([
'leitung' => ['student/studierendenantrag:r', 'student/antragfreigabe:r']
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
public function index()
{
$dataAntrag = $this->StudierendenantragModel->loadForPerson(getAuthPersonId());
if (isError($dataAntrag))
return show_error(getError($dataAntrag));
$dataAntrag = (getData($dataAntrag) ? : []);
$prestudentenArr = array();
foreach ($dataAntrag as $antrag)
{
if (!isset($prestudentenArr[$antrag->prestudent_id]))
{
$prestudentenArr[$antrag->prestudent_id] = array(
'allowedNewTypes' => array(),
'antraege'=> array(),
'bezeichnungStg' => $antrag->bezeichnung,
'bezeichnungOrgform' => $antrag->orgform
);
$result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id);
if (getData($result) == 1)
$prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung';
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id);
if (getData($result) == 1)
$prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung';
$result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id);
if (getData($result) == 1)
$prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung';
}
if ($antrag->studierendenantrag_id == null)
continue;
if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL && (!$antrag->isapproved))
continue;
$prestudentenArr[$antrag->prestudent_id]['antraege'][] = $antrag;
}
$this->load->view('lehre/Antrag/Student/List', [
'antraege' => $prestudentenArr
]);
}
public function leitung()
{
$stgL = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
$stgA = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: [];
$this->load->view('lehre/Antrag/Leitung/List', [
'stgA' => $stgA,
'stgL' => $stgL
]);
}
public function abmeldung($prestudent_id, $studierendenantrag_id = null)
{
$this->load->view('lehre/Antrag/Create', [
'prestudent_id' => $prestudent_id,
'studierendenantrag_id' => $studierendenantrag_id,
'antrag_type' => 'Abmeldung'
]);
}
public function abmeldungstgl($prestudent_id, $studierendenantrag_id = null)
{
$this->load->view('lehre/Antrag/Create', [
'prestudent_id' => $prestudent_id,
'studierendenantrag_id' => $studierendenantrag_id,
'antrag_type' => 'AbmeldungStgl'
]);
}
public function unterbrechung($prestudent_id, $studierendenantrag_id = null)
{
$this->load->view('lehre/Antrag/Create', [
'prestudent_id' => $prestudent_id,
'studierendenantrag_id' => $studierendenantrag_id,
'antrag_type' => 'Unterbrechung'
]);
}
public function wiederholung($prestudent_id, $studierendenantrag_id = null)
{
$this->load->view('lehre/Antrag/Create', [
'prestudent_id' => $prestudent_id,
'studierendenantrag_id' => $studierendenantrag_id,
'antrag_type' => 'Wiederholung'
]);
}
/**
* Checks if the caller is allowed to access to this content with the given permissions
* If it is not allowed will set the HTTP header with code 401
* Wrapper for permissionlib->isEntitled
*/
private function _isAllowed($requiredPermissions)
{
// Loads permission lib
$this->load->library('PermissionLib');
// Checks if this user is entitled to access to this content
if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method))
{
$this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized
$this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
// Prints the main error message
$this->eprintflib->printError('You are not allowed to access to this content');
// Prints the called controller name
$this->eprintflib->printInfo('Controller name: '.$this->router->class);
// Prints the called controller method name
$this->eprintflib->printInfo('Method name: '.$this->router->method);
// Prints the required permissions needed to access to this method
$this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method));
exit; // immediately terminate the execution
}
}
/**
* Converts an array of permissions to a string that contains them as a comma separated list
* Ex: "<permission 1>, <permission 2>, <permission 3>"
*/
private function _rpsToString($requiredPermissions, $method)
{
$strRequiredPermissions = ''; // string that contains all the required permissions needed to access to this method
if (isset($requiredPermissions[$method])) // if the called method is present in the permissions array
{
// If it is NOT then convert it into an array
$rpsMethod = $requiredPermissions[$method];
if (!is_array($rpsMethod))
{
$rpsMethod = array($rpsMethod);
}
// Copy all the permissions into $strRequiredPermissions separated by a comma
for ($i = 0; $i < count($rpsMethod); $i++)
{
$strRequiredPermissions .= $rpsMethod[$i].', ';
}
$strRequiredPermissions = rtrim($strRequiredPermissions, ', ');
}
return $strRequiredPermissions;
}
}
@@ -0,0 +1,187 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class AdminAnrechnung extends Auth_Controller
{
public function __construct()
{
// Set required permissions
parent::__construct(
array(
'index' => 'lehre/anrechnungszeitfenster:rw',
'save' => 'lehre/anrechnungszeitfenster:rw',
'edit' => 'lehre/anrechnungszeitfenster:rw',
'delete' => 'lehre/anrechnungszeitfenster:rw'
)
);
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
$this->load->library('AnrechnungLib');
// Load language phrases
$this->loadPhrases(
array(
'global',
'ui',
'lehre',
'anrechnung',
'table'
)
);
$this->_setAuthUID();
$this->setControllerId();
}
public function index()
{
// Set nearest Studiensemester as default
$result = $this->StudiensemesterModel->getNearest();
$studiensemester_kurzbz = hasData($result) ? getData($result)[0]->studiensemester_kurzbz : '';
// Get existing Anrechnungszeitraeume
$this->AnrechnungszeitraumModel->addOrder('anrechnungszeitraum_id', 'DESC');
$result = $this->AnrechnungszeitraumModel->load();
$anrechnungszeitraum_arr = hasData($result) ? getData($result) : array();
$viewData = array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'anrechnungszeitraum_arr' => $anrechnungszeitraum_arr
);
$this->load->view('lehre/anrechnung/adminAnrechnung.php', $viewData);
}
/**
* Save new Anrechnungszeitraum.
*/
public function save()
{
$this->_validate($this->input->post());
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$anrechnungstart = $this->input->post('anrechnungstart');
$anrechnungende = $this->input->post('anrechnungende');
$result = $this->AnrechnungszeitraumModel->insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende);
if (isError($result))
{
$this->terminateWithJsonError(getError($result));
}
if (hasData($result))
{
$this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result)));
}
}
/**
* Edit Anrechnungszeitraum.
*/
public function edit()
{
$this->_validate($this->input->post());
$anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$anrechnungstart = $this->input->post('anrechnungstart');
$anrechnungende = $this->input->post('anrechnungende');
$result = $this->AnrechnungszeitraumModel->updateAzr(
$anrechnungszeitraum_id,
$studiensemester_kurzbz,
$anrechnungstart,
$anrechnungende
);
if (isError($result))
{
$this->terminateWithJsonError(getError($result));
}
if (hasData($result))
{
$this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result)));
}
}
/**
* Delete Anrechnungszeitraum.
*/
public function delete()
{
$anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id');
$result = $this->AnrechnungszeitraumModel->deleteAzr($anrechnungszeitraum_id);
if (isError($result))
{
$this->terminateWithJsonError(getError($result));
}
if (hasData($result))
{
$this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result)));
}
}
/**
* Validates post parameters.
*
* @param $post
*/
private function _validate($post)
{
$studiensemester_kurzbz = $post['studiensemester_kurzbz'];
$anrechnungstart = $post['anrechnungstart'];
$anrechnungende = $post['anrechnungende'];
if (isEmptyString($studiensemester_kurzbz)
|| isEmptyString($anrechnungstart)
|| isEmptyString($anrechnungende))
{
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
if ($anrechnungstart > $anrechnungende)
{
$this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNachEndedatum'));
}
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$studiensemester = getData($result)[0];
if ($anrechnungstart < $studiensemester->start || $anrechnungstart > $studiensemester->ende)
{
$this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNichtInStudiensemester'));
}
if ($anrechnungende < $studiensemester->start || $anrechnungende > $studiensemester->ende)
{
$this->terminateWithJsonError($this->p->t('ui', 'errorEndedatumNichtInStudiensemester'));
}
}
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
}
@@ -33,6 +33,9 @@ class approveAnrechnungDetail extends Auth_Controller
)
);
//Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -90,7 +93,8 @@ class approveAnrechnungDetail extends Auth_Controller
$antragData = $this->anrechnunglib->getAntragData(
$anrechnungData->prestudent_id,
$anrechnungData->studiensemester_kurzbz,
$anrechnungData->lehrveranstaltung_id
$anrechnungData->lehrveranstaltung_id,
$anrechnungData->anrechnung_id
);
// Get Empfehlung data
@@ -209,71 +213,64 @@ class approveAnrechnungDetail extends Auth_Controller
*/
public function requestRecommendation()
{
$data = $this->input->post('data');
$anrechnung_id = $this->input->post('anrechnung_id');
if(isEmptyArray($data))
if(isEmptyString($anrechnung_id))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$retval = array();
$counter = 0;
// Check if Anrechnungs-LV has lector
if (!$this->anrechnunglib->LVhasLector($anrechnung_id))
{
$this->terminateWithJsonError('LV has no lector');
}
foreach ($data as $item)
{
// Check if Anrechnungs-LV has lector
if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id']))
{
// Count up LV with no lector
$counter++;
// Get Fachbereichsleitung or LV Leitung.
if($this->config->item('fbl') === TRUE)
{
$result = $this->anrechnunglib->getLeitungOfLvOe($anrechnung_id);
}
else
{
// If LV Leitung is not present, gets all LV lectors.
$result = $this->anrechnunglib->getLectors($anrechnung_id);
}
// Break, if LV has no lector
break;
}
$empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : '';
// Get full name of LV Leitung.
// If LV Leitung is not present, get full name of LV lectors.
$lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
$empfehlungsanfrage_an = !isEmptyArray($lector_arr)
? implode(', ', array_column($lector_arr, 'fullname'))
: '';
// Request Recommendation
if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
{
$retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
'empfehlung_anrechnung' => null,
'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'),
'empfehlungsanfrageAn' => $empfehlungsanfrage_an
);
}
}
/**
* Send mails to lectors
* NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
* even if they are required for more recommendations
* */
if (!isEmptyArray($retval))
{
self::_sendSanchoMailToLectors($retval);
// Output json to ajax
return $this->outputJsonSuccess($retval);
}
// Request Recommendation
if ($this->anrechnunglib->requestRecommendation($anrechnung_id))
{
$retval[]= array(
'anrechnung_id' => $anrechnung_id,
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
'empfehlung_anrechnung' => null,
'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'),
'empfehlungsanfrageAn' => $empfehlungsanfrage_an
);
}
// Output json to ajax
if (isEmptyArray($retval) && $counter > 0)
{
return $this->outputJsonError(
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
);
}
if ($empfehlungsanfrage_an == '')
{
$this->terminateWithJsonError(
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
);
}
return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
if (isEmptyArray($retval))
{
$this->terminateWithJsonError("Empfehlung wurde nicht angefordert");
}
else
{
// Output json to ajax
return $this->outputJsonSuccess($retval);
}
}
/**
@@ -467,39 +464,33 @@ class approveAnrechnungDetail extends Auth_Controller
/**
* Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv)
* @param $mail_params
* @param $anrechnung_id
* @return bool
*/
private function _sendSanchoMailToLectors($mail_params)
private function _sendSanchoMailToLectors($anrechnung_id)
{
// Get Lehrveranstaltungen
$anrechnung_arr = array();
foreach ($mail_params as $item)
{
$this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz');
$anrechnung_arr[]= array(
'lehrveranstaltung_id' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->lehrveranstaltung_id,
'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz
);
}
$anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR);
$lehrveranstaltung_id = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->lehrveranstaltung_id;
$studiensemester_kurzbz = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->studiensemester_kurzbz;
/**
* Get lectors (prio for LV-Leitung, if not present to all lectors of LV.
* Get mail receivers.
* If config is default (lectors): prio for LV-Leitung, if not present to all lectors of LV.
* Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
* **/
$lector_arr = $this->_getLectors($anrechnung_arr);
if ($this->config->item('fbl') === TRUE)
{
$receiver_arr = $this->_getLeitungOfLvOe($lehrveranstaltung_id);
}
else
{
$receiver_arr = $this->_getLectors($studiensemester_kurzbz, $lehrveranstaltung_id);
}
// Send mail to lectors
foreach ($lector_arr as $lector)
// Send mail
foreach ($receiver_arr as $receiver)
{
$to = $lector->uid;
$vorname = $lector->vorname;
$to = $receiver->uid. '@'. DOMAIN;;
$vorname = $receiver->vorname;
// Get full name of stgl
$this->load->model('person/Person_model', 'PersonModel');
@@ -537,35 +528,30 @@ class approveAnrechnungDetail extends Auth_Controller
* @param $anrechnung_arr
* @return array
*/
private function _getLectors($anrechnung_arr)
private function _getLectors($studiensemester_kurzbz, $lehrveranstaltung_id)
{
$lector_arr = array();
// Get lectors
foreach($anrechnung_arr as $anrechnung)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLecturersByLv($anrechnung['studiensemester_kurzbz'], $anrechnung['lehrveranstaltung_id']);
$result = $this->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id);
if (!$result = getData($result))
{
show_error('Failed retrieving lectors of Lehrveranstaltung');
}
if (!$result = getData($result))
{
show_error('Failed retrieving lectors of Lehrveranstaltung');
}
// Check if lv has LV-Leitung
$key = array_search(true, array_column($result, 'lvleiter'));
// Check if lv has LV-Leitung
$key = array_search(true, array_column($result, 'lvleiter'));
// If lv has LV-Leitung, keep only the one
if ($key !== false)
{
$lector_arr[]= $result[$key];
}
// ...otherwise keep all lectors
else
{
$lector_arr = array_merge($lector_arr, $result);
}
}
// If lv has LV-Leitung, keep only the one
if ($key !== false)
{
$lector_arr[]= $result[$key];
}
// ...otherwise keep all lectors
else
{
$lector_arr = array_merge($lector_arr, $result);
}
/**
* NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step
@@ -584,6 +570,14 @@ class approveAnrechnungDetail extends Auth_Controller
}
// Get Leitungen of Lehrveranstaltungs-Organisationseinheit
private function _getLeitungOfLvOe($lehrveranstaltung_id)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($lehrveranstaltung_id);
return hasData($result) ? getData($result) : show_error('Failed retrieving Leitung of Lehrveranstaltungs-Organisationseinheit');
}
private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id)
{
$this->load->model('person/Notiz_model', 'NotizModel');
@@ -606,8 +600,5 @@ class approveAnrechnungDetail extends Auth_Controller
trim($empfehlungstext),
$this->_uid
);
}
}
@@ -28,6 +28,9 @@ class approveAnrechnungUebersicht extends Auth_Controller
)
);
// Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -78,6 +81,19 @@ class approveAnrechnungUebersicht extends Auth_Controller
show_error(getError($studiengang_kz_arr));
}
// Get oes the user is entitled for
$oe_kurzbz_arr_schreibberechtigt = array();
if ($oe_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN))
{
foreach($oe_arr as $oe)
{
$berechtigt = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $oe);
if ($berechtigt) $oe_kurzbz_arr_schreibberechtigt[]= $oe;
}
}
// Check if permission is readonly
$hasReadOnlyAccess =
$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's')
&& !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid');
@@ -87,9 +103,11 @@ class approveAnrechnungUebersicht extends Auth_Controller
$viewData = array(
'studiensemester_selected' => $studiensemester_kurzbz,
'studiengaenge_entitled' => $studiengang_kz_arr,
'studiengaenge_entitled' => $studiengang_kz_arr, // alle STG mit Lese- und Schreibberechtigung
'oes_schreibberechtigt' => $oe_kurzbz_arr_schreibberechtigt, // alle STG nur mit Schreibberechtigung
'hasReadOnlyAccess' => $hasReadOnlyAccess,
'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess
'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess,
'configFachbereichsleitung' => $this->config->item('fbl')
);
$this->load->view('lehre/anrechnung/approveAnrechnungUebersicht.php', $viewData);
@@ -207,14 +225,20 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Request Recommendation
if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
{
// Get full name of LV Leitung.
// If LV Leitung is not present, get full name of LV lectors.
$lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
$empfehlungsanfrage_an = !isEmptyArray($lector_arr)
? implode(', ', array_column($lector_arr, 'fullname'))
: '';
// Get full name of Fachbereichsleitung or LV Leitung.
if($this->config->item('fbl') === TRUE)
{
$result = $this->anrechnunglib->getLeitungOfLvOe($item['anrechnung_id']);
}
else
{
// If LV Leitung is not present, get full name of LV lectors.
$result = $this->anrechnunglib->getLectors($item['anrechnung_id']);
}
$retval[]= array(
$empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : '';
$retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
@@ -225,23 +249,18 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
}
/**
* Send mails to lectors
* NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
* even if they are required for more recommendations
* */
if (!isEmptyArray($retval))
{
self::_sendSanchoMailToLectors($retval);
}
// Output json to ajax
if (isEmptyArray($retval) && $counter == 0)
if (isEmptyArray($retval))
{
return $this->outputJsonError('Es wurden keine Empfehlungen angefordert');
if ($counter > 0)
{
$this->terminateWithJsonError('Bei '. $counter.' LV sind keine LektorInnen zugeteilt.');
}
$this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert');
}
return $this->outputJsonSuccess($retval);
$this->outputJsonSuccess($retval);
}
/**
@@ -316,7 +335,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
* @param $mail_params
* @return bool
*/
private function _sendSanchoMailToLectors($mail_params)
private function _sendSanchoMail($mail_params)
{
// Get Lehrveranstaltungen
$anrechnung_arr = array();
@@ -332,18 +351,25 @@ class approveAnrechnungUebersicht extends Auth_Controller
$anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR);
/**
* Get lectors (prio for LV-Leitung, if not present to all lectors of LV.
* Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
* **/
$lector_arr = $this->_getLectors($anrechnung_arr);
/**
* Get mail receivers.
* If retrieving lectors: prio for LV-Leitung, if not present to all lectors of LV.
* This function will receive a unique array to avoid sending more mails to one and the same user.
**/
if($this->config->item('fbl') === TRUE)
{
$receiver_arr = $this->_getLeitungOfLvOe($anrechnung_arr);
}
else
{
$receiver_arr = $this->_getLectors($anrechnung_arr);
}
// Send mail to lectors
foreach ($lector_arr as $lector)
foreach ($receiver_arr as $receiver)
{
$to = $lector->uid;
$vorname = $lector->vorname;
$to = $receiver->uid. '@'. DOMAIN;
$vorname = $receiver->vorname;
// Get full name of stgl
$this->load->model('person/Person_model', 'PersonModel');
@@ -427,4 +453,34 @@ class approveAnrechnungUebersicht extends Auth_Controller
return $lector_arr;
}
/**
* Get Leitungen of Lehrveranstaltungs-Organisationseinheit with unique uids.
*
* @param $anrechnung_arr
* @return array
*/
private function _getLeitungOfLvOe($anrechnung_arr)
{
$oeLeitung_arr = array();
// Get Leitungen
foreach($anrechnung_arr as $anrechnung)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($anrechnung['lehrveranstaltung_id']);
if (!hasData($result))
{
show_error('No Leitung found');
}
$oeLeitung_arr = array_merge($oeLeitung_arr, getData($result));
}
// Make array unique
$oeLeitung_arr = array_unique($oeLeitung_arr, SORT_REGULAR);
return $oeLeitung_arr;
}
}
@@ -80,11 +80,7 @@ class requestAnrechnung extends Auth_Controller
$prestudent_id = getData($result)[0]->prestudent_id;
// Check if application deadline is expired
$is_expired = self::_isExpired(
$this->config->item('submit_application_start'),
$this->config->item('submit_application_end'),
$studiensemester_kurzbz
);
$is_expired = $this->_isExpired($studiensemester_kurzbz);
// Check if Lehrveranstaltung was already graded with application blocking grades
$is_blocked = self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id);
@@ -93,7 +89,7 @@ class requestAnrechnung extends Auth_Controller
$anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
// Get Antrag data
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id);
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id);
$viewData = array(
'antragData' => $antragData,
@@ -115,6 +111,13 @@ class requestAnrechnung extends Auth_Controller
$lehrveranstaltung_id = $this->input->post('lv_id');
$studiensemester_kurzbz = $this->input->post('studiensemester');
$bestaetigung = $this->input->post('bestaetigung');
$begruendung_ects = $this->config->item('explain_equivalence') === TRUE
? $this->input->post('begruendung_ects')
: NULL;
$begruendung_lvinhalt = $this->config->item('explain_equivalence') === TRUE
? $this->input->post('begruendung_lvinhalt')
: NULL;
// Validate data
if (empty($_FILES['uploadfile']['name']))
@@ -125,7 +128,9 @@ class requestAnrechnung extends Auth_Controller
if (isEmptyString($begruendung_id) ||
isEmptyString($anmerkung) ||
isEmptyString($lehrveranstaltung_id) ||
isEmptyString($studiensemester_kurzbz))
isEmptyString($studiensemester_kurzbz) ||
($this->config->item('explain_equivalence') === TRUE && isEmptyString($begruendung_ects)) ||
($this->config->item('explain_equivalence') === TRUE && isEmptyString($begruendung_lvinhalt)))
{
return $this->outputJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
@@ -152,10 +157,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
@@ -168,7 +173,7 @@ class requestAnrechnung extends Auth_Controller
// Hold just inserted DMS ID
$lastInsert_dms_id = $result->retval['dms_id'];
// Save Anrechnung and Anrechnungstatus
$result = $this->AnrechnungModel->createAnrechnungsantrag(
$prestudent_id,
@@ -176,7 +181,9 @@ class requestAnrechnung extends Auth_Controller
$lehrveranstaltung_id,
$begruendung_id,
$lastInsert_dms_id,
$anmerkung
$anmerkung,
$begruendung_ects,
$begruendung_lvinhalt
);
if (isError($result))
@@ -234,32 +241,30 @@ class requestAnrechnung extends Auth_Controller
* @return bool True if deadline is expired
* @throws Exception
*/
private function _isExpired($start, $ende, $studiensemester_kurzbz)
private function _isExpired($studiensemester_kurzbz)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$today = new DateTime('today midnight');
// If start is not given, set to Semesterstart.
if (!isset($start) || isEmptyString($start))
{
$this->StudiensemesterModel->addSelect('start');
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$start = getData($result)[0]->start;
}
// Load all Anrechnungszeitfenster for this Studiensemester
$this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel');
$result = $this->AnrechnungszeitraumModel->loadWhere(array('studiensemester_kurzbz' => $studiensemester_kurzbz));
// If ende is not given, set to Semesterende.
if (!isset($ende) || isEmptyString($ende))
{
$this->StudiensemesterModel->addSelect('ende');
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$ende = getData($result)[0]->ende;
}
if (hasData($result))
{
// Loop through Anrechnungszeitfenster
foreach (getData($result) as $azrObj)
{
$start = new DateTime($azrObj->anrechnungstart);
$ende = new DateTime($azrObj->anrechnungende);
$today = new DateTime('today midnight');
$start = new DateTime($start);
$ende = new DateTime($ende);
// Return false if today is at least within one Anrechnungszeitraum
if (($today >= $start && $today <= $ende)) return false;
// True if expired
return ($today < $start || $today > $ende);
}
}
// Return true if today is in none Anrechnungszeitraum
return true;
}
/**
@@ -312,18 +317,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)
@@ -28,6 +28,9 @@ class reviewAnrechnungDetail extends Auth_Controller
)
);
// Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -84,16 +87,21 @@ class reviewAnrechnungDetail extends Auth_Controller
$antragData = $this->anrechnunglib->getAntragData(
$anrechnungData->prestudent_id,
$anrechnungData->studiensemester_kurzbz,
$anrechnungData->lehrveranstaltung_id
$anrechnungData->lehrveranstaltung_id,
$anrechnungData->anrechnung_id
);
// Get Empfehlung data
$empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id);
// False if LV-Leitung is present and user is not LV-Leitung. Otherwise always true.
$isEmpfehlungsberechtigt = $this->anrechnunglib->isEmpfehlungsberechtigt($anrechnung_id);
$viewData = array(
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'empfehlungData' => $empfehlungData
'empfehlungData' => $empfehlungData,
'isEmpfehlungsberechtigt' => $isEmpfehlungsberechtigt
);
$this->load->view('lehre/anrechnung/reviewAnrechnungDetail.php', $viewData);
@@ -140,10 +148,13 @@ class reviewAnrechnungDetail extends Auth_Controller
* Send mails to STGL (if not present STGL, send to STGL assistance)
* NOTE: mails are sent at the end to ensure sending only one mail to each STGL
* */
if (!$this->_sendSanchoMails($json, true))
{
return $this->outputJsonError('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, true))
{
return $this->outputJsonError('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
@@ -191,10 +202,13 @@ class reviewAnrechnungDetail extends Auth_Controller
if (isset($json) && !isEmptyArray($json))
{
// Send mails to STGL (if not present STGL, send to STGL assistance)
if (!$this->_sendSanchoMails($json, false))
{
return $this->outputJsonError('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, false))
{
return $this->outputJsonError('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
@@ -253,8 +267,14 @@ class reviewAnrechnungDetail extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel
->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
if($this->config->item('fbl') === TRUE)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id);
}
else
{
$result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
}
if($result = getData($result))
{
@@ -282,14 +302,20 @@ class reviewAnrechnungDetail extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel
->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
if($this->config->item('fbl') === TRUE)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id);
}
else
{
$result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
}
if($result = getData($result))
{
$entitled_lector_arr = array_column($result, 'uid');
$entitled_uid_arr = array_column($result, 'uid');
if (in_array($this->_uid, $entitled_lector_arr))
if (in_array($this->_uid, $entitled_uid_arr))
{
return;
}
@@ -26,6 +26,9 @@ class reviewAnrechnungUebersicht extends Auth_Controller
)
);
// Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -72,7 +75,8 @@ class reviewAnrechnungUebersicht extends Auth_Controller
}
$viewData = array(
'studiensemester_selected' => $studiensemester_kurzbz
'studiensemester_selected' => $studiensemester_kurzbz,
'configFachbereichsleitung' => $this->config->item('fbl')
);
$this->load->view('lehre/anrechnung/reviewAnrechnungUebersicht.php', $viewData);
@@ -111,16 +115,19 @@ class reviewAnrechnungUebersicht extends Auth_Controller
* Send mails to STGL (if not present STGL, send to STGL assistance)
* NOTE: mails are sent at the end to ensure sending only one mail to each STGL
* */
if (!$this->_sendSanchoMails($json, true))
{
show_error('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, true))
{
show_error('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
else
{
return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
$this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -154,10 +161,13 @@ class reviewAnrechnungUebersicht extends Auth_Controller
if (isset($json) && !isEmptyArray($json))
{
// Send mails to STGL (if not present STGL, send to STGL assistance)
if (!$this->_sendSanchoMails($json, false))
{
show_error('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, false))
{
show_error('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
@@ -217,14 +227,20 @@ class reviewAnrechnungUebersicht extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel
->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
if ($this->config->item('fbl') === TRUE)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id);
}
else
{
$result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
}
if($result = getData($result))
{
$entitled_lector_arr = array_column($result, 'uid');
$entitled_uid_arr = array_column($result, 'uid');
if (in_array($this->_uid, $entitled_lector_arr))
if (in_array($this->_uid, $entitled_uid_arr))
{
return;
}
@@ -35,6 +35,7 @@ class LehrauftragAkzeptieren extends Auth_Controller
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('codex/Bisverwendung_model', 'BisverwendungModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('vertragsbestandteil/Dienstverhaeltnis_model', 'DienstverhaeltnisModel');
// Load libraries
$this->load->library('WidgetLib');
@@ -94,9 +95,9 @@ class LehrauftragAkzeptieren extends Auth_Controller
'lektor' => true,
'aktiv' => true
));
$is_external_lector = hasData($result) ? true : false;
$view_data = array(
'studiensemester_selected' => $studiensemester_kurzbz,
'is_external_lector' => $is_external_lector
@@ -207,15 +208,41 @@ class LehrauftragAkzeptieren extends Auth_Controller
*/
public function checkInkludierteLehre()
{
$result = $this->BisverwendungModel->getLast($this->_uid, false);
if (hasData($result))
if(defined('DIENSTVERHAELTNIS_SUPPORT') && DIENSTVERHAELTNIS_SUPPORT)
{
$this->outputJsonSuccess(!is_null($result->retval[0]->inkludierte_lehre) && $result->retval[0]->inkludierte_lehre != 0);
// Bei neuer Vertragsstruktur wird nur anhand des echten DVs entschieden ob eine Anzeige
// des Stundensatzes erfolgt oder nicht.
$result = $this->DienstverhaeltnisModel->getDVByPersonUID($this->_uid, null, date('Y-m-d'));
if (hasData($result))
{
$data = getData($result);
foreach($data as $row)
{
if($row->vertragsart_kurzbz == 'echterdv')
$this->outputJsonSuccess(true);
else
$this->outputJsonSuccess(false);
}
}
else
{
$this->outputJsonError(getError($result));
}
}
else
{
$this->outputJsonError(getError($result));
// DEPRECATED
$result = $this->BisverwendungModel->getLast($this->_uid, false);
if (hasData($result))
{
$this->outputJsonSuccess(!is_null($result->retval[0]->inkludierte_lehre) && $result->retval[0]->inkludierte_lehre != 0);
}
else
{
$this->outputJsonError(getError($result));
}
}
}
@@ -78,8 +78,8 @@ class Gruppenmanagement extends Auth_Controller
}
/**
* Gets Benutzer assigned to a Gruppe
*/
* Gets Benutzer assigned to a Gruppe
*/
public function getBenutzer()
{
$gruppe_kurzbz = $this->input->get('gruppe_kurzbz');
@@ -93,8 +93,8 @@ class Gruppenmanagement extends Auth_Controller
}
/**
* Gets all Benutzer for assignment to Gruppe
*/
* Gets all Benutzer for assignment to Gruppe
*/
public function getAllBenutzer()
{
$this->BenutzerModel->addSelect('uid, vorname, nachname');
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Components extends FHC_Controller
{
/**
* @return void
*/
public function primevue(...$args)
{
$path = implode('/', $args);
$target = FHCPATH . 'vendor/npm-asset/primevue/' . $path;
if (!file_exists($target))
return show_404();
$newUrl = str_repeat('../', count($args));
$ext = substr($path, -7) == '.min.js' ? '.esm.min.js' : '.esm.js';
$contents = file_get_contents($target);
$contents = preg_replace_callback('/import([^;]*)from\s*[\'"]vue[\'"];/i', function ($matches) {
return 'let ' . str_replace(' as ', ': ', $matches[1]) . ' = Vue;';
}, $contents);
$contents = preg_replace_callback('/(import[^;]*[\'"])(primevue[^\'"]+)([\'"])/i', function ($matches) use ($ext, $newUrl) {
if (is_file(FHCPATH . 'vendor/npm-asset/' . $matches[2])) {
$newUrl .= $matches[2];
} else {
$testfile = $matches[2] . '/index' . $ext;
if (file_exists(FHCPATH . 'vendor/npm-asset/' . $testfile))
$newUrl .= $testfile;
else
$newUrl .= $matches[2] . strrchr($matches[2], '/') . $ext;
}
return $matches[1] . $newUrl . $matches[3];
}, $contents);
$this->output->set_content_type('text/javascript');
$this->output->set_output($contents);
}
}
@@ -0,0 +1,759 @@
<?php
/*
* Job zur einmaligen Migration der Mitarbeiterverträge aus der tbl_bisverwendung in die neue
* Vertragsstruktur im HR Schema
*
* Aufruf pro Person
* php index.ci.php system/MigrateContract/index/oesi
*
* Aufruf fuer Alle
* php index.ci.php system/MigrateContract/index
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class MigrateContract extends CLI_Controller
{
private $matching_ba1_vertragsart;
private $OE_DEFAULT;
protected $configerrors;
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('codex/bisverwendung_model', 'BisVerwendungModel');
$this->load->model('person/benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->config('migratecontract');
$this->OE_DEFAULT = $this->config->item('migratecontract_oe_default');
$this->matching_ba1_vertragsart = $this->config->item('migratecontract_matching_ba1_vertragsart');
$this->configerrors = array();
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
public function checkConfig()
{
echo "OE_DEFAULT: " . $this->OE_DEFAULT . "\n";
echo "matching_ba1_vertragsart: " . print_r($this->matching_ba1_vertragsart, true);
$this->checkOE_DEFAULT();
$this->checkMatching_ba1_vertragsart();
if( count($this->configerrors) > 0 )
{
foreach($this->configerrors AS $configerror)
{
echo $configerror . "\n";
}
die("Fehler in der Konfiguration. Abbruch!\n");
}
else
{
echo "Konfiguration OK.\n";
}
}
protected function checkOE_DEFAULT()
{
$db = new DB_Model();
$oesql = 'SELECT * FROM public.tbl_organisationseinheit WHERE oe_kurzbz = ?';
$oeres = $db->execReadOnlyQuery($oesql, array($this->OE_DEFAULT));
if( !hasData($oeres) )
{
$this->configerrors[] = 'Default Organisationseinheit: "'
. $this->OE_DEFAULT . '" nicht gefunden.';
}
}
protected function checkMatching_ba1_vertragsart() {
$db = new DB_Model();
foreach( $this->matching_ba1_vertragsart AS $vertragsart_kurzbz )
{
$vasql = 'SELECT * FROM hr.tbl_vertragsart WHERE vertragsart_kurzbz = ?';
$vares = $db->execReadOnlyQuery($vasql, array($vertragsart_kurzbz));
if( !hasData($vares) )
{
$this->configerrors[] = 'Vertragsart "' . $vertragsart_kurzbz
. '" nicht gefunden.';
}
}
}
/**
* Everything has a beginning
*/
public function index($user = null)
{
$this->checkConfig();
if (!is_null($user))
{
$contracts = $this->_transformUser($user);
/*
Format:
$contracts['dv'][]['vbs'][]
*/
//$this->outputJson($contracts);
var_dump($contracts);
$this->_saveJSON($contracts);
}
else
{
$qry = "SELECT distinct mitarbeiter_uid FROM bis.tbl_bisverwendung";
$db = new DB_Model();
$resultUser = $db->execReadOnlyQuery($qry);
if (hasData($resultUser))
{
$users = getData($resultUser);
foreach($users as $user)
{
$contracts = $this->_transformUser($user->mitarbeiter_uid);
$this->_saveJSON($contracts);
}
}
}
}
private function _saveJSON($contracts)
{
$this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
$this->load->model('vertragsbestandteil/Vertragsbestandteil_model','VertragsbestandteilModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilStunden_model','VertragsbestandteilStundenModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model','VertragsbestandteilZeitaufzeichnungModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilFreitext_model','VertragsbestandteilFreitextModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilFunktion_model','VertragsbestandteilFunktionModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilKarenz_model','VertragsbestandteilKarenzModel');
$failed = false;
$this->db->trans_begin();
foreach($contracts['dv'] as $row_dv)
{
// Dienstvertrag erstellen
$resultDV = $this->DienstverhaeltnisModel->insert(
array(
'mitarbeiter_uid' => $row_dv['mitarbeiter_uid'],
'vertragsart_kurzbz' => $row_dv['vertragsart_kurzbz'],
'oe_kurzbz' => $row_dv['oe_kurzbz'],
'von' => $row_dv['von'],
'bis' => $row_dv['bis'],
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'MigrateContract'
)
);
if (isSuccess($resultDV) && hasData($resultDV))
{
$dv_id = getData($resultDV);
// Vertragsbetandteile erstellen
foreach($row_dv['vbs'] as $row_vbs)
{
$resultVBS = $this->VertragsbestandteilModel->insert(
array(
'dienstverhaeltnis_id' => $dv_id,
'vertragsbestandteiltyp_kurzbz' => $row_vbs['vertragsbestandteiltyp_kurzbz'],
'von' => $row_vbs['von'],
'bis' => $row_vbs['bis'],
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'MigrateContract'
)
);
if (isSuccess($resultVBS) && hasData($resultVBS))
{
$vbs_id = getData($resultVBS);
echo 'VBS:'.$vbs_id;
switch($row_vbs['vertragsbestandteiltyp_kurzbz'])
{
case 'stunden':
$resultVBS = $this->_insertVBSStunden($vbs_id, $row_vbs);
break;
case 'zeitaufzeichnung':
$resultVBS = $this->_insertVBSZeitaufzeichnung($vbs_id, $row_vbs);
break;
case 'funktion':
$resultVBS = $this->_insertVBSFunktion($vbs_id, $row_vbs);
break;
case 'freitext':
$resultVBS = $this->_insertVBSFreitext($vbs_id, $row_vbs);
break;
case 'karenz':
$resultVBS = $this->_insertVBSKarenz($vbs_id, $row_vbs);
break;
}
if (isError($resultVBS))
{
echo "FAILED:".getError($resultVBS);
$failed = true;
}
}
else
{
$failed = true;
}
}
}
else
{
$failed = true;
}
}
if(!$failed)
{
$this->db->trans_commit();
}
else
{
echo "ROLLBACK";
$this->db->trans_rollback();
}
}
private function _insertVBSKarenz($vbs_id, $row_vbs)
{
return $this->VertragsbestandteilKarenzModel->insert(
array(
'vertragsbestandteil_id' => $vbs_id,
'karenztyp_kurzbz' => $row_vbs['karenztyp_kurzbz']
)
);
}
private function _insertVBSFreitext($vbs_id, $row_vbs)
{
return $this->VertragsbestandteilFreitextModel->insert(
array(
'vertragsbestandteil_id' => $vbs_id,
'freitexttyp_kurzbz' => $row_vbs['freitexttyp_kurzbz'],
'titel' => $row_vbs['titel'],
'anmerkung' => $row_vbs['anmerkung']
)
);
}
private function _insertVBSFunktion($vbs_id, $row_vbs)
{
return $this->VertragsbestandteilFunktionModel->insert(
array(
'vertragsbestandteil_id' => $vbs_id,
'benutzerfunktion_id' => $row_vbs['benutzerfunktion_id']
)
);
}
private function _insertVBSZeitaufzeichnung($vbs_id, $row_vbs)
{
return $this->VertragsbestandteilZeitaufzeichnungModel->insert(
array(
'vertragsbestandteil_id' => $vbs_id,
'zeitaufzeichnung' => $row_vbs['zeitaufzeichnung'],
'azgrelevant' => $row_vbs['azgrelevant'],
'homeoffice' => $row_vbs['homeoffice']
)
);
}
private function _insertVBSStunden($vbs_id, $row_vbs)
{
return $this->VertragsbestandteilStundenModel->insert(
array(
'vertragsbestandteil_id' => $vbs_id,
'wochenstunden' => $row_vbs['wochenstunden'],
'teilzeittyp_kurzbz' => $row_vbs['teilzeittyp_kurzbz']
)
);
}
/**
* Ermittelt die neue Vertragsstruktur fuer einen User
*/
private function _transformUser($user)
{
$contracts = array();
$this->BisVerwendungModel->addOrder('beginn');
$result_verwendung = $this->BisVerwendungModel->loadWhere(array("mitarbeiter_uid" => $user));
if (isError($result_verwendung))
die("Failed to load Verwendung");
if (hasData($result_verwendung))
{
$verwendung = getData($result_verwendung);
foreach ($verwendung as $row_verwendung)
{
$dv = $this->_getOrCreateDV($contracts, $row_verwendung);
// Ende des DV aktualisieren
if ($contracts['dv'][$dv]['bis'] < $row_verwendung->ende || $row_verwendung->ende == '')
$contracts['dv'][$dv]['bis'] = $row_verwendung->ende;
// Stundenbestandteil pruefen
$this->_addVertragsbestandteilStunden($contracts, $dv, $row_verwendung);
// Befristung
$this->_addVertragsbestandteilFreitextBefristung($contracts, $dv, $row_verwendung);
// All-In
$this->_addVertragsbestandteilFreitextAllIn($contracts, $dv, $row_verwendung);
// Zeitaufzeichnung
$this->_addVertragsbestandteilZeitaufzeichnung($contracts, $dv, $row_verwendung);
// Karenz
$this->_addVertragsbestandteilKarenz($contracts, $dv, $row_verwendung);
// Inkludierte Lehre
// Kuendigungsfrist
// Urlaubsanspruch
}
// Funktion
$this->_addVertragsbestandteilFunktion($contracts, $user);
}
return $contracts;
}
/**
* Fuegt Karenzierungseintraege zu bestehenden Dienstverhaeltnissen hinzu
*/
private function _addVertragsbestandteilKarenz(&$contracts, $dv, $row_verwendung)
{
if ($row_verwendung->beschausmasscode == 5)
{
$dtstart = new DateTime($row_verwendung->beginn);
$dtende = new DateTime($row_verwendung->ende);
$interval = $dtende->diff($dtstart);
$dauer = $interval->format('%a');
// TODO: klären ob das so machbar ist
if ($dauer < 65)
$karenztyp = 'papamonat';
elseif ($dauer < 120)
$karenztyp = 'bildungskarenz';
else
$karenztyp = 'elternkarenz';
// VBS anlegen und Funktion zuweisen
$newVBSIndex = $this->_getNewVBSIndex($contracts, $dv);
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['vertragsbestandteiltyp_kurzbz'] = 'karenz';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['von'] = $row_verwendung->beginn;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['bis'] = $row_verwendung->ende;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['karenztyp_kurzbz'] = $karenztyp;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['geplanter_geburtstermin'] = null;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['tatsaechlicher_geburtstermin'] = null;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['hint'] = 'Dauer:'.$dauer;
}
}
/**
* Holt die Funktionen die Vertragsrelevant sind und verknüpft diese
*/
private function _addVertragsbestandteilFunktion(&$contracts, $user)
{
// Alle Funktionen holen die Vertragsrelevant sind
$this->BenutzerfunktionModel->addOrder('datum_von');
$this->BenutzerfunktionModel->addJoin('public.tbl_funktion','funktion_kurzbz');
$resultFunktionen = $this->BenutzerfunktionModel->loadWhere(array('uid' => $user, 'vertragsrelevant' => true));
if (isSuccess($resultFunktionen) && hasData($resultFunktionen))
{
$funktionen = getData($resultFunktionen);
foreach ($funktionen as $row_funktion)
{
$funktion_added = 0;
$dv = '';
// Passendes DV suchen
foreach ($contracts['dv'] as $key_dv => $row_contract)
{
// Eine Funktion kann zu mehreren DV zugeordnet sein
// es werden daher alle durchsucht ob es reinfaellt und ggf mehrfach zugeordnet
if ((isset($row_funktion->datum_von) && $row_funktion->datum_von >= $row_contract['von'])
&& ($row_contract['bis'] == '' || $row_contract['bis'] >= $row_funktion->datum_von)
&& (
(
isset($row_funktion->datum_bis) && isset($row_contract['bis'])
&& $row_funktion->datum_bis <= $row_contract['bis']
)
|| $row_funktion->datum_bis == ''
|| (isset($row_funktion->datum_bis) && !isset($row_contract['bis']))
)
)
{
$dv = $key_dv;
// Startdatum und Endedatum ermitteln wenn die Funktion ueber das DV hinausgeht
// Wenn die Dauer laenger ist, wird beim Beginn/Ende des DV abgegrenzt
$dtstart_fkt = new DateTime($row_funktion->datum_von);
$dtstart_dv = new DateTime($row_contract['von']);
if ($dtstart_fkt < $dtstart_dv)
$startdatum = $row_contract['von'];
else
$startdatum = $row_funktion->datum_von;
$dtende_fkt = new DateTime($row_funktion->datum_bis);
$dtende_dv = new DateTime($row_contract['bis']);
if ($dtende_fkt < $dtende_dv)
$endedatum = $row_funktion->datum_bis;
else
$endedatum = $row_contract['bis'];
// VBS anlegen und Funktion zuweisen
$newVBSIndex = $this->_getNewVBSIndex($contracts, $dv);
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['vertragsbestandteiltyp_kurzbz'] = 'funktion';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['von'] = $startdatum;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['bis'] = $endedatum;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['benutzerfunktion_id'] = $row_funktion->benutzerfunktion_id;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['hint'] = $row_funktion->funktion_kurzbz.' '.$row_funktion->datum_von.' - '.$row_funktion->datum_bis;
$funktion_added++;
}
}
if ($funktion_added == 0)
{
echo "\nFunktion nicht zugeordnet: ".$row_funktion->funktion_kurzbz.' '.$row_funktion->datum_von.' - '.$row_funktion->datum_bis;
}
}
}
}
/**
* Prueft ob schon ein Vertragsbestandteil fuer Zeitaufzeichnung vorhanden ist das in den Zeitraum passt
* bzw direkt anschließt. Wenn es direkt anschließend ist und die Art gleich sind wird die Laufzeit verlaengert
* Ansonsten wird ein neuer VBS angelegt
*/
private function _addVertragsbestandteilZeitaufzeichnung(&$contracts, $dv, $row_verwendung)
{
if( is_null($row_verwendung->zeitaufzeichnungspflichtig) || is_null($row_verwendung->azgrelevant) )
{
return;
}
if (isset($contracts['dv'][$dv]['vbs']))
{
foreach ($contracts['dv'][$dv]['vbs'] as $index_vbs=>$row_vbs)
{
if ($row_vbs['vertragsbestandteiltyp_kurzbz'] == 'zeitaufzeichnung')
{
if ($this->_isVBSAngrenzend($row_verwendung, $row_vbs)
&& $row_vbs['zeitaufzeichnung'] == $row_verwendung->zeitaufzeichnungspflichtig
&& $row_vbs['azgrelevant'] == $row_verwendung->azgrelevant
&& $row_vbs['homeoffice'] == $row_verwendung->homeoffice
)
{
// Zeitaufzeichnungsarten bleiben gleich - Ende des VBS verlaengern
$contracts['dv'][$dv]['vbs'][$index_vbs]['bis'] = $row_verwendung->ende;
return true;
}
}
}
}
// kein passender VBS gefunden - neuen anlegen
$newVBSIndex = $this->_getNewVBSIndex($contracts, $dv);
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['vertragsbestandteiltyp_kurzbz'] = 'zeitaufzeichnung';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['von'] = $row_verwendung->beginn;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['bis'] = $row_verwendung->ende;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['zeitaufzeichnung'] = $row_verwendung->zeitaufzeichnungspflichtig;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['azgrelevant'] = $row_verwendung->azgrelevant;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['homeoffice'] = $row_verwendung->homeoffice;
return true;
}
/**
* Fueg einen Freitextbestandteil fuer All-In zum DV hinzu
*/
private function _addVertragsbestandteilFreitextAllIn(&$contracts, $dv, $row_verwendung)
{
if ($row_verwendung->ba1code == 111) // All-In
{
$newVBSIndex = $this->_getNewVBSIndex($contracts, $dv);
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['vertragsbestandteiltyp_kurzbz'] = 'freitext';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['von'] = $row_verwendung->beginn;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['bis'] = $row_verwendung->ende;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['freitexttyp_kurzbz'] = 'allin';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['titel'] = 'allin';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['anmerkung'] = 'allin';
}
return true;
}
/**
* Fueg einen Freitextbestandteil fuer die Berfristung zum DV hinzu
*/
private function _addVertragsbestandteilFreitextBefristung(&$contracts, $dv, $row_verwendung)
{
if ($row_verwendung->ba2code == 1) // Befristung
{
$newVBSIndex = $this->_getNewVBSIndex($contracts, $dv);
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['vertragsbestandteiltyp_kurzbz'] = 'freitext';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['von'] = $row_verwendung->beginn;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['bis'] = $row_verwendung->ende;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['freitexttyp_kurzbz'] = 'befristung';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['titel'] = 'befristung';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['anmerkung'] = 'befristung';
}
return true;
}
/**
* Prueft ob schon ein Vertragsbestandteil mit diesem Stundenausmass vorhanden ist das in den Zeitraum passt
* bzw direkt anschließt. Wenn es direkt anschließend ist und die Stunden gleich sind wird die Laufzeit verlaengert
* Ansonsten wird ein neuer VBS angelegt
*/
private function _addVertragsbestandteilStunden(&$contracts, $dv, $row_verwendung)
{
// Nur anlegen wenn im aktuellen Eintrag auch Stunden eingetragen sind
if ($row_verwendung->vertragsstunden != '')
{
if (isset($contracts['dv'][$dv]['vbs']))
{
foreach ($contracts['dv'][$dv]['vbs'] as $index_vbs=>$row_vbs)
{
if ($row_vbs['vertragsbestandteiltyp_kurzbz'] == 'stunden' || ($row_vbs['vertragsbestandteiltyp_kurzbz'] == 'karenz' && $row_verwendung->vertragsstunden === '0.00'))
{
if ($this->_isVBSAngrenzend($row_verwendung, $row_vbs) && ((isset($row_vbs['wochenstunden']) && $row_vbs['wochenstunden'] == $row_verwendung->vertragsstunden) || $row_verwendung->vertragsstunden === '0.00'))
{
// stunden bleiben gleich - Ende des VBS verlaengern
$contracts['dv'][$dv]['vbs'][$index_vbs]['bis'] = $row_verwendung->ende;
return true;
}
}
}
}
// kein passender VBS gefunden - neuen anlegen
$newVBSIndex = $this->_getNewVBSIndex($contracts, $dv);
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['vertragsbestandteiltyp_kurzbz'] = 'stunden';
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['von'] = $row_verwendung->beginn;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['bis'] = $row_verwendung->ende;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['wochenstunden'] = $row_verwendung->vertragsstunden;
$contracts['dv'][$dv]['vbs'][$newVBSIndex]['teilzeittyp_kurzbz'] = null;
}
return true;
}
/**
* Prueft ob die Verwendung direkt an den Vertragsbestandteil angrenzt
* @return boolean true wenn ja, sonst false
*/
private function _isVBSAngrenzend($verwendung, $vbs)
{
// Beginn Minus 1 Tag
$dtstart = new DateTime($verwendung->beginn);
$dtstartMinus1 = $dtstart->sub(new DateInterval('P1D'))->format('Y-m-d');
if ($vbs['bis'] == ''
|| $vbs['bis'] == $dtstartMinus1)
{
return true;
}
return false;
}
/**
* Create a new DV or Returns the Index of an existing
*/
private function _getOrCreateDV(&$contracts, $row_verwendung)
{
$unternehmen = $this->OE_DEFAULT;
$resultUnternehmen = $this->_getUnternehmen($row_verwendung);
if(hasData($resultUnternehmen))
{
$unternehmen = getData($resultUnternehmen)[0]->oe_kurzbz;
}
else
{
// Fallback Unternehmen wird verwendet falls keine Zuordnung ermittelt werden kann
}
if (isset($contracts['dv']) && is_array($contracts['dv']))
{
foreach($contracts['dv'] as $indexdv => $row_dv)
{
// Vertragsart ist die selbe und selbes Unternehmen
if ($row_dv['vertragsart_kurzbz'] == $this->matching_ba1_vertragsart[$row_verwendung->ba1code]
&& $row_dv['oe_kurzbz'] == $unternehmen
)
{
$dtstart = new DateTime($row_verwendung->beginn);
// Zeitraum passt zur Verwendung
if ($row_dv['von'] <= $row_verwendung->beginn // Beginn Datum Pruefen
&& ( // Ende innerhalb des DV
(isset($row_dv['bis']) && $row_verwendung->ende != '' && ($row_dv['bis'] == '' || $row_dv['bis'] >= $row_verwendung->ende)
)
|| // direkt angrenzend an dieses DV
(isset($row_dv['bis'])
&& ($row_dv['bis'] == ''
|| $row_dv['bis'] == $dtstart->sub(new DateInterval('P1D'))->format('Y-m-d')
)
)
)
)
{
return $indexdv;
}
}
}
}
$newDvIndex = $this->_getNewDVIndex($contracts);
$contracts['dv'][$newDvIndex]['mitarbeiter_uid'] = $row_verwendung->mitarbeiter_uid;
$contracts['dv'][$newDvIndex]['von'] = $row_verwendung->beginn;
$contracts['dv'][$newDvIndex]['bis'] = $row_verwendung->ende;
$contracts['dv'][$newDvIndex]['oe_kurzbz'] = $unternehmen;
$contracts['dv'][$newDvIndex]['vertragsart_kurzbz'] = $this->matching_ba1_vertragsart[$row_verwendung->ba1code];
return $newDvIndex;
}
/**
* Ermittelt in welchem Unternehmen die Person zum betreffenden Zeitpunkt ist.
*/
private function _getUnternehmen($row_verwendung)
{
$resultUnternehmen = $this->_findUnternehmen($row_verwendung->mitarbeiter_uid, "'kstzuordnung', 'oezuordnung'", $row_verwendung->beginn);
// Wenn zeitlich keine passende Unternehmenszuordnung vorhanden ist, dann suchen ob generell eine Zuordnung ermittelt werden kann
if(!hasData($resultUnternehmen))
{
$resultUnternehmen = $this->_findUnternehmen($row_verwendung->mitarbeiter_uid, "'kstzuordnung', 'oezuordnung'");
// Falls nicht wird nach erweiterten Funktionen gesucht um die Zuordnung zu ermitteln.
if(!hasData($resultUnternehmen))
{
$resultUnternehmen = $this->_findUnternehmen($row_verwendung->mitarbeiter_uid, "'kstzuordnung', 'oezuordnung','hilfskraft','Leitung','fbk','fbl'");
}
}
return $resultUnternehmen;
}
/**
* Detailsuche fuer die Ermittlung des Unternehmenszuordnung einer Person
*/
private function _findUnternehmen($uid, $fkt=null, $datum=null)
{
$db = new DB_Model();
$qry = "
WITH RECURSIVE meine_oes(oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz) as
(
SELECT
oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz
FROM
public.tbl_organisationseinheit
WHERE
oe_kurzbz=(SELECT
oe_kurzbz
FROM
public.tbl_benutzerfunktion
WHERE
uid=".$db->escape($uid);
if(!is_null($datum))
$qry.=" AND ".$db->escape($datum)." BETWEEN datum_von AND COALESCE(datum_bis, '2999-12-31')";
if(!is_null($fkt))
$qry.=" AND funktion_kurzbz in ($fkt)";
$qry.="
ORDER BY funktion_kurzbz, datum_von LIMIT 1)
UNION ALL
SELECT
o.oe_kurzbz, o.oe_parent_kurzbz, o.organisationseinheittyp_kurzbz
FROM
public.tbl_organisationseinheit o, meine_oes
WHERE
o.oe_kurzbz=meine_oes.oe_parent_kurzbz
)
SELECT
oe_kurzbz
FROM
meine_oes
WHERE
oe_parent_kurzbz is null
LIMIT 1
";
$resultUnternehmen = $db->execReadOnlyQuery($qry);
return $resultUnternehmen;
}
/**
* Ermittelt den nächsten (freien) Index für den Vertragsbetandteil
*/
private function _getNewVBSIndex($contracts, $dv)
{
if (isset($contracts['dv'][$dv]['vbs']))
return max(array_keys($contracts['dv'][$dv]['vbs'])) + 1;
else
return 0;
}
/**
* Ermittelt den nächsten (freien) Index für das Dienstverhältnis
*/
private function _getNewDVIndex($contracts)
{
if (isset($contracts['dv']) && is_array($contracts['dv']))
return max(array_keys($contracts['dv'])) + 1;
else
return 0;
}
/**
* Habilitation wird aus der Tabelle bis.tbl_bisverwendung in die Tabelle public.tbl_mitarbeiter uebernommen
* Sofern die Person einmal in den Verwendungen eine habiliation eingetragen hat wird diese in den MA-Datensatz übernommen
* Da es in der regel öfter vorkommt dass das hakerl vergessen wurde beim Vertragswechsel als dass die person die habiliation verliert.
*/
public function migrateHabilitation()
{
$this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel');
$db = new DB_Model();
$qry = "
SELECT
distinct mitarbeiter_uid
FROM
bis.tbl_bisverwendung
WHERE
habilitation=true";
$resultHabilitation = $db->execReadOnlyQuery($qry);
if (isSuccess($resultHabilitation) && hasData($resultHabilitation))
{
$habilitationen = getData($resultHabilitation);
foreach ($habilitationen as $row_habilitationen)
{
$this->MitarbeiterModel->update($row_habilitationen->mitarbeiter_uid, array('habilitation'=>true));
}
}
}
}
@@ -0,0 +1,268 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class MigrateHourlyRate extends CLI_Controller
{
CONST DEFAULT_DATE = '1970-01-01';
CONST STUNDENSTAZTYP_LEHRE = 'lehre';
CONST STUNDENSTAZTYP_KALKULATORISCH = 'kalkulatorisch';
private $OE_DEFAULT;
private $_ci;
protected $configerrors;
public function __construct()
{
parent::__construct();
$this->_ci = & get_instance();
$this->load->model('codex/Bisverwendung_model', 'BisVerwendungModel');
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('ressource/Stundensatz_model', 'StundensatzModel');
$this->load->config('migratecontract');
$this->OE_DEFAULT = $this->config->item('migratecontract_oe_default');
$this->configerrors = array();
}
public function checkConfig()
{
echo "OE_DEFAULT: " . $this->OE_DEFAULT . "\n";
$this->checkOE_DEFAULT();
if( count($this->configerrors) > 0 )
{
foreach($this->configerrors AS $configerror)
{
echo $configerror . "\n";
}
die("Fehler in der Konfiguration. Abbruch!\n");
}
else
{
echo "Konfiguration OK.\n";
}
}
public function index($user = null)
{
$this->checkConfig();
echo "Lehre Stundensaetze werden migriert.\n";
$mitarbeiterResult = $this->_getMitarbeiterStunden($user);
if (isError($mitarbeiterResult)) return $mitarbeiterResult;
if (!hasData($mitarbeiterResult)) return error('Keine Mitarbeiterstunden gefunden');
$mitarbeiterArray = getData($mitarbeiterResult);
foreach ($mitarbeiterArray as $mitarbeiter)
{
$this->_getUnternehmen($mitarbeiter);
$insertResult = $this->_addStundensatz($mitarbeiter, self::STUNDENSTAZTYP_LEHRE, self::DEFAULT_DATE);
if (isError($insertResult)) return $insertResult;
}
if( $this->checkIfSAPSyncTableExists() )
{
echo "SAP Sync Tabelle gefunden. SAP Stundensaetze werden migriert.\n";
$sapResult = $this->_getSapStunden($user);
if (isError($sapResult)) return $sapResult;
if (!hasData($sapResult)) return error('Keinen kalkulatorischen Stundensaetze gefunden');
$mitarbeiterArray = getData($sapResult);
foreach ($mitarbeiterArray as $mitarbeiter)
{
$this->_getUnternehmen($mitarbeiter);
$insertResult = $this->_addStundensatz($mitarbeiter, self::STUNDENSTAZTYP_KALKULATORISCH, date_format(date_create($mitarbeiter->beginn), 'Y-m-d'));
if (isError($insertResult)) return $insertResult;
}
}
else
{
echo "SAP Sync Tabelle nicht gefunden. Ignoriere SAP Stundensaetze.\n";
}
}
protected function checkOE_DEFAULT()
{
$db = new DB_Model();
$oesql = 'SELECT * FROM public.tbl_organisationseinheit WHERE oe_kurzbz = ?';
$oeres = $db->execReadOnlyQuery($oesql, array($this->OE_DEFAULT));
if( !hasData($oeres) )
{
$this->configerrors[] = 'Default Organisationseinheit: "'
. $this->OE_DEFAULT . '" nicht gefunden.';
}
}
protected function checkIfSAPSyncTableExists()
{
$dbModel = new DB_Model();
$params = array(
DB_NAME,
'sync',
'tbl_sap_stundensatz'
);
$sql = "SELECT
1 AS exists
FROM
information_schema.tables
WHERE
table_catalog = ? AND
table_schema = ? AND
table_name = ?";
$res = $dbModel->execReadOnlyQuery($sql, $params);
if( hasData($res) )
{
return true;
}
else
{
return false;
}
}
private function _getSapStunden($user = null)
{
$dbModel = new DB_Model();
$params = array();
$qry = "SELECT ss.mitarbeiter_uid as uid,
ss.sap_kalkulatorischer_stundensatz as stundensatz,
ss.insertamum as beginn
FROM sync.tbl_sap_stundensatz ss
WHERE ss.sap_kalkulatorischer_stundensatz IS NOT NULL";
if (!is_null($user))
{
$qry .= " AND ss.mitarbeiter_uid = ? ";
$params[] = $user;
}
$qry .= " ORDER BY ss.mitarbeiter_uid";
return $dbModel->execReadOnlyQuery($qry, $params);
}
private function _getMitarbeiterStunden($user = null)
{
$dbModel = new DB_Model();
$params = array();
$qry = "SELECT mitarbeiter.mitarbeiter_uid as uid,
stundensatz
FROM public.tbl_mitarbeiter mitarbeiter
WHERE mitarbeiter.stundensatz != 0.00
AND mitarbeiter.stundensatz IS NOT NULL";
if (!is_null($user))
{
$qry .= " AND mitarbeiter.mitarbeiter_uid = ?";
$params[] = $user;
}
$qry .= " ORDER BY mitarbeiter.mitarbeiter_uid";
return $dbModel->execReadOnlyQuery($qry, $params);
}
private function _addStundensatz($mitarbeiter, $stundensatztyp, $gueltig_von)
{
return $this->_ci->StundensatzModel->insert(
array(
'uid' => $mitarbeiter->uid,
'stundensatztyp' => $stundensatztyp,
'stundensatz' => $mitarbeiter->stundensatz,
'oe_kurzbz' => $mitarbeiter->unternehmen,
'gueltig_von' => $gueltig_von,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'MigrateHours'
)
);
}
private function _getUnternehmen(&$mitarbeiter)
{
$bvResult = $this->_ci->BisVerwendungModel->getLast($mitarbeiter->uid);
$beginn = null;
if (hasData($bvResult))
{
$beginn = getData($bvResult)[0]->beginn;
}
$unternehmenResult = $this->_findUnternehmen($mitarbeiter->uid, "'kstzuordnung', 'oezuordnung'", $beginn);
if(!hasData($unternehmenResult)) //&& hasData($bvResult)
{
$unternehmenResult = $this->_findUnternehmen($mitarbeiter->uid, "'kstzuordnung', 'oezuordnung'");
}
$unternehmen = $this->OE_DEFAULT;
if (hasData($unternehmenResult))
$unternehmen = getData($unternehmenResult)[0]->oe_kurzbz;
$mitarbeiter->unternehmen = $unternehmen;
}
/**
* Detailsuche fuer die Ermittlung des Unternehmenszuordnung einer Person
*/
private function _findUnternehmen($uid, $fkt=null, $datum=null)
{
$dbModel = new DB_Model();
$qry = "
WITH RECURSIVE meine_oes(oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz) as
(
SELECT
oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz
FROM
public.tbl_organisationseinheit
WHERE
oe_kurzbz=(SELECT
oe_kurzbz
FROM
public.tbl_benutzerfunktion
WHERE
uid=".$dbModel->escape($uid);
if(!is_null($datum))
$qry.=" AND ".$dbModel->escape($datum)." BETWEEN datum_von AND COALESCE(datum_bis, '2999-12-31')";
if(!is_null($fkt))
$qry.=" AND funktion_kurzbz in ($fkt)";
$qry.="
ORDER BY funktion_kurzbz, datum_von LIMIT 1)
UNION ALL
SELECT
o.oe_kurzbz, o.oe_parent_kurzbz, o.organisationseinheittyp_kurzbz
FROM
public.tbl_organisationseinheit o, meine_oes
WHERE
o.oe_kurzbz=meine_oes.oe_parent_kurzbz
)
SELECT
oe_kurzbz
FROM
meine_oes
WHERE
oe_parent_kurzbz is null
LIMIT 1
";
return $dbModel->execReadOnlyQuery($qry);
}
}
@@ -0,0 +1,495 @@
<?php
/*
* Job zur einmaligen Import der Gehälter
*
* Aufruf (Encode / im Filenmae mit %2F):
* php index.ci.php system/MigrateSalary/import filename
*
*/
/*
AUFBAU CSV:
SVNR;Pers-Nr;Name;Dienstverhältnis;LA-Nr;Bezeichnung;2022-09-01;2022-10-01;2022-11-01;2022-12-01;2023-01-01;2023-02-01;2023-03-01
XXXX XXXXXX;00;Name;5;1000;Gehalt;1.111,10;1.211,10;1.311,10;1.411,10;1.511,10;1.611,10;1.711,10
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class MigrateSalary extends CLI_Controller
{
private $OE_DEFAULT = 'gst';
private $GEHALT_BEGINN_SPALTE = 6; // Beginnend mit 0 => G
private $INDEX_LOHNART = 4;
private $INDEX_BEZEICHNUNG = 5;
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->load->model('vertragsbestandteil/Gehaltsbestandteil_model', 'GehaltsbestandteilModel');
$this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
$this->load->model('vertragsbestandteil/Vertragsbestandteil_model','VertragsbestandteilModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilStunden_model','VertragsbestandteilStundenModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilFreitext_model','VertragsbestandteilFreitextModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilFunktion_model','VertragsbestandteilFunktionModel');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
*/
public function import($file)
{
// CSV Laden
$file = urldecode($file);
if($handle = fopen($file, "r"))
{
$csvrow = -1;
$lastuser = '';
$monate = array();
$gehaltsarr = array();
$gehaltsindex = 0;
while (($data = fgetcsv($handle, null, ';')) !== FALSE)
{
$csvrow++;
// Kopfzeile ueberspringen
if($csvrow == 0)
{
for($i = $this->GEHALT_BEGINN_SPALTE; $i < count($data); $i++)
{
$monate[] = $data[$i];
}
continue;
}
// User zur SVNR ermitteln
$svnr = str_replace(' ', '',$data[0]);
$resultuser = $this->_getUser($svnr);
if(!hasData($resultuser))
{
echo getError($resultuser);
break;
}
$user = getData($resultuser)[0]->mitarbeiter_uid;
echo "\nUser:".$user;
if($user != $lastuser && $lastuser != '')
{
$this->_saveGehalt($lastuser, $gehaltsarr);
$gehaltsarr = array();
$gehaltsindex = 0;
$lastuser = $user;
}
else
{
$lastuser = $user;
}
// Gehalt Clustern
$monat = 0;
for ($i = $this->GEHALT_BEGINN_SPALTE; $i < count($data); $i++)
{
if (count($gehaltsarr) == 0 && $data[$i] != '')
{
$gehaltsarr[$gehaltsindex]['betrag'] = $data[$i];
$gehaltsarr[$gehaltsindex]['lohnart'] = $data[$this->INDEX_LOHNART];
$gehaltsarr[$gehaltsindex]['bezeichnung'] = $data[$this->INDEX_BEZEICHNUNG];
$gehaltsarr[$gehaltsindex]['beginn'] = $monate[$monat];
}
else
{
if ($data[$i] != ''
&& isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag'])
&& $gehaltsarr[$gehaltsindex]['betrag'] == $data[$i])
{
// Gehalt bleibt gleich
}
else
{
if ($data[$i] != '')
{
// Gehalt hat sich geändert
if ($monat != 0 && isset($gehaltsarr[$gehaltsindex]))
$gehaltsarr[$gehaltsindex]['ende'] = $monate[$monat-1];
$gehaltsindex++;
$gehaltsarr[$gehaltsindex]['betrag'] = $data[$i];
$gehaltsarr[$gehaltsindex]['lohnart'] = $data[$this->INDEX_LOHNART];
$gehaltsarr[$gehaltsindex]['bezeichnung'] = $data[$this->INDEX_BEZEICHNUNG];
$gehaltsarr[$gehaltsindex]['beginn'] = $monate[$monat];
}
elseif(isset($gehaltsarr[$gehaltsindex]))
{
// Gehalt wurde beendet
if($monat!=0)
$gehaltsarr[$gehaltsindex]['ende'] = $monate[$monat-1];
$gehaltsindex++;
}
}
}
$monat++;
}
// Zeile zu Ende - Ende Datum setzen wenn nicht für alle Monate ein Eintrag vorhanden ist
if($monat < count($monate) && isset($gehaltsarr[$gehaltsindex]))
$gehaltsarr[$gehaltsindex]['ende'] = $monate[$monat-1];
}
$this->_saveGehalt($lastuser, $gehaltsarr);
}
}
/**
* Ermittelt das passende Dienstverhaeltnis uns speichert den
* Gehaltsbestandteil
*/
private function _saveGehalt($uid, $gehaltsarr)
{
$failed = false;
$this->db->trans_begin();
foreach($gehaltsarr as $row_gehalt)
{
//var_dump($row_gehalt);
$auszahlungen = 14;
$dvid = '';
$vbsid = '';
$typ = '';
$allin = false;
//DV und VBS Ermitteln
$dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $row_gehalt['beginn']);
// Wenn keiner gefunden wird oder mit Monatsersteln nur ein externer gefunden wird, weitersuchen ob im Monat noch ein
// "richtiger" Vertrag startet
if (!hasData($dv) || getData($dv)[0]->vertragsart_kurzbz='externerLehrender')
{
$date = new DateTime($row_gehalt['beginn']);
$date->modify('last day of this month');
$last_day_this_month = $date->format('Y-m-d');
// Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden
// für Personen die erst später im Monat in ihr DV einsteigen
$dv = $this->DienstverhaeltnisModel->getDVByPersonUIDOverlapping($uid, $this->OE_DEFAULT, $row_gehalt['beginn'], $last_day_this_month);
if (!hasData($dv))
{
echo "\nKein passendes DV gefunden für User ".$uid." und Datum ".$row_gehalt['beginn']." -> ROLLBACK\n";
$failed = true;
break;
}
else
{
$resultdata = getData($dv);
foreach($resultdata as $dvdata)
{
// Externer DV wird in Monatsmitte zu echten DV - daher weitersuchen bei externenDVs da
// diese sowieso kein Gehalt zugeordnet haben
if($dvdata->vertragsart_kurzbz != 'externerLehrender')
{
$dvid = $dvdata->dienstverhaeltnis_id;
// Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste
// nur wenn das Beginndatum vor dem DV-Start liegt da sonst das Datum korrigiert wird
// wenn der Vertragsbestandteil wechselt
if($row_gehalt['beginn'] < $dvdata->von)
$row_gehalt['beginn'] = $dvdata->von;
break;
}
}
}
}
else
{
$resultdata = getData($dv);
if (count($resultdata) == 1)
$dvid = $resultdata[0]->dienstverhaeltnis_id;
}
if ($dvid == '')
{
echo "Kein oder mehrere DVs gefunden -> ROLLBACK";
$failed = true;
break;
}
$allin = $this->_isAllIn($dvid, $row_gehalt['beginn']);
$db = new DB_Model();
$resultVBS = $this->_getVBS($dvid, $row_gehalt['beginn']);
if (hasData($resultVBS))
{
$vbsid = getData($resultVBS)[0]->vertragsbestandteil_id;
$vbsbis = getData($resultVBS)[0]->bis;
}
else
{
echo "Vertragsbestandteil fuer $uid DV $dvid wurde nicht gefunden mit Beginn ".$row_gehalt['beginn']."-> ROLLBACK";
$failed = true;
break;
}
if ($row_gehalt['lohnart'] == 1000)
{
if($allin)
$typ = 'grundgehalt';
else
$typ = 'basisgehalt';
}
elseif ($row_gehalt['lohnart']==1041 // 14x
|| $row_gehalt['lohnart']==1042 // 12x
|| $row_gehalt['lohnart']==3410) // USTDPausch
{
$typ = 'zusatzvereinbarung';
// Freitextbestandteil anlegen fuer die Zulage
// Gaehalt wird der Zuglage zugeordnet
$data = array(
'dienstverhaeltnis_id' => $dvid,
'von' => $row_gehalt['beginn'],
'vertragsbestandteiltyp_kurzbz' => 'freitext',
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'MigrateSalary'
);
if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='')
$data['bis'] = $row_gehalt['ende'];
$resultVBS = $this->VertragsbestandteilModel->Insert($data);
if(!isSuccess($resultVBS))
{
echo "VBS kann nicht erstellt werden -> ROLLBACK";
$failed = true;
break;
}
$vbsid = getData($resultVBS);
$data = array(
'vertragsbestandteil_id' => $vbsid,
'freitexttyp_kurzbz' => 'zusatzvereinbarung',
'titel' => $row_gehalt['bezeichnung'],
'anmerkung' => $row_gehalt['bezeichnung'],
);
$resultVBSFreitext = $this->VertragsbestandteilFreitextModel->Insert($data);
if(!isSuccess($resultVBSFreitext))
{
echo "VBS Freitext Zusatz kann nicht erstellt werden -> ROLLBACK";
$failed = true;
break;
}
}
elseif ($row_gehalt['lohnart']==9999) // All-In Custom Lohnart nicht per Default vorhanden
{
$typ = 'zulage';
// Freitextbestandteil anlegen fuer die Zulage
// Gaehalt wird der Zuglage zugeordnet
$data = array(
'dienstverhaeltnis_id' => $dvid,
'von' => $row_gehalt['beginn'],
'vertragsbestandteiltyp_kurzbz' => 'freitext',
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'MigrateSalary'
);
if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='')
$data['bis'] = $row_gehalt['ende'];
$resultVBS = $this->VertragsbestandteilModel->Insert($data);
if(!isSuccess($resultVBS))
{
echo "VBS AllIn kann nicht erstellt werden -> ROLLBACK";
$failed = true;
break;
}
$vbsid = getData($resultVBS);
$data = array(
'vertragsbestandteil_id' => $vbsid,
'freitexttyp_kurzbz' => 'allin',
'titel' => $row_gehalt['bezeichnung'],
'anmerkung' => $row_gehalt['bezeichnung'],
);
$resultVBSFreitext = $this->VertragsbestandteilFreitextModel->Insert($data);
if(!isSuccess($resultVBSFreitext))
{
echo "VBS Freitext AllIn Zusatz kann nicht erstellt werden -> ROLLBACK";
$failed = true;
break;
}
}
elseif($row_gehalt['lohnart']==5500) // ATZ
{
$typ = 'lohnausgleichatz';
}
else
{
$typ = 'unbekannt - '.$row_gehalt['lohnart'];
echo "\nGehaltstyp unbekannt Lohnart: ".$row_gehalt['lohnart']." -> ROLLBACK";
$failed = true;
break;
}
// Zulage 12x und Zulage 14x aus der Bezeichnung ermitteln
if(strstr($row_gehalt['bezeichnung'], '12x'))
{
$auszahlungen = 12;
}
// Format ist 7.777,77 und wird umformattiert in 7777.77
$betrag = str_replace('.','', $row_gehalt['betrag']);
$betrag = str_replace(',','.',$betrag);
$data = array(
'dienstverhaeltnis_id' => $dvid,
'vertragsbestandteil_id' => $vbsid,
'gehaltstyp_kurzbz' => $typ,
'von' => $row_gehalt['beginn'],
'grundbetrag' => $betrag,
'betrag_valorisiert' => $betrag,
'anmerkung' => $row_gehalt['bezeichnung'],
'valorisierung' => true,
'auszahlungen' => $auszahlungen,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'MigrateSalary',
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => 'MigrateSalary'
);
if (isset($row_gehalt['ende']) && $row_gehalt['ende'] != '')
{
// Im Ende steht noch der Monatserste des letzten Monats
// Das muss geaendert werden auf den Monatsletzten oder das Ende des DVs
$date = new DateTime($row_gehalt['ende']);
$date->modify('last day of this month');
$last_day_this_month = $date->format('Y-m-d');
// Wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist,
// dann muss hier das Ende Datum des DV stehen bzw das Ende
// oder das Ende des VBS falls die Person in der Monatsmitte Stunden wechselt
$data['bis'] = $last_day_this_month;
// Wenn der Vertragsbestandteil endet bevor das Gehalt endet, dann wir das Gehaltsende auf VBS Ende gesetzt
//echo "Ende des VBS: $vbsbis Ende des Gehalt: ".$data['bis'];
if ($vbsbis != '' && $vbsbis < $data['bis'])
{
$data['bis'] = $vbsbis;
//echo "Gehalt auf vbs ende gesetzt";
}
}
$ret = $this->GehaltsbestandteilModel->insert($data,
$this->GehaltsbestandteilModel->getEncryptedColumns()
);
}
if(!$failed)
{
$this->db->trans_commit();
}
else
{
echo "ROLLBACK";
$this->db->trans_rollback();
}
}
/**
* Prueft ob ein AllIn Vertrag vorhanden ist
*/
private function _isAllIn($dvid, $datum)
{
$db = new DB_Model();
$qry = "
SELECT
*
FROM
hr.tbl_vertragsbestandteil
JOIN hr.tbl_vertragsbestandteil_freitext USING(vertragsbestandteil_id)
WHERE
dienstverhaeltnis_id=".$db->escape($dvid)."
AND vertragsbestandteiltyp_kurzbz='freitext'
AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31')
AND freitexttyp_kurzbz='allin'";
$resultAllIn = $db->execReadOnlyQuery($qry);
if (hasData($resultAllIn))
return true;
else
return false;
}
private function _getVBS($dvid, $datum)
{
$db = new DB_Model();
$qry = "
SELECT
*
FROM
hr.tbl_vertragsbestandteil
WHERE
dienstverhaeltnis_id=".$db->escape($dvid)."
AND vertragsbestandteiltyp_kurzbz='stunden'
AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31')";
$resultVBS = $db->execReadOnlyQuery($qry);
return $resultVBS;
}
/**
* Ermittelt den User zu einer SVNR
*/
private function _getUser($svnr)
{
$db = new DB_Model();
$qry = "
SELECT
mitarbeiter_uid
FROM
public.tbl_person
JOIN public.tbl_benutzer using(person_id)
JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid)
WHERE
tbl_person.svnr = ". $db->escape($svnr)."
AND EXISTS(
SELECT
1
FROM
hr.tbl_dienstverhaeltnis
WHERE
mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid
AND oe_kurzbz=". $db->escape($this->OE_DEFAULT)."
)
ORDER BY tbl_benutzer.aktiv DESC
LIMIT 1;
";
$result = $db->execReadOnlyQuery($qry);
if (hasdata($result))
{
return $result;
}
else
return error('Kein Benutzer mit DV und SVNR:'.$svnr.' gefunden');
}
}
@@ -1,4 +1,20 @@
<?php
/**
* 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/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
@@ -6,6 +22,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
* This controller operates between (interface) the JS (GUI) and the NavigationLib (back-end)
* Provides data to the ajax get calls about the filter
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
* TODO(chris): deprecated
*/
class Navigation extends FHC_Controller
{
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Test Search Vue Component
*/
class TestSearch extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'system/developer:r'
)
);
// Loads WidgetLib
$this->load->library('WidgetLib');
// Loads phrases system
$this->loadPhrases(
array(
'global',
'ui',
'filter'
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
*/
public function index()
{
$this->load->view('system/logs/testSearch.php');
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Test VBform Vue Component
*/
class TestVBform extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'system/developer:r'
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
*/
public function index()
{
$this->load->view('system/logs/testVBform.php');
}
}
@@ -21,6 +21,7 @@ class InfoCenter extends Auth_Controller
const FREIGEGEBEN_PAGE = 'freigegeben';
const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert';
const ABGEWIESEN_PAGE = 'abgewiesen';
const AUFGENOMMEN_PAGE = 'aufgenommen';
const SHOW_DETAILS_PAGE = 'showDetails';
const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails';
const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung';
@@ -115,12 +116,14 @@ class InfoCenter extends Auth_Controller
'index' => 'infocenter:r',
'freigegeben' => 'infocenter:r',
'abgewiesen' => 'infocenter:r',
'aufgenommen' => 'infocenter:r',
'reihungstestAbsolviert' => 'infocenter:r',
'showDetails' => 'infocenter:r',
'showZGVDetails' => 'lehre/zgvpruefung:r',
'unlockPerson' => 'infocenter:rw',
'saveFormalGeprueft' => 'infocenter:rw',
'saveDocTyp' => 'infocenter:rw',
'updateStammdaten' => 'infocenter:rw',
'saveNachreichung' => 'infocenter:rw',
'getPrestudentData' => 'infocenter:r',
'getLastPrestudentWithZgvJson' => 'infocenter:r',
@@ -141,12 +144,6 @@ class InfoCenter extends Auth_Controller
'reloadNotizen' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'reloadLogs' => 'infocenter:r',
'outputAkteContent' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'getPostponeDate' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'park' => 'infocenter:rw',
'unpark' => 'infocenter:rw',
'setOnHold' => 'infocenter:rw',
'removeOnHold' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
'getStudienjahrEnd' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'setNavigationMenuArrayJson' => 'infocenter:r',
'getAbsageData' => 'infocenter:r',
'saveAbsageForAll' => 'infocenter:rw',
@@ -163,6 +160,7 @@ class InfoCenter extends Auth_Controller
$this->load->model('crm/Statusgrund_model', 'StatusgrundModel');
$this->load->model('crm/ZGVPruefung_model', 'ZGVPruefungModel');
$this->load->model('crm/ZGVPruefungStatus_model', 'ZGVPruefungStatusModel');
$this->load->model('crm/Rueckstellung_model', 'RueckstellungModel');
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('system/Message_model', 'MessageModel');
@@ -172,11 +170,16 @@ class InfoCenter extends Auth_Controller
$this->load->model('codex/Zgv_model', 'ZgvModel');
$this->load->model('codex/Zgvmaster_model', 'ZgvmasterModel');
$this->load->model('codex/Nation_model', 'NationModel');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$this->load->model('person/Geschlecht_model', 'GeschlechtModel');
$this->load->model('person/adresse_model', 'AdresseModel');
// Loads libraries
$this->load->library('PersonLogLib');
$this->load->library('WidgetLib');
$this->load->config('infocenter');
$this->loadPhrases(
array(
'global',
@@ -227,6 +230,16 @@ class InfoCenter extends Auth_Controller
$this->load->view('system/infocenter/infocenterAbgewiesen.php');
}
/**
* Aufgenommene page of the InfoCenter tool
*/
public function aufgenommen()
{
$this->_setNavigationMenu(self::AUFGENOMMEN_PAGE); // define the navigation menu for this page
$this->load->view('system/infocenter/infocenterAufgenommen.php');
}
/**
*
@@ -313,7 +326,7 @@ class InfoCenter extends Auth_Controller
show_error('Person does not exist!');
$origin_page = $this->input->get(self::ORIGIN_PAGE);
if ($origin_page == self::INDEX_PAGE)
if (in_array($origin_page, array(self::INDEX_PAGE, self::ABGEWIESEN_PAGE)))
{
// mark person as locked for editing
$result = $this->PersonLockModel->lockPerson($person_id, $this->_uid, self::APP);
@@ -358,7 +371,14 @@ class InfoCenter extends Auth_Controller
if (isError($result)) show_error(getError($result));
$redirectLink = '/'.self::INFOCENTER_URI.'?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId();
$origin_page = $this->input->get(self::ORIGIN_PAGE);
if ($origin_page === self::ABGEWIESEN_PAGE)
$redirectLink = self::INFOCENTER_URI. '/' .self::ABGEWIESEN_PAGE;
else
$redirectLink = '/'.self::INFOCENTER_URI;
$redirectLink .= '?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId();
// Force reload of Dataset after Unlock
$redirectLink .= '&'.self::KEEP_TABLESORTER_FILTER.'=true';
@@ -600,7 +620,7 @@ class InfoCenter extends Auth_Controller
}
/**
* Sendet bei einer neuen ZGV Prüfung die Mail raus an den Studiengang
* Sendet bei einer neuen ZGV Prüfung eine Mail an den Studiengang
*/
private function sendZgvMail($mail, $typ, $person){
$data = array(
@@ -691,7 +711,7 @@ class InfoCenter extends Auth_Controller
/**
* Fügt einen neuen ZGV Status hinzu oder updated einen bestehenden
* Falls es erfolgreich war, sendet er die Mail raus
* Falls es erfolgreich war, wird eine Mail rausgeschickt
*/
public function zgvRueckfragen()
{
@@ -745,7 +765,8 @@ class InfoCenter extends Auth_Controller
$this->sendZgvMail($mail, $typ, $person);
elseif (isError($insert))
$this->terminateWithJsonError('Fehler beim Speichern');
}else
}
else
{
$insert = $this->ZGVPruefungModel->insert(
array(
@@ -775,7 +796,7 @@ class InfoCenter extends Auth_Controller
}
$hold = false;
if ($this->personloglib->getOnHoldDate($person_id) !== null)
if (hasData($this->RueckstellungModel->getByPersonId($person_id, 'onhold_zgv')))
$hold = true;
$this->outputJsonSuccess(
@@ -1111,14 +1132,14 @@ class InfoCenter extends Auth_Controller
public function reloadDoks($person_id)
{
$dokumente_nachgereicht = $this->AkteModel->getAktenWithDokInfo($person_id, null, true);
$dokumente_nachgereicht = $this->AkteModel->getAktenWithDokInfo($person_id, null, true, false);
$this->load->view('system/infocenter/dokNachzureichend.php', array('dokumente_nachgereicht' => $dokumente_nachgereicht->retval));
}
public function reloadUebersichtDoks($person_id)
{
$dokumente = $this->AkteModel->getAktenWithDokInfo($person_id, null, false);
$dokumente = $this->AkteModel->getAktenWithDokInfo($person_id, null, false, false);
$this->DokumentModel->addOrder('bezeichnung');
$dokumentdata = array('dokumententypen' => (getData($this->DokumentModel->load())));
@@ -1156,107 +1177,7 @@ class InfoCenter extends Auth_Controller
->set_output($aktecontent->retval)
->_display();
}
/**
* Gets the date until which a person is parked
* @param $person_id
*/
public function getPostponeDate($person_id)
{
$result = array(
'type' => null,
'date' => null
);
$parkedDate = $this->personloglib->getParkedDate($person_id);
if (isset($parkedDate))
{
$result['type'] = 'parked';
$result['date'] = $parkedDate;
}
else
{
$onholdDate = $this->personloglib->getOnHoldDate($person_id);
if (isset($onholdDate))
{
$result['type'] = 'onhold';
$result['date'] = $onholdDate;
}
}
$this->outputJsonSuccess($result);
}
/**
* Initializes parking of a person, i.e. a person is not expected to do any actions while parked
*/
public function park()
{
$person_id = $this->input->post('person_id');
$date = $this->input->post('parkdate');
$result = $this->personloglib->park($person_id, date_format(date_create($date), 'Y-m-d'), self::TAETIGKEIT, self::APP, null, $this->_uid);
$this->outputJson($result);
}
/**
* Removes parking of a person
*/
public function unPark()
{
$person_id = $this->input->post('person_id');
$result = $this->personloglib->unPark($person_id);
$this->outputJson($result);
}
/**
* Sets a person on hold ("zurückstellen")
*/
public function setOnHold()
{
$person_id = $this->input->post('person_id');
$date = $this->input->post('onholddate');
$result = $this->personloglib->setOnHold($person_id, date_format(date_create($date), 'Y-m-d'), self::TAETIGKEIT, self::APP, null, $this->_uid);
$this->outputJson($result);
}
/**
* Removed on hold status of a person
*/
public function removeOnHold()
{
$person_id = $this->input->post('person_id');
$result = $this->personloglib->removeOnHold($person_id);
$this->outputJson($result);
}
/**
* Gets the End date of the current Studienjahr
*/
public function getStudienjahrEnd()
{
$this->load->model('organisation/studienjahr_model', 'StudienjahrModel');
$result = $this->StudienjahrModel->getCurrStudienjahr();
$json = null;
if (hasData($result))
{
$json = $result->retval[0]->ende;
}
$this->outputJsonSuccess(array($json));
}
/**
* Wrapper for setNavigationMenu, returns JSON message
@@ -1320,6 +1241,126 @@ class InfoCenter extends Auth_Controller
$this->outputJsonSuccess('success');
}
public function updateStammdaten()
{
if (isEmptyString($this->input->post('nachname')) ||
isEmptyString($this->input->post('geschlecht')) ||
isEmptyString($this->input->post('gebdatum')))
{
$this->terminateWithJsonError($this->p->t('infocenter', 'stammdatenFeldFehlt'));
}
$datum = explode('.', $this->input->post('gebdatum'));
if (!checkdate($datum[1], $datum[0], $datum[2]))
{
$this->terminateWithJsonError($this->p->t('infocenter', 'datumUngueltig'));
}
$person_id = $this->input->post('personid');
$update = $this->PersonModel->update(
array
(
'person_id' => $person_id
),
array
(
'titelpre' => isEmptyString($this->input->post('titelpre')) ? null : $this->input->post('titelpre'),
'vorname' => isEmptyString($this->input->post('vorname')) ? null : $this->input->post('vorname'),
'nachname' => $this->input->post('nachname'),
'titelpost' => isEmptyString($this->input->post('titelpost')) ? null : $this->input->post('titelpost'),
'gebdatum' => isEmptyString($this->input->post('gebdatum')) ? null : date("Y-m-d", strtotime($this->input->post('gebdatum'))),
'svnr' => isEmptyString($this->input->post('svnr')) ? null : $this->input->post('svnr'),
'staatsbuergerschaft' => isEmptyString($this->input->post('buergerschaft')) ? null : $this->input->post('buergerschaft'),
'geschlecht' => $this->input->post('geschlecht'),
'geburtsnation' => isEmptyString($this->input->post('gebnation')) ? null : $this->input->post('gebnation'),
'gebort' => isEmptyString($this->input->post('gebort')) ? null : $this->input->post('gebort'),
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid
)
);
if (isError($update))
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
$kontakte = $this->input->post('kontakt');
foreach ($kontakte as $kontakt)
{
$kontaktExists = $this->KontaktModel->loadWhere(array(
'kontakt_id' => $kontakt['id'],
'person_id' => $person_id,
));
if (hasData($kontaktExists))
{
$kontaktExists = getData($kontaktExists)[0];
if ($kontaktExists->kontakt === $kontakt['value'])
continue;
$update = $this->KontaktModel->update(
array
(
'kontakt_id' => $kontakt['id']
),
array
(
'kontakt' => isEmptyString($kontakt['value']) ? null : $kontakt['value'],
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid
)
);
if (isError($update))
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
}
}
$adressen = $this->input->post('adresse');
foreach ($adressen as $adresse)
{
$adresseExists = $this->AdresseModel->loadWhere(array(
'adresse_id' => $adresse['id'],
'person_id' => $person_id,
));
if (hasData($adresseExists))
{
$adresse = $adresse['value'];
$adresseExists = getData($adresseExists)[0];
if ($adresseExists->strasse !== $adresse['strasse'] ||
$adresseExists->plz !== $adresse['plz'] ||
$adresseExists->ort !== $adresse['ort'] ||
$adresseExists->nation !== $adresse['nation'])
{
$update = $this->AdresseModel->update(
array
(
'adresse_id' => $adresseExists->adresse_id
),
array
(
'strasse' => isEmptyString($adresse['strasse']) ? null : $adresse['strasse'],
'plz' => isEmptyString($adresse['plz']) ? null : $adresse['plz'],
'ort' => isEmptyString($adresse['ort']) ? null : $adresse['ort'],
'nation' => isEmptyString($adresse['nation']) ? null : $adresse['nation'],
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid
)
);
if (isError($update))
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
}
}
}
$this->outputJsonSuccess('Success');
}
public function saveNachreichung($person_id)
{
$nachreichungAm = $this->input->post('nachreichungAm');
@@ -1358,7 +1399,6 @@ class InfoCenter extends Auth_Controller
if($nachreichungAm < $today)
$this->terminateWithJsonError($this->p->t('infocenter', 'nachreichDatumNichtVergangenheit'));
$akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => $allowedTypes[$typ]));
if (hasData($akte)) {
@@ -1505,6 +1545,7 @@ class InfoCenter extends Auth_Controller
$freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE);
$reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE);
$currentFilterId = $this->input->get(self::FILTER_ID);
if (isset($currentFilterId))
@@ -1512,6 +1553,7 @@ class InfoCenter extends Auth_Controller
$freigegebenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
}
$this->navigationlib->setSessionMenu(
@@ -1562,7 +1604,19 @@ class InfoCenter extends Auth_Controller
null, // subscriptLinkValue
'', // target
30 // sort
)
),
'aufgenommen' => $this->navigationlib->oneLevel(
'Aufgenommene', // description
$aufgenommenLink, // link
null, // children
'check', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
40 // sort
),
)
);
}
@@ -1590,6 +1644,9 @@ class InfoCenter extends Auth_Controller
if ($origin_page === self::ABGEWIESEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
if ($origin_page === self::AUFGENOMMEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE);
$prevFilterId = $this->input->get(self::PREV_FILTER_ID);
if (isset($prevFilterId))
{
@@ -1794,14 +1851,14 @@ class InfoCenter extends Auth_Controller
if (!isset($stammdaten->retval))
return null;
$dokumente = $this->AkteModel->getAktenWithDokInfo($person_id, null, false);
$dokumente = $this->AkteModel->getAktenWithDokInfo($person_id, null, false, false);
if (isError($dokumente))
{
show_error(getError($dokumente));
}
$dokumente_nachgereicht = $this->AkteModel->getAktenWithDokInfo($person_id, null, true);
$dokumente_nachgereicht = $this->AkteModel->getAktenWithDokInfo($person_id, null, true, false);
if (isError($dokumente_nachgereicht))
{
@@ -1996,6 +2053,12 @@ class InfoCenter extends Auth_Controller
$this->NationModel->addOrder('langtext');
$allNations = getData($this->NationModel->load());
$additional_stg = explode(',', ($this->config->item('infocenter_studiengang_kz')));
$this->GeschlechtModel->addOrder('sort');
$allGenders = getData($this->GeschlechtModel->load());
$data = array (
'zgvpruefungen' => $zgvpruefungen,
'abwstatusgruende' => $abwstatusgruende,
@@ -2004,6 +2067,8 @@ class InfoCenter extends Auth_Controller
'all_zgvs' => $allZGVs,
'all_zgvs_master' => $allZGVsMaster,
'all_nations' => $allNations,
'additional_stg' => $additional_stg,
'all_genders' => $allGenders
);
return $data;
@@ -2164,8 +2229,8 @@ class InfoCenter extends Auth_Controller
$prestudentstatus = $prestudent->prestudentstatus;
$person_id = $prestudent->person_id;
$person = $this->PersonModel->getPersonStammdaten($person_id, true)->retval;
$dokumente = $this->AkteModel->getAktenWithDokInfo($person_id, null, false)->retval;
$dokumenteNachzureichen = $this->AkteModel->getAktenWithDokInfo($person_id, null, true)->retval;
$dokumente = $this->AkteModel->getAktenWithDokInfo($person_id, null, false, false)->retval;
$dokumenteNachzureichen = $this->AkteModel->getAktenWithDokInfo($person_id, null, true, false)->retval;
//fill mail variables
$interessentbez = $person->geschlecht == 'm' ? 'Ein Interessent' : 'Eine Interessentin';
@@ -2262,12 +2327,10 @@ class InfoCenter extends Auth_Controller
public function getAbsageData()
{
$studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter');
$stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, ['b', 'm']);
$stg_typ = $this->getStudienArtBerechtigung(['b', 'm']);
if (hasData($stg_typ))
if (!is_null($stg_typ))
{
$stg_typ = getData($stg_typ);
$statusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval;
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
$studiengaenge = $this->StudiengangModel->getStudiengaengeWithOrgForm(array_column($stg_typ, 'typ'), $studienSemester);
@@ -2283,15 +2346,16 @@ class InfoCenter extends Auth_Controller
$this->outputJsonSuccess(null);
}
public function getStudienArtBerechtigung()
public function getStudienArtBerechtigung($typ = null)
{
$studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter');
$stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, ['b', 'm', 'l']);
$stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, $typ);
return getData($stg_typ);
}
public function getStudienartData()
{
$this->outputJsonSuccess($this->getStudienArtBerechtigung());
$this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l']));
}
public function saveAbsageForAll()
@@ -0,0 +1,135 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Rueckstellung extends Auth_Controller
{
private $_ci; // Code igniter instance
private $_uid;
public function __construct()
{
parent::__construct(
array(
'get' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'set' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'delete' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'getStatus' => array('infocenter:rw', 'lehre/zgvpruefung:rw')
)
);
$this->load->model('crm/Rueckstellung_model', 'RueckstellungModel');
$this->load->model('crm/RueckstellungStatus_model', 'RueckstellungStatusModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->library('PersonLogLib');
$this->_setAuthUID(); // sets property uid
$this->_ci =& get_instance(); // get code igniter instance
}
public function get($person_id)
{
$result = null;
$rueckstellung = $this->_ci->RueckstellungModel->getByPersonId($person_id);
if (isError($rueckstellung))
$this->terminateWithJsonError($this->_ci->p->t('ui', 'fehlerBeimLesen'));
if (hasData($rueckstellung))
{
$rueckstellung = getData($rueckstellung)[0];
$fullName = getData($this->_ci->PersonModel->getFullName($rueckstellung->insertvon));
$result = array(
'von' => $fullName,
'bezeichnung' => $rueckstellung->bezeichnung,
'bis' => $rueckstellung->datum_bis,
'status_kurzbz' => $rueckstellung->status_kurzbz
);
if ($rueckstellung->status_kurzbz === 'parked' && $rueckstellung->datum_bis < date('Y-m-d'))
{
$this->_ci->RueckstellungModel->delete(array('person_id' => $person_id, 'status_kurzbz' => 'parked'));
$result = null;
}
}
$this->outputJsonSuccess($result);
}
public function set()
{
$person_id = $this->input->post('person_id');
$datum_bis = $this->input->post('datum_bis');
$status_kurzbz = $this->input->post('status_kurzbz');
$result = $this->_ci->RueckstellungModel->insert(
array('person_id' => $person_id,
'status_kurzbz' => $status_kurzbz,
'datum_bis' => date_format(date_create($datum_bis), 'Y-m-d'),
'insertvon' => $this->_uid
)
);
if (isError($result))
$this->terminateWithJsonError(getError($result));
$this->_log($person_id, $status_kurzbz);
$this->outputJson($result);
}
public function delete()
{
$person_id = $this->input->post('person_id');
$status = $this->input->post('status');
$result = $this->_ci->RueckstellungModel->delete(array('person_id' => $person_id, 'status_kurzbz' => $status));
if (isError($result))
$this->terminateWithJsonError($this->_ci->p->t('ui', 'fehlerBeimSpeichern'));
$this->outputJson($result);
}
public function getStatus($aktiv = true)
{
$this->_ci->RueckstellungStatusModel->addOrder('sort');
$result = $this->_ci->RueckstellungStatusModel->loadWhere(array('aktiv' => $aktiv));
if (isError($result))
$this->terminateWithJsonError($this->_ci->p->t('ui', 'fehlerBeimLesen'));
$this->outputJsonSuccess(getData($result));
}
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
private function _log($person_id, $status_kurzbz)
{
$message = "Person $person_id set to $status_kurzbz";
$this->_ci->personloglib->log(
$person_id,
'Action',
array(
'name' => 'Person status set',
'message' => $message,
'success' => true
),
'bewerbung',
'infocenter',
null,
$this->_uid
);
}
}
@@ -26,6 +26,7 @@ class Issues extends Auth_Controller
// Load models
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->loadPhrases(
array(
@@ -45,10 +46,11 @@ class Issues extends Auth_Controller
public function index()
{
$oes_for_issues = $this->_getOesForIssues();
$language_index = $this->_getLanguageIndex();
$this->load->view(
'system/issues/issues',
$oes_for_issues
array_merge($oes_for_issues, array('language_index' => $language_index))
);
}
@@ -166,4 +168,28 @@ class Issues extends Auth_Controller
'all_oe_kurzbz_berechtigt' => $all_oe_kurzbz_berechtigt
);
}
/**
* Gets language index of currently logged in user.
* @return object int (the index, start at 1)
*/
private function _getLanguageIndex()
{
$idx = 1;
$this->SpracheModel->addSelect('sprache, index');
$langRes = $this->SpracheModel->load();
if (hasData($langRes))
{
$userLang = getUserLanguage();
$lang = getData($langRes);
foreach ($lang as $l)
{
if ($l->sprache == $userLang) $idx = $l->index;
}
}
return $idx;
}
}
@@ -0,0 +1,305 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class IssuesKonfiguration extends Auth_Controller
{
private $_uid;
const STRING_DATA_TYPE = 'string';
const INTEGER_DATA_TYPE = 'integer';
const FLOAT_DATA_TYPE = 'float';
public function __construct()
{
parent::__construct(
array(
'index' => 'admin:r',
'getApps' => 'admin:r',
'getFehlerKonfigurationByApp' => 'admin:r',
'saveFehlerKonfiguration' => 'admin:rw',
'deleteKonfiguration' => 'admin:rw',
'deleteKonfigurationsWerte' => 'admin:rw'
)
);
// Load libraries
$this->load->library('IssuesLib');
$this->load->library('WidgetLib');
// Load models
$this->load->model('system/Fehlerkonfigurationstyp_model', 'FehlerkonfigurationstypModel');
$this->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel');
$this->loadPhrases(
array(
'global',
'ui',
'filter',
'fehlermonitoring'
)
);
$this->_setAuthUID(); // sets property uid
$this->setControllerId(); // sets the controller id
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Load initial view.
*/
public function index()
{
$this->load->view("system/issues/issuesKonfiguration.php");
}
/**
* Loads all Apps to which Fehler exist.
*/
public function getApps()
{
$this->FehlerModel->addDistinct();
$this->FehlerModel->addSelect('app');
$this->FehlerModel->addJoin('system.tbl_fehler_konfigurationstyp', 'app');
$this->FehlerModel->addOrder('app');
$appRes = $this->FehlerModel->load();
$this->outputJson($appRes);
}
/**
* Gets all fehlercodes, optionally by app.
*/
public function getFehlerKonfigurationByApp()
{
$app = $this->input->get('app');
// get all Konfiguration types, optionally filtered by app
$this->FehlerkonfigurationstypModel->addSelect('konfigurationstyp_kurzbz, konfigurationsdatentyp, beschreibung');
$this->FehlerkonfigurationstypModel->addOrder('konfigurationstyp_kurzbz');
$konfRes = isEmptyString($app)
? $this->FehlerkonfigurationstypModel->load()
: $this->FehlerkonfigurationstypModel->loadWhere(array('app' => $app));
if (isError($konfRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden'));
// get all Fehler, optionally filtered by app
$params = array('fehlercode_extern' => null);
$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertyp_kurzbz, fehlertext');
$this->FehlerModel->addOrder('fehlercode');
if (!isEmptyString($app)) $params['app'] = $app;
$fehlerRes = $this->FehlerModel->loadWhere($params);
if (isError($fehlerRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerLaden'));
// return object with retrieved data
$konfObj = new StdClass();
$konfObj->konfigurationstypen = array();
$konfObj->fehler = array();
if (hasData($konfRes)) $konfObj->konfigurationstypen = getData($konfRes);
if (hasData($fehlerRes)) $konfObj->fehler = getData($fehlerRes);
$this->outputJsonSuccess($konfObj);
}
/**
* Saves a Fehler configuration, inserts new configuration or updates existing.
* Checks if datatype of passed configuration is correct.
*/
public function saveFehlerKonfiguration()
{
$result = null;
$konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz');
$fehlercode = $this->input->post('fehlercode');
$konfigurationsWert = $this->input->post('konfigurationsWert');
// check if all params passed
if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp'));
if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt'));
// separate by semicolon if multiple values passed
$konfigurationsWert = explode(';', $konfigurationsWert);
// check konfigurationswert
// get the expected data type
$dataType = self::STRING_DATA_TYPE;
$this->FehlerkonfigurationstypModel->addSelect('konfigurationsdatentyp');
$konfigtypRes = $this->FehlerkonfigurationstypModel->loadWhere(array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz));
if (hasData($konfigtypRes))
{
$konfigurationsdatentyp = getData($konfigtypRes)[0]->konfigurationsdatentyp;
foreach ($konfigurationsWert as $idx => $konfWert)
{
// check if data type correct
$valid = false;
switch ($konfigurationsdatentyp)
{
case self::INTEGER_DATA_TYPE:
$valid = (string)(int)$konfWert == $konfWert;
$konfigurationsWert[$idx] = (int) $konfWert;
break;
case self::FLOAT_DATA_TYPE:
$valid = (string)(float)$konfWert == $konfWert;
$konfigurationsWert[$idx] = (float) $konfWert;
break;
default:
$valid = is_string($konfWert) && preg_match('/^[A-Za-z0-9_]+$/', $konfWert);
}
if (!$valid) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationswert', array($konfigurationsdatentyp)));
}
}
// check if konfiguration already set for the fehlercode
$this->FehlerkonfigurationModel->addSelect('konfiguration');
$fehlerkonfigurationRes = $this->FehlerkonfigurationModel->loadWhere(
array(
'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz,
'fehlercode' => $fehlercode
)
);
if (isError($fehlerkonfigurationRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden'));
// if konfiguration exists, update by add konfiguration values to existing
if (hasData($fehlerkonfigurationRes))
{
$fehlerkonfiguration = getData($fehlerkonfigurationRes);
$existingKonf = json_decode($fehlerkonfiguration[0]->konfiguration);
if (!$existingKonf) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerJsonDekodierung'));
if (!is_array($existingKonf)) $existingKonf = array($existingKonf);
$newKonf = json_encode(array_values(array_unique(array_merge($existingKonf, $konfigurationsWert))));
if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON");
$result = $this->FehlerkonfigurationModel->update(
array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode),
array('konfiguration' => $newKonf, 'updateamum' => 'NOW()', 'updatevon' => $this->_uid)
);
}
else // if no konfiguration exists, add new konfiguration entry
{
$newKonf = json_encode($konfigurationsWert);
if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON");
$result = $this->FehlerkonfigurationModel->insert(
array(
'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz,
'fehlercode' => $fehlercode,
'konfiguration' => $newKonf,
'insertvon' => $this->_uid
)
);
}
// output result (insert or update)
$this->outputJson($result);
}
/**
* Deletes values of a Konfiguration.
*/
public function deleteKonfigurationsWerte()
{
$konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz');
$fehlercode = $this->input->post('fehlercode');
$konfigurationsWert = $this->input->post('konfigurationsWert');
// check if Konfigurationstyp correctly passed
if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp'));
// check if fehlercode correctly passed
if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt'));
// separate by semicolon if multiple values passed
$konfigurationsWert = explode(';', $konfigurationsWert);
// check if konfiguration already set for the fehlercode
$this->FehlerkonfigurationModel->addSelect('konfiguration');
$fehlerkonfigurationRes = $this->FehlerkonfigurationModel->loadWhere(
array(
'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz,
'fehlercode' => $fehlercode
)
);
if (!hasData($fehlerkonfigurationRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden'));
// if konfiguration exists, update values
if (hasData($fehlerkonfigurationRes))
{
$fehlerkonfiguration = getData($fehlerkonfigurationRes);
$existingKonf = json_decode($fehlerkonfiguration[0]->konfiguration);
if (!$existingKonf) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerJsonDekodierung'));
if (!is_array($existingKonf)) $existingKonf = array($existingKonf);
$newKonfArr = array_values(array_diff($existingKonf, $konfigurationsWert));
// if no konfiguration values left, delete whole entry
if (isEmptyArray($newKonfArr))
{
$this->outputJson(
$this->FehlerkonfigurationModel->delete(
array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode)
)
);
}
else
{
$newKonf = json_encode($newKonfArr);
if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON");
// if there are still values, delete only part of the konfiguration
$this->outputJson(
$this->FehlerkonfigurationModel->update(
array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode),
array('konfiguration' => $newKonf, 'updateamum' => 'NOW()', 'updatevon' => $this->_uid)
)
);
}
}
}
/**
* Deletes a Konfiguration.
*/
public function deleteKonfiguration()
{
$konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz');
$fehlercode = $this->input->post('fehlercode');
// check if Konfigurationstyp correctly passed
if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp'));
// check if fehlercode correctly passed
if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt'));
$this->outputJson(
$this->FehlerkonfigurationModel->delete(
array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode)
)
);
}
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
}
@@ -26,7 +26,6 @@ class IssuesZustaendigkeiten extends Auth_Controller
// Load models
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('system/Fehler_model', 'FehlerModel');
$this->load->model('system/Fehler_model', 'FehlerModel');
$this->load->model('system/Fehlerzustaendigkeiten_model', 'FehlerzustaendigkeitenModel');
$this->loadPhrases(
@@ -70,7 +69,7 @@ class IssuesZustaendigkeiten extends Auth_Controller
{
$app = $this->input->get('app');
//$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz');
$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, app');
$this->FehlerModel->addOrder('fehlercode');
$fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load();
@@ -0,0 +1,194 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Plausichecks extends Auth_Controller
{
const GENERIC_ISSUE_OCCURED_TEXT = 'Issue aufgetreten';
public function __construct()
{
parent::__construct(
array(
'index' => array('system/issues_verwalten:r'),
'runChecks' => array('system/issues_verwalten:r')
)
);
// Load libraries
$this->load->library('issues/PlausicheckProducerLib', array('app' => 'core'));
$this->load->library('issues/PlausicheckDefinitionLib');
$this->load->library('WidgetLib');
// Load models
$this->load->model('system/Fehler_model', 'FehlerModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
/*
* Get data for filtering the plausichecks and load the view.
*/
public function index()
{
$filterData = $this->_getFilterData();
$this->load->view('system/issues/plausichecks', $filterData);
}
/**
* Initiate plausichecks run.
*/
public function runChecks()
{
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
$studiengang_kz = $this->input->get('studiengang_kz');
$fehler_kurzbz = $this->input->get('fehler_kurzbz');
// issues array for passing issue texts
$allIssues = array();
// all fehler kurzbz which are going to be checked
$fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz();
$fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings();
// set Studiengang to null if not passed
if (isEmptyString($studiengang_kz)) $studiengang_kz = null;
// get the data returned by Plausicheck
foreach ($fehlerKurzbz as $fehler_kurzbz)
{
// get Text and fehlercode of the Fehler
$this->FehlerModel->addSelect('fehlercode, fehlertext, fehlertyp_kurzbz');
$fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz));
if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes));
// do not check error if no data
if (!hasData($fehlerRes)) continue;
// get the error data
$fehler = getData($fehlerRes)[0];
// initialize issue array
$allIssues[$fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array());
// get library name for producing issue
$libName = $fehlerLibMappings[$fehler_kurzbz];
// execute the check
$plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue(
$libName,
$fehler_kurzbz,
array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $studiengang_kz
)
);
if (isError($plausicheckRes)) $this->terminateWithJsonError(getError($plausicheckRes));
if (hasData($plausicheckRes))
{
$plausicheckData = getData($plausicheckRes);
foreach ($plausicheckData as $plausiData)
{
// get the data needed for issue production
$person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null;
$oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null;
$fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null;
// optionally replace fehler parameters in text, output the fehlertext
if (!isEmptyString($fehler->fehlertext))
{
$fehlercode = $fehler->fehlercode;
$fehlerText = $fehler->fehlertext;
$fehlerTyp = $fehler->fehlertyp_kurzbz;
if (!isEmptyArray($fehlertext_params))
{
// replace placeholder with params, if present
if (count($fehlertext_params) != substr_count($fehlerText, '%s'))
$this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler_kurzbz);
$fehlerText = vsprintf($fehlerText, $fehlertext_params);
}
if (isset($person_id)) $fehlerText .= "; person_id: $person_id";
if (isset($oe_kurzbz)) $fehlerText .= "; oe_kurzbz: $oe_kurzbz";
$issueObj = new StdClass();
$issueObj->fehlertext = $fehlerText;
$issueObj->type = $fehlerTyp;
$allIssues[$fehler_kurzbz]['data'][] = $issueObj;
}
else // if no issue text found, use generic text
{
$fehlerText = self::GENERIC_ISSUE_OCCURED_TEXT;
}
// add generic parameters to issue text
if (isset($person_id)) $fehlerText .= "; person_id: $person_id";
if (isset($oe_kurzbz)) $fehlerText .= "; oe_kurzbz: $oe_kurzbz";
}
}
}
$this->outputJsonSuccess($allIssues);
}
/**
* Get the data needed for filtering for limiting checks.
*/
private function _getFilterData()
{
$this->StudiensemesterModel->addOrder('start', 'DESC');
$studiensemesterRes = $this->StudiensemesterModel->load();
if (isError($studiensemesterRes)) show_error(getError($studiensemesterRes));
$currSemRes = $this->StudiensemesterModel->getAkt();
if (isError($currSemRes)) show_error(getError($currSemRes));
$this->StudiengangModel->addSelect('studiengang_kz, tbl_studiengang.bezeichnung, tbl_studiengang.typ,
tbl_studiengangstyp.bezeichnung AS typbezeichnung, UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel');
$this->StudiengangModel->addJoin('public.tbl_studiengangstyp', 'typ');
$this->StudiengangModel->addOrder('kuerzel, tbl_studiengang.bezeichnung, studiengang_kz');
$studiengaengeRes = $this->StudiengangModel->loadWhere(array('aktiv' => true));
if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes));
$fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz();
$db = new DB_Model();
// get fehlercodes for fehler_kurzbz
$fehlerRes = $db->execReadOnlyQuery(
'SELECT
fehler_kurzbz, fehlercode
FROM
system.tbl_fehler
WHERE
fehler_kurzbz IN ?',
array($fehlerKurzbz)
);
if (isError($fehlerRes)) show_error(getError($fehlerRes));
$fehlerKurzbzCodeMappings = array();
if (hasData($fehlerRes))
{
$fehler = getData($fehlerRes);
foreach ($fehler as $fe)
{
$fehlerKurzbzCodeMappings[$fe->fehler_kurzbz] = $fe->fehlercode;
}
}
return array(
'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(),
'currsemester' => hasData($currSemRes) ? getData($currSemRes) : array(),
'studiengaenge' => hasData($studiengaengeRes) ? getData($studiengaengeRes) : array(),
'fehlerKurzbzCodeMappings' => $fehlerKurzbzCodeMappings
);
}
}
@@ -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)
);
}
+123 -18
View File
@@ -7,6 +7,10 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
*/
abstract class Auth_Controller extends FHC_Controller
{
// Special Permissions
const PERM_ANONYMOUS = 'anonymous'; // Everyone
const PERM_LOGGED = 'logged_in'; // Every registered user
/**
* Extends this controller if authentication is required
*/
@@ -14,17 +18,41 @@ abstract class Auth_Controller extends FHC_Controller
{
parent::__construct();
// Loads authentication library and starts authentication
$this->load->library('AuthLib');
if (!is_array($requiredPermissions) || isEmptyArray($requiredPermissions))
show_error('The given permissions is not a valid array or it is an empty one');
if (!isset($requiredPermissions[$this->router->method]))
show_error('The given permission array does not contain the given method or is not correctly set');
$anonAllowed = false;
if ($requiredPermissions[$this->router->method] == self::PERM_ANONYMOUS)
$anonAllowed = true;
elseif (is_array($requiredPermissions[$this->router->method])
&& in_array(self::PERM_ANONYMOUS, $requiredPermissions[$this->router->method]))
$anonAllowed = true;
// Checks if the caller is allowed to access to this content
$this->_isAllowed($requiredPermissions);
if ($anonAllowed) {
// Loads authentication library without authentication
$this->load->library('AuthLib', [false]);
// Loads helper since it would only be called on authentication
$this->load->helper('hlp_authentication');
} else {
// Loads authentication library and starts authentication
$this->load->library('AuthLib');
// Checks if the caller is allowed to access to this content
$this->_isAllowed($requiredPermissions);
}
}
/**
* Checks if the caller is allowed to access to this content with the given permissions
* If it is not allowed will set the HTTP header with code 401
* Wrapper for permissionlib->isEntitled
*
* @param array $requiredPermissions
* @return void
*/
private function _isAllowed($requiredPermissions)
{
@@ -34,28 +62,105 @@ abstract class Auth_Controller extends FHC_Controller
// Checks if this user is entitled to access to this content
if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method))
{
$this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized
$this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
// Prints the main error message
$this->eprintflib->printError('You are not allowed to access to this content');
// Prints the called controller name
$this->eprintflib->printInfo('Controller name: '.$this->router->class);
// Prints the called controller method name
$this->eprintflib->printInfo('Method name: '.$this->router->method);
// Prints the required permissions needed to access to this method
$this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method));
$this->_outputAuthError($requiredPermissions);
exit; // immediately terminate the execution
}
}
/**
* Checks for Permissions depending if the given person is a
* Mitarbeiter and/or Student
* and exits/outputs an error if they are not met.
*
* @param integer $person_id
* @param array $permMa Perms if the person is a Mitarbeiter
* @param array $permStud Perms if the person is a Student
*
* @return void
*/
protected function checkPermissionsForPerson($person_id, $permMa, $permStud)
{
$res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud);
if ($res) {
$perm = array_keys(array_flip(array_merge($res|1 ? $permMa : [], $res|2 ? $permStud : [])));
$this->_outputAuthError([$this->router->method => $perm]);
}
}
/**
* Checks for Permissions depending if the given person is a
* Mitarbeiter and/or Student
* and returns the result.
*
* @param integer $person_id
* @param array $permMa Perms if the person is a Mitarbeiter
* @param array $permStud Perms if the person is a Student
*
* @return boolean
*/
protected function hasPermissionsForPerson($person_id, $permMa, $permStud)
{
$res = 0;
$this->load->model('person/Person_model', 'PersonModel');
$this->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid');
$result = $this->PersonModel->load($person_id);
if (hasData($result)) {
if ($this->permissionlib->isEntitled(['a' => $permMa], 'a'))
return 0;
$res = 1;
}
$this->PersonModel->addJoin('public.tbl_prestudent', 'person_id');
$result = $this->PersonModel->load($person_id);
if (hasData($result)) {
$permStudConverted = [];
foreach (getData($result) as $row) {
foreach ($permStud as $k => $v) {
if (!isset($permStudConverted[$k])) {
$permStudConverted[$k] = $this->permissionlib->convertAccessType($v);
}
if ($this->permissionlib->isBerechtigt($permStudConverted[$k][0], $permStudConverted[$k][1], $row->studiengang_kz))
return 0;
}
}
$res += 2;
}
return $res;
}
/**
* Outputs an error message and sets the HTTP Header.
* This function is protected so that it can be overwritten.
*
* @param array $requiredPermissions
* @return void
*/
protected function _outputAuthError($requiredPermissions)
{
$this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized
$this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
// Prints the main error message
$this->eprintflib->printError('You are not allowed to access to this content');
// Prints the called controller name
$this->eprintflib->printInfo('Controller name: '.$this->router->class);
// Prints the called controller method name
$this->eprintflib->printInfo('Method name: '.$this->router->method);
// Prints the required permissions needed to access to this method
$this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method));
}
/**
* Converts an array of permissions to a string that contains them as a comma separated list
* Ex: "<permission 1>, <permission 2>, <permission 3>"
*
* @param array $requiredPermissions
* @param string $method
* @return void
*/
private function _rpsToString($requiredPermissions, $method)
final protected function _rpsToString($requiredPermissions, $method)
{
$strRequiredPermissions = ''; // string that contains all the required permissions needed to access to this method
+51
View File
@@ -0,0 +1,51 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class CI3_Events
{
const PRIORITY_LOW = 200;
const PRIORITY_NORMAL = 100;
const PRIORITY_HIGH = 10;
private static $events = [];
private static $eventsSorted = [];
public static function on($event, $function, $priority = self::PRIORITY_NORMAL)
{
if (!isset(self::$events[$event]))
self::$events[$event] = [];
self::$events[$event][] = [$priority, $function];
if (!isset(self::$eventsSorted[$event]))
self::$eventsSorted[$event] = true;
else
self::$eventsSorted[$event] = false;
}
public static function trigger($event, ...$args)
{
if (!isset(self::$events[$event]))
return;
if (!self::$eventsSorted[$event]) {
usort(self::$events[$event], function ($a, $b) {
return $a[0] - $b[0];
});
self::$eventsSorted[$event] = true;
}
foreach (self::$events[$event] as $conf) {
$conf[1](...$args);
}
}
}
/**
* NOTE(chris): Autoload Events config
*/
require_once(APPPATH.'config/Events.php');
foreach (scandir(APPPATH.'config/extensions') as $dir)
if ($dir[0] != '.' && file_exists(APPPATH.'config/extensions/'.$dir.'/Events.php'))
require_once APPPATH.'config/extensions/'.$dir.'/Events.php';
+297 -28
View File
@@ -1,5 +1,24 @@
<?php
/**
* Copyright (C) 2023 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/>.
*/
use \stdClass as stdClass;
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
@@ -27,6 +46,15 @@ class DB_Model extends CI_Model
const PGSQL_INT8_TYPE = 'int8';
const PGSQL_FLOAT4_TYPE = 'float4';
const PGSQL_FLOAT8_TYPE = 'float8';
const PGSQL_BYTEA_TYPE = 'bytea';
// Name of the config entry containing an array of password that can be used to encrypt/decrypt
const CRYPT_CONF_PASSWORDS = 'encryption_passwords';
const CRYPT_CAST = 'cast';
const CRYPT_PASSWORD_NAME = 'passwordName';
const CRYPT_SELECT_TEMPLATE = 'PGP_SYM_DECRYPT(%s, \'%s\')::%s AS %s';
const CRYPT_WHERE_TEMPLATE = 'PGP_SYM_DECRYPT(%s, \'%s\')::%s';
const CRYPT_WRITE_TEMPLATE = 'PGP_SYM_ENCRYPT(\'%s\', \'%s\')';
protected $dbTable; // Name of the DB-Table for CI-Insert, -Update, ...
protected $pk; // Name of the PrimaryKey for DB-Update, Load, ...
@@ -36,7 +64,7 @@ class DB_Model extends CI_Model
private $executedQueryMetaData;
private $executedQueryListFields;
private $debugMode;
private $debugMode; // Debug mode enable (true) or disabled (false)
/**
* Constructor
@@ -46,20 +74,23 @@ class DB_Model extends CI_Model
// Call parent constructor
parent::__construct();
// Set properties
$this->hasSequence = true;
// Loads DB conns and confs
// Loads DB connections and configs
$this->load->database($dbtype);
// Loads the DB config to encrypt/decrypt data
$this->config->load('db_crypt');
// Set properties
$this->hasSequence = true;
$this->debugMode = isset($this->db->db_debug) && $this->db->db_debug === true;
// Loads UDF model
$this->load->model('system/UDF_model', 'UDFModel');
// Loads the UDF library
$this->load->library('UDFLib');
// Loads the logs library
$this->load->library('LogLib');
$this->debugMode = isset($this->db->db_debug) && $this->db->db_debug === true;
}
// ------------------------------------------------------------------------------------------
@@ -85,13 +116,20 @@ class DB_Model extends CI_Model
* @param array $data DataArray for Insert
* @return array
*/
public function insert($data)
public function insert($data, $encryptedColumns = null)
{
// Check class properties
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
// If this table has UDF and the validation of them is ok
if (isError($validate = $this->_prepareUDFsWrite($data, $this->dbTable))) return $validate;
$validate = $this->_prepareUDFsWrite($data, $this->dbTable);
if (isError($validate)) return $validate;
// Add the pgp_sym_eccrypt postgresql function to the set clause if needed
$this->_addEncrypt($encryptedColumns, $data);
// Add the pgp_sym_eccrypt postgresql function to the set clause if needed
if (!empty($encryptedColumns)) $this->_addEncrypt($encryptedColumns, $data);
// DB-INSERT
$insert = $this->db->insert($this->dbTable, $data);
@@ -135,14 +173,15 @@ class DB_Model extends CI_Model
* @param array $data DataArray for Insert
* @return array
*/
public function update($id, $data)
public function update($id, $data, $encryptedColumns = null)
{
// Check class properties
if (is_null($this->pk)) return error('The given primary key is not valid', EXIT_MODEL);
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
// If this table has UDF and the validation of them is ok
if (isError($validate = $this->_prepareUDFsWrite($data, $this->dbTable, $id))) return $validate;
$validate = $this->_prepareUDFsWrite($data, $this->dbTable, $id);
if (isError($validate)) return $validate;
$tmpId = $id;
@@ -161,6 +200,9 @@ class DB_Model extends CI_Model
$this->db->where($tmpId);
// Add the pgp_sym_eccrypt postgresql function to the set clause if needed
$this->_addEncrypt($encryptedColumns, $data);
// DB-UPDATE
$update = $this->db->update($this->dbTable, $data);
@@ -224,7 +266,7 @@ class DB_Model extends CI_Model
* @param string $id ID (Primary Key) for SELECT ... WHERE
* @return array
*/
public function load($id = null)
public function load($id = null, $encryptedColumns = null)
{
// Check class properties
if (is_null($this->pk)) return error('The given primary key is not valid', EXIT_MODEL);
@@ -245,7 +287,7 @@ class DB_Model extends CI_Model
$tmpId = array($this->pk => $id);
}
return $this->loadWhere($tmpId);
return $this->loadWhere($tmpId, $encryptedColumns);
}
/**
@@ -253,11 +295,14 @@ class DB_Model extends CI_Model
*
* @return array
*/
public function loadWhere($where = null)
public function loadWhere($where = null, $encryptedColumns = null)
{
// Check class properties
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
// Add the pgp_sym_decrypt postgresql function to the select and where clause if needed
$this->_addDecryptLoad($encryptedColumns, $where);
// Execute query
$result = $this->db->get_where($this->dbTable, $where);
@@ -265,7 +310,7 @@ class DB_Model extends CI_Model
if ($result)
{
return success($this->_toPhp($result));
return success($this->_toPhp($result, $encryptedColumns));
}
else
{
@@ -303,7 +348,8 @@ class DB_Model extends CI_Model
// NOTE: $this->db->list_fields($tables[$t]) doesn't work if there are two tables with
// the same name in two different schemas, use this workaround
$fields = array();
if (isSuccess($lstColumns = $this->_list_columns($schemaAndTable->schema, $schemaAndTable->table)))
$lstColumns = $this->_list_columns($schemaAndTable->schema, $schemaAndTable->table);
if (isSuccess($lstColumns))
{
$fields = $lstColumns->retval;
}
@@ -381,7 +427,8 @@ class DB_Model extends CI_Model
$tmpFilteredArray = array_filter(get_object_vars($sideTableObj));
if (isset($tmpFilteredArray) && count($tmpFilteredArray) > 0)
{
if (($k = $this->_findMainTable($mainTableObj, $returnArray)) === false)
$k = $this->_findMainTable($mainTableObj, $returnArray);
if ($k === false)
{
$mainTableObj->{$sideTableProperty} = array($sideTableObj);
$returnArray[$returnArrayCounter++] = $mainTableObj;
@@ -758,14 +805,13 @@ class DB_Model extends CI_Model
/**
* Like execQuery, but it allows only to perform queries to read data
*/
public function execReadOnlyQuery($query, $parametersArray = null)
public function execReadOnlyQuery($query, $parametersArray = null, $encryptedColumns = null)
{
$result = error('You are allowed to run only query for reading data'); //
$cleanedQuery = trim(preg_replace('/\t|\n|\r|;/', '', $query)); //
//
if (
(stripos($cleanedQuery, 'INSERT') > 0 || stripos($cleanedQuery, 'INSERT') == false)
if ((stripos($cleanedQuery, 'INSERT') > 0 || stripos($cleanedQuery, 'INSERT') == false)
&& (stripos($cleanedQuery, 'UPDATE') > 0 || stripos($cleanedQuery, 'UPDATE') == false)
&& (stripos($cleanedQuery, 'CREATE') > 0 || stripos($cleanedQuery, 'CREATE') == false)
&& (stripos($cleanedQuery, 'DELETE') > 0 || stripos($cleanedQuery, 'DELETE') == false)
@@ -775,7 +821,7 @@ class DB_Model extends CI_Model
{
$queryToExec = str_replace(';', '', $query); //
$result = $this->execQuery($queryToExec, $parametersArray);
$result = $this->execQuery($queryToExec, $parametersArray, $encryptedColumns);
}
return $result;
@@ -790,13 +836,16 @@ class DB_Model extends CI_Model
* boolean if the query is of the write type (INSERT, UPDATE, DELETE...)
* array that represents DB data
*/
protected function execQuery($query, $parametersArray = null)
protected function execQuery($query, $parametersArray = null, $encryptedColumns = null)
{
$result = null;
// If the query is empty don't lose time
if (!isEmptyString($query))
{
// Add the pgp_sym_decrypt postgresql function to the given query
$this->_addDecryptQuery($encryptedColumns, $query);
// If there are parameters to bind to the query
if (is_array($parametersArray) && count($parametersArray) > 0)
{
@@ -812,7 +861,7 @@ class DB_Model extends CI_Model
// If no errors occurred
if ($resultDB)
{
$result = success($this->_toPhp($resultDB));
$result = success($this->_toPhp($resultDB, $encryptedColumns));
}
else
{
@@ -840,7 +889,8 @@ class DB_Model extends CI_Model
$result->schema = DB_Model::DEFAULT_SCHEMA;
// If a schema is specified
if (($pos = strpos($schemaAndTable, '.')) !== false)
$pos = strpos($schemaAndTable, '.');
if ($pos !== false)
{
$result->schema = substr($schemaAndTable, 0, $pos);
$result->table = substr($schemaAndTable, $pos + 1);
@@ -851,6 +901,207 @@ class DB_Model extends CI_Model
// ------------------------------------------------------------------------------------------
// Private methods
//
//
/**
* To add the pgp_sym_encrypt function to the set clause where needed
*/
private function _addEncrypt($encryptedColumns, &$data)
{
// If encryptedColumns is not defined then exit
if (isEmptyArray($encryptedColumns)) return;
$tmpData = array(); // Temporary array used to copy not encrypted columns
// For each column that is going to be inserted/updated
foreach ($data as $column => $value)
{
// If the current column is in the list of the columns to be encrypted
// and contains the password name element
if (array_key_exists($column, $encryptedColumns)
&& array_key_exists(self::CRYPT_PASSWORD_NAME, $encryptedColumns[$column]))
{
// Password to encrypt data
$cryptConfPasswords = $this->config->item(self::CRYPT_CONF_PASSWORDS);
$encryptionPassword = $cryptConfPasswords[$encryptedColumns[$column][self::CRYPT_PASSWORD_NAME]];
// Add the encrypted column to the set clause without escaping
$this->db->set(
$column,
sprintf(
self::CRYPT_WRITE_TEMPLATE,
$value,
$encryptionPassword
),
false // no escaping
);
}
else // otherwise copy this element as it is
{
$tmpData[$column] = $value;
}
}
$data = $tmpData; // this array does not contain encrypted columns
}
/**
* To add the pgp_sym_decrypt function to the given query
*/
private function _addDecryptQuery($encryptedColumns, &$query)
{
// If it is request to get encrypted columns
if (!isEmptyArray($encryptedColumns))
{
// For each requested encrypted column
foreach ($encryptedColumns as $encryptedColumn => $definition)
{
// If the requested encrypted column is well defined
if (!isEmptyArray($definition)
&& array_key_exists(self::CRYPT_CAST, $definition)
&& array_key_exists(self::CRYPT_PASSWORD_NAME, $definition))
{
// And if exists the wanted password to decrypt in the configs
if (array_key_exists($definition[self::CRYPT_PASSWORD_NAME], $this->config->item(self::CRYPT_CONF_PASSWORDS)))
{
// Password to decrypt data
$cryptConfPasswords = $this->config->item(self::CRYPT_CONF_PASSWORDS);
$decryptionPassword = $cryptConfPasswords[$definition[self::CRYPT_PASSWORD_NAME]];
// Find and replace all the occurrences of the provided encrypted columns
// with the postgresql decryption function
$query = str_replace(
$encryptedColumn,
sprintf(
self::CRYPT_WHERE_TEMPLATE,
$encryptedColumn,
$decryptionPassword,
$definition[self::CRYPT_CAST]
),
$query
);
}
}
}
}
}
/**
* To add the pgp_sym_decrypt function to the select and where clause where needed
*/
private function _addDecryptLoad($encryptedColumns, &$where)
{
// If it is request to get encrypted columns
if (!isEmptyArray($encryptedColumns))
{
// For each requested encrypted column
foreach ($encryptedColumns as $encryptedColumn => $definition)
{
// If the requested encrypted column is well defined
if (!isEmptyArray($definition)
&& array_key_exists(self::CRYPT_CAST, $definition)
&& array_key_exists(self::CRYPT_PASSWORD_NAME, $definition))
{
// And if exists the wanted password to decrypt in the configs
if (array_key_exists($definition[self::CRYPT_PASSWORD_NAME], $this->config->item(self::CRYPT_CONF_PASSWORDS)))
{
// Password to decrypt data
$cryptConfPasswords = $this->config->item(self::CRYPT_CONF_PASSWORDS);
$decryptionPassword = $cryptConfPasswords[$definition[self::CRYPT_PASSWORD_NAME]];
// -----------------------------------------
// SELECT
// Add to the select clause the column to be decrypted
// NOTE: this is going to override any previously added column with the same name
$this->addSelect(
sprintf(
self::CRYPT_SELECT_TEMPLATE,
$encryptedColumn,
$decryptionPassword,
$definition[self::CRYPT_CAST],
$encryptedColumn
)
);
// -----------------------------------------
// WHERE
// If the where parameter is a valid array
if (!isEmptyArray($where))
{
$tmpWhere = array();
// For each condition of the where clause
foreach ($where as $column => $condition)
{
$operator = null; // operator not found in the column name
// Custom operators with 2 chars
if (strpos($column, '>=') != false
|| strpos($column, '<=') != false
|| strpos($column, '!=') != false
|| strpos($column, '<>') != false
)
{
$operator = ' '.substr(trim($column), -2).' ';
}
// Custom operators with 1 chars
elseif (strpos($column, '>') != false
|| strpos($column, '<') != false
|| strpos($column, '=') != false
)
{
$operator = ' '.substr(trim($column), -1).' ';
}
else // default operator
{
$operator = ' = ';
}
// If the column from the where clause is the same from the encrypted columns definition
if (trim($column) == $encryptedColumn
|| ($operator != null && substr(trim($column), 0, strlen(trim($column)) - 2) == $encryptedColumn)
)
{
// Then rename the column using the postgresql decryption function
$tmpWhere[sprintf(
self::CRYPT_WHERE_TEMPLATE,
$encryptedColumn,
$decryptionPassword,
$definition[self::CRYPT_CAST]
).$operator] = $condition;
}
else // otherwise copy the column as it is
{
$tmpWhere[$column] = $condition;
}
}
$where = $tmpWhere; // replace with the new where
}
// Otherwise if the where parameter is a valid string
elseif (!isEmptyString($where))
{
// Find and replace all the occurrences of the provided encrypted columns
// with the postgresql decryption function
$where = str_replace(
$encryptedColumn,
sprintf(
self::CRYPT_WHERE_TEMPLATE,
$encryptedColumn,
$decryptionPassword,
$definition[self::CRYPT_CAST]
),
$where
);
}
}
}
}
}
}
/**
* Invalid ID
@@ -877,11 +1128,11 @@ class DB_Model extends CI_Model
{
if ($id != null)
{
$prepareUDFsWrite = $this->udflib->prepareUDFsWrite($data, $this->dbTable, $this->_getUDFsNoPerms($id));
$prepareUDFsWrite = $this->udflib->prepareUDFsWrite($data, $schemaAndTable, $this->_getUDFsNoPerms($id));
}
else
{
$prepareUDFsWrite = $this->udflib->prepareUDFsWrite($data, $this->dbTable);
$prepareUDFsWrite = $this->udflib->prepareUDFsWrite($data, $schemaAndTable);
}
}
@@ -895,7 +1146,7 @@ class DB_Model extends CI_Model
* - A FALSE value on failure
* - Otherwise an object filled with data on success
*/
private function _toPhp($result)
private function _toPhp($result, $encryptedColumns = null)
{
$udfs = false; // if UDFs are inside the given result set
$toPhp = $result; // if there is nothing to convert then return the result from DB
@@ -911,7 +1162,9 @@ class DB_Model extends CI_Model
// Looking for booleans, arrays and UDFs
foreach ($this->executedQueryMetaData as $eqmd)
{
// If array type, boolean type OR a UDF
// If array type, boolean type, numeric type
// Or bytea type
// Or UDF type
if (strpos($eqmd->type, DB_Model::PGSQL_ARRAY_TYPE) !== false
|| $eqmd->type == DB_Model::PGSQL_BOOLEAN_TYPE
|| $eqmd->type == DB_Model::PGSQL_INT2_TYPE
@@ -919,6 +1172,7 @@ class DB_Model extends CI_Model
|| $eqmd->type == DB_Model::PGSQL_INT8_TYPE
|| $eqmd->type == DB_Model::PGSQL_FLOAT4_TYPE
|| $eqmd->type == DB_Model::PGSQL_FLOAT8_TYPE
|| $eqmd->type == DB_Model::PGSQL_BYTEA_TYPE
|| $this->udflib->isUDFColumn($eqmd->name, $eqmd->type))
{
// If UDFs are inside this result set
@@ -981,6 +1235,21 @@ class DB_Model extends CI_Model
{
$resultElement->{$toBeConverted->name} = $this->pgFloatPhp($resultElement->{$toBeConverted->name});
}
// Byte A type
elseif ($toBeConverted->type == DB_Model::PGSQL_BYTEA_TYPE)
{
// If encrypted columns are defined
// and if the byte a column is defined as encrypted column
if (!isEmptyArray($encryptedColumns)
&& array_key_exists($toBeConverted->name, $encryptedColumns))
{
// keep the column
}
else // otherwise remove the column from the result
{
unset($resultElement->{$toBeConverted->name});
}
}
}
}
}
+231
View File
@@ -0,0 +1,231 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Controller using JSON
*/
class FHCAPI_Controller extends Auth_Controller
{
/**
* Response status
* @see https://github.com/omniti-labs/jsend
*/
const STATUS_SUCCESS = 'success';
const STATUS_FAIL = 'fail';
const STATUS_ERROR = 'error';
/**
* Error types
*/
const ERROR_TYPE_PHP = 'php';
const ERROR_TYPE_EXCEPTION = 'exception';
const ERROR_TYPE_GENERAL = 'general';
const ERROR_TYPE_404 = '404';
const ERROR_TYPE_DB = 'db';
const ERROR_TYPE_VALIDATION = 'validation';
const ERROR_TYPE_AUTH = 'auth';
/**
* Return Object
*
* @var array
*/
private $returnObj = [];
/**
* Constructor
*
* @param array $requiredPermissions
* @return void
*/
public function __construct($requiredPermissions = [])
{
if (is_cli())
show_404();
global $g_result;
$g_result = $this;
ob_start(function ($content) {
$http_response_code = http_response_code();
// NOTE(chris): For security reasons 404 will be displayed the same everywhere
if ($http_response_code == REST_Controller::HTTP_NOT_FOUND)
return $content;
header('Content-Type: application/json; charset=utf-8');
if (!isset($this->returnObj['meta']) || !isset($this->returnObj['meta']['status'])) {
switch ($http_response_code) {
case 200:
$this->setStatus(self::STATUS_SUCCESS);
break;
case 400:
$this->setStatus(self::STATUS_FAIL);
break;
default:
$this->setStatus(self::STATUS_ERROR);
break;
}
}
return json_encode($this->returnObj);
});
// NOTE(chris): overwrite error_views_path before constructor
load_class('Config')->set_item('error_views_path', VIEWPATH.'errors'.DIRECTORY_SEPARATOR.'json'.DIRECTORY_SEPARATOR);
parent::__construct($requiredPermissions);
// For JSON Requests (as opposed to multipart/form-data) get the $_POST variable from the input stream instead
if ($this->input->get_request_header('Content-Type', true) == 'application/json')
$_POST = json_decode($this->security->xss_clean($this->input->raw_input_stream), true);
elseif (isset($_POST['_jsondata'])) {
$_POST = array_merge($_POST, json_decode($_POST['_jsondata'], true));
unset($_POST['_jsondata']);
}
}
// ---------------------------------------------------------------
// Handle Output object
// ---------------------------------------------------------------
/**
* @param array $data
* @param string $type (optional)
* @return void
*/
public function addError($data, $type = null)
{
if (!isset($this->returnObj['errors']))
$this->returnObj['errors'] = [];
$error = [];
if (is_array($data)) {
if ($type == self::ERROR_TYPE_VALIDATION)
$error['messages'] = $data;
else
$error = $data;
} else {
$error['message'] = $data;
}
if ($type)
$error['type'] = $type;
$this->returnObj['errors'][] = $error;
}
/**
* @param mixed $data
* @return void
*/
public function setData($data)
{
$this->returnObj['data'] = $data;
}
/**
* @param string $key
* @param mixed $value
* @return void
*/
public function addMeta($key, $value)
{
if (!isset($this->returnObj['meta']))
$this->returnObj['meta'] = [];
$this->returnObj['meta'][$key] = $value;
}
/**
* @param string $status
* @return void
*/
public function setStatus($status)
{
$this->addMeta('status', $status);
}
// ---------------------------------------------------------------
// Handle Output object - Shortcut functions
// ---------------------------------------------------------------
/**
* @param mixed $data (optional)
* @return void
*/
protected function terminateWithSuccess($data = null)
{
$this->setData($data);
$this->setStatus(self::STATUS_SUCCESS);
exit;
}
/**
* @param array $errors
* @return void
*/
protected function terminateWithValidationErrors($errors)
{
$this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
$this->addError($errors, self::ERROR_TYPE_VALIDATION);
$this->setStatus(self::STATUS_FAIL);
exit(EXIT_ERROR);
}
/**
* @param array $error
* @param string $type (optional)
* @param integer $status (optional)
* @return void
*/
protected function terminateWithError($error, $type = null, $status = REST_Controller::HTTP_INTERNAL_SERVER_ERROR)
{
$this->output->set_status_header($status);
$this->addError($error, $type);
$this->setStatus(self::STATUS_ERROR);
exit;
}
/**
* @param stdclass $result
* @param string $errortype
* @return void
*/
protected function getDataOrTerminateWithError($result, $errortype = self::ERROR_TYPE_GENERAL)
{
if (isError($result)) {
$this->terminateWithError(getError($result), $errortype);
}
return $result->retval;
}
// ---------------------------------------------------------------
// Security
// ---------------------------------------------------------------
/**
* Outputs an error message and sets the HTTP Header.
* This overwrites the default behaviour to output a json object.
*
* @param array $requiredPermissions
* @return void
*/
protected function _outputAuthError($requiredPermissions)
{
$this->output->set_status_header(isLogged() ? REST_Controller::HTTP_FORBIDDEN : REST_Controller::HTTP_UNAUTHORIZED);
$this->addError([
'message' => 'You are not allowed to access to this content',
'controller' => $this->router->class,
'method' => $this->router->method,
'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
], self::ERROR_TYPE_AUTH);
}
}
+10
View File
@@ -169,6 +169,15 @@ abstract class FHC_Controller extends CI_Controller
}
}
/**
* Return the JSON decoded HTTP POST request
* If the request is not in JSON format then a null value is returned
*/
protected function getPostJSON()
{
return json_decode($this->input->raw_input_stream);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
@@ -185,3 +194,4 @@ abstract class FHC_Controller extends CI_Controller
}
}
}
+87
View File
@@ -0,0 +1,87 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Language Class
*/
class FHC_Lang extends CI_Lang
{
private $_phrases = [];
/**
* Load a language file
*
* @param mixed $langfile Language file name
* @param string $idiom Language name (english, etc.)
* @param bool $return Whether to return the loaded array of translations
* @param bool $add_suffix Whether to add suffix to $langfile
* @param string $alt_path Alternative path to look for the language file
*
* @return void|string[] Array containing translations, if $return is set to TRUE
*/
public function load($langfile, $idiom = '', $return = false, $add_suffix = true, $alt_path = '')
{
$language = getUserLanguage($idiom ?: null);
$language = 'english';
if (!isset($this->_phrases[$language]))
$this->_phrases[$language] = [];
$categories = [];
if (is_array($langfile)) {
foreach ($langfile as $cat)
if (!isset($this->_phrases[$language][$cat]))
$categories[] = 'ci_' . $cat;
} else {
$categories[] = 'ci_' . $langfile;
}
if ($categories) {
$ci =& get_instance();
$ci->load->model('system/Phrase_model', 'PhraseModel');
$phrases = $ci->PhraseModel->getPhrasesByCategoryAndLanguage($categories, $language);
$loadedPhrases = array_fill_keys($categories, []);
foreach ($phrases->retval as $phrase)
if (!is_null($phrase->text) && in_array($phrase->category, $categories))
$loadedPhrases[$phrase->category][$phrase->phrase] = $phrase->text;
if ($language != DEFAULT_LANGUAGE) {
$defaultPhrases = $ci->PhraseModel->getPhrasesByCategoryAndLanguage($categories, DEFAULT_LANGUAGE);
if (hasData($phrases) && hasData($defaultPhrases)) {
foreach ($defaultPhrases->retval as $phrase)
if (!isset($loadedPhrases[$phrase->category][$phrase->phrase]))
$loadedPhrases[$phrase->category][$phrase->phrase] = $phrase->text;
} elseif (hasData($defaultPhrases)) {
foreach ($defaultPhrases->retval as $phrase)
if (!is_null($phrase->text) && in_array($phrase->category, $categories))
$loadedPhrases[$phrase->category][$phrase->phrase] = $phrase->text;
}
}
foreach ($loadedPhrases as $cat => $phrases)
$this->_phrases[$language][$cat] = $phrases;
}
$result = parent::load($langfile, strtolower($language), $return, $add_suffix, $alt_path);
if ($return) {
if (is_array($langfile))
foreach ($langfile as $cat)
$result = array_merge($result, $this->_phrases[$language]['ci_' . $cat]);
else
$result = array_merge($result, $this->_phrases[$language]['ci_' . $langfile]);
} else {
if (is_array($langfile))
foreach ($langfile as $cat)
$this->language = array_merge($this->language, $this->_phrases[$language]['ci_' . $cat]);
else
$this->language = array_merge($this->language, $this->_phrases[$language]['ci_' . $langfile]);
}
return $result;
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
/**
* Copyright (C) 2023 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/>.
*/
interface IEncryption
{
public function getEncryptedColumns(): array;
}
+61 -56
View File
@@ -5,7 +5,10 @@
*/
abstract class IssueResolver_Controller extends JOB_Controller
{
const ISSUES_FOLDER = 'issues';
const CI_PATH = 'application';
const CI_LIBRARY_FOLDER = 'libraries';
const EXTENSIONS_FOLDER = 'extensions';
const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers';
const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved';
protected $_codeLibMappings;
@@ -43,71 +46,73 @@ abstract class IssueResolver_Controller extends JOB_Controller
}
else
{
$openIssues = getData($openIssuesRes);
foreach ($openIssues as $issue)
{
if (isset($this->_codeLibMappings[$issue->fehlercode]))
// ignore if Fehlercode is not in libmappings (shouldn't be checked)
if (!isset($this->_codeLibMappings[$issue->fehlercode])) continue;
$libName = $this->_codeLibMappings[$issue->fehlercode];
// add person id and oe kurzbz automatically as params, merge it with additional params
// decode bewerbung_parameter into assoc array
$params = array_merge(
array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
);
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
// path for loading issue library
$issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
// file path of library for check if file exists
$issuesLibFilePath = DOC_ROOT . self::CI_PATH
. '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath))
{
$libName = $this->_codeLibMappings[$issue->fehlercode];
// log error and continue with next issue if not
$this->logError("Issue library file " . $issuesLibFilePath . " does not exist");
continue;
}
// add person id and oe kurzbz automatically as params, merge it with additional params
// decode bewerbung_parameter into assoc array
$params = array_merge(
array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
);
// load library connected to fehlercode
$this->load->library($issuesLibPath . $libName);
// if called from extension (extension name set), path includes extension names, otherwise it is the core library folder
$libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : '';
$issuesLibPath = $libRootPath . self::ISSUES_FOLDER . '/';
$issuesLibFilePath = DOC_ROOT . 'application/' . $libRootPath . 'libraries/' . self::ISSUES_FOLDER . '/' . $libName . '.php';
$lowercaseLibName = mb_strtolower($libName);
// check if library file exists
if (!file_exists($issuesLibFilePath))
// check if method is defined in library class
if (!is_callable(array($this->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
{
// log error and continue with next issue if not
$this->logError("Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName");
continue;
}
// call the function for checking for issue resolution
$issueResolvedRes = $this->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
if (isError($issueResolvedRes))
{
$this->logError(getError($issueResolvedRes));
}
else
{
$issueResolvedData = getData($issueResolvedRes);
if ($issueResolvedData === true)
{
// log error and continue with next issue if not
$this->logError("Issue library file " . $issuesLibFilePath . " does not exist");
continue;
}
// set issue to resolved if needed
$behobenRes = $this->issueslib->setBehoben($issue->issue_id, null);
// load library connected to fehlercode
$this->load->library(
$issuesLibPath . $libName
);
$lowercaseLibName = mb_strtolower($libName);
// check if method is defined in libary class
if (!is_callable(array($this->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
{
// log error and continue with next issue if not
$this->logError("Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName");
continue;
}
// call the function for checking for issue resolution
$issueResolvedRes = $this->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
if (isError($issueResolvedRes))
{
$this->logError(getError($issueResolvedRes));
}
else
{
$issueResolvedData = getData($issueResolvedRes);
if ($issueResolvedData === true)
{
// set issue to resolved if needed
$behobenRes = $this->issueslib->setBehoben($issue->issue_id, null);
if (isError($behobenRes))
$this->logError(getError($behobenRes));
else
$this->logInfo("Issue " . $issue->issue_id . " successfully resolved");
}
if (isError($behobenRes))
$this->logError(getError($behobenRes));
else
$this->logInfo("Issue " . $issue->issue_id . " successfully resolved");
}
}
}
@@ -0,0 +1,66 @@
<?php
/**
* Job for producing Plausicheck issues
*/
abstract class PlausiIssueProducer_Controller extends JOB_Controller
{
protected $_fehlerLibMappings;
protected $_app;
public function __construct($app = null)
{
parent::__construct();
// pass extension name if calling from extension
$extensionName = isset($this->_extensionName) ? $this->_extensionName : null;
// load libraries
$this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName, 'app' => $this->_app));
$this->load->library('IssuesLib');
}
protected function producePlausicheckIssues($params)
{
$this->logInfo("Plausicheck issue producer job started");
// get the data returned by Plausicheck
foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName)
{
// execute the check
$this->logInfo("Checking " . $fehler_kurzbz . "...");
$plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue(
$libName,
$fehler_kurzbz,
$params
);
if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes));
if (hasData($plausicheckRes))
{
$plausicheckData = getData($plausicheckRes);
foreach ($plausicheckData as $plausiData)
{
// get the data needed for issue production
$person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null;
$oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null;
$fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null;
$resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null;
// write the issue
$addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params);
// log if error, or log info if inserted new issue
if (isError($addIssueRes))
$this->logError(getError($addIssueRes));
elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes)))
$this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id);
}
}
}
$this->logInfo("Plausicheck issue producer job stopped");
}
}
+187 -40
View File
@@ -1,24 +1,25 @@
<?php
/**
* FH-Complete
* Copyright (C) 2022 fhcomplete.org
*
* @package FHC-Helper
* @author FHC-Team
* @copyright Copyright (c) 2016 fhcomplete.org
* @license GPLv3
* @since Version 1.0.0
*/
/**
* FHC Helper
* 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.
*
* @subpackage Helpers
* @category Helpers
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
// ------------------------------------------------------------------------
// Collection of utility functions for general purpose
// ------------------------------------------------------------------------
@@ -42,15 +43,19 @@ function generateToken($length = 64)
{
$firstGeneratedToken = random_bytes($length); // try to generates cryptographically secure pseudo-random bytes...
}
catch (Exception $e) { $firstGeneratedToken = null; } // if fails $firstGeneratedToken is set to null
catch (Exception $e)
{
// If fails $firstGeneratedToken is set to null
$firstGeneratedToken = null;
}
}
// For PHP >= 5.3 and < 7 and openssl is available
elseif (function_exists('openssl_random_pseudo_bytes'))
{
$firstGeneratedToken = openssl_random_pseudo_bytes($length, $strong);
// If the token generation ended with errors OR the generated token is NOT strong enough
if ($firstGeneratedToken == false || $strong == false) $firstGeneratedToken = null; // $firstGeneratedToken is set to null
}
if ($firstGeneratedToken == false || $strong == false) $firstGeneratedToken = null; // $firstGeneratedToken is set to null
}
if ($firstGeneratedToken != null) // If everything was fine
{
@@ -107,10 +112,7 @@ function var_dump_to_error_log($parameter)
function loadResource($path, $resources = null, $subdir = false)
{
// Place a / character at the and of the string if not present
if (strrpos($path, '/') < strlen($path) - 1)
{
$path .= '/';
}
if (strrpos($path, '/') < strlen($path) - 1) $path .= '/';
// Loads in $tmpResources all the given resources
$tmpResources = $resources;
@@ -125,28 +127,36 @@ function loadResource($path, $resources = null, $subdir = false)
// Loads in $tmpPaths path and eventually the subdirectories
$tmpPaths = array($path);
// NOTE: Used @ to prevent ugly error messages
if (is_dir($path) && ($dirHandler = @opendir($path)) !== false)
// If path is a directory
if (is_dir($path))
{
// Reads all file system entries present in path
while (($entry = readdir($dirHandler)) !== false)
// NOTE: Used @ to prevent ugly error messages
$dirHandler = @opendir($path);
// Successfully opened
if ($dirHandler !== false)
{
// If entry is a directory but not the current and subdirectories should be loaded
if ($subdir === true && $entry != '.' && $entry != '..' && is_dir($entry))
// Reads all file system entries present in path
while (($entry = readdir($dirHandler)) !== false)
{
$tmpPaths[] = $entry;
}
// If no resources are specified and the current file system entry is a file
if ($resources == null && is_file($path.$entry))
{
// If the current entry is a php file store the name without extension
if ($entry != ($tmpName = str_replace('.php', '', $entry)))
// If entry is a directory but not the current and subdirectories should be loaded
if ($subdir === true && $entry != '.' && $entry != '..' && is_dir($path.$entry))
{
$tmpResources[] = $tmpName;
$tmpPaths[] = $path.$entry.'/';
}
// If no resources are specified and the current file system entry is a file
if ($resources == null && is_file($path.$entry))
{
// Name without php extension
$tmpName = str_replace('.php', '', $entry);
// If the current entry is a php file store the name without extension
if ($entry != $tmpName) $tmpResources[] = $tmpName;
}
}
closedir($dirHandler);
}
closedir($dirHandler);
}
// Loops through the resources
@@ -156,10 +166,7 @@ function loadResource($path, $resources = null, $subdir = false)
foreach ($tmpPaths as $tmpPath)
{
$fileName = $tmpPath.$tmpResource.'.php'; // Php extension
if (file_exists($fileName))
{
include_once($fileName);
}
if (file_exists($fileName)) include_once($fileName);
}
}
}
@@ -349,5 +356,145 @@ function sanitizeProblemChars($str)
'ss' => '/&szlig;/'
);
return preg_replace($acentos, array_keys($acentos), htmlentities($str, ENT_NOQUOTES | ENT_HTML5, $enc));
$tmp = preg_replace($acentos, array_keys($acentos), htmlentities($str, ENT_NOQUOTES | ENT_HTML5, $enc));
return html_entity_decode($tmp, ENT_NOQUOTES | ENT_HTML5, $enc);
}
/**
*
*/
function findResource($path, $resource, $subdir = false, $extraDir = null)
{
// Place a / character at the and of the string if not present
if (strrpos($path, '/') < strlen($path) - 1) $path .= '/';
// Loads in $tmpPaths path and eventually the subdirectories
$tmpPaths = array($path);
if (is_dir($path))
{
// NOTE: Used @ to prevent ugly error messages
$dirHandler = @opendir($path);
// Successfully opened
if ($dirHandler !== false)
{
// Reads all file system entries present in path
while (($entry = readdir($dirHandler)) !== false)
{
// If entry is a directory but not the current and subdirectories should be loaded
if ($subdir === true && $entry != '.' && $entry != '..' && is_dir($path.$entry))
{
if ($extraDir == null)
{
$tmpPaths[] = $path.$entry.'/';
}
else
{
$tmpPaths[] = $path.$entry.'/'.$extraDir.'/';
}
}
}
closedir($dirHandler);
}
}
// Loops through the paths
foreach ($tmpPaths as $tmpPath)
{
$fileName = $tmpPath.$resource.'.php'; // Php extension
if (file_exists($fileName)) return $fileName;
}
return null;
}
/**
* check if String can be converted to a date
*/
function isValidDate($dateString)
{
try
{
return (new DateTime($dateString)) !== false;
}
catch(Exception $e)
{
return false;
}
}
// ------------------------------------------------------------------------
// Collection of utility functions for form validation purposes
// ------------------------------------------------------------------------
/**
* check if string can be converted to a date
*/
function is_valid_date($dateString)
{
try
{
return (new DateTime($dateString)) !== false;
}
catch(Exception $e)
{
return false;
}
}
/**
* check if given permissions are met
*/
function has_write_permissions($value, $permissions = '')
{
if (!$permissions)
$permissions = $value;
$permissions = explode(',', $permissions);
$CI =& get_instance();
$CI->load->library('AuthLib');
$CI->load->library('PermissionLib');
return $CI->permissionlib->hasAtLeastOne(
$permissions,
'sometable',
PermissionLib::WRITE_RIGHT
);
}
/**
* check if has permissions for a studiengang_kz
*/
function has_permissions_for_stg($studiengang_kz, $permissions = '')
{
if (!$permissions)
return false;
$permissions = explode(',', $permissions);
$CI =& get_instance();
$CI->load->library('AuthLib');
$CI->load->library('PermissionLib');
foreach ($permissions as $perm) {
if (strpos($perm, PermissionLib::PERMISSION_SEPARATOR) === false) {
$CI->addError(
'The given permission does not use the correct format',
FHCAPI_Controller::ERROR_TYPE_GENERAL
);
return false;
}
list($perm, $accesstype) = explode(PermissionLib::PERMISSION_SEPARATOR, $perm);
$at = '';
if (strpos($accesstype, PermissionLib::READ_RIGHT) !== false)
$at = PermissionLib::SELECT_RIGHT; // S
if (strpos($accesstype, PermissionLib::WRITE_RIGHT) !== false)
$at .= PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT; // UID
if ($CI->permissionlib->isBerechtigt($perm, $at, $studiengang_kz))
return true;
}
return false;
}
+39 -2
View File
@@ -96,7 +96,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
app_root: "'.APP_ROOT.'",
ci_router: "'.$indexPage.'",
called_path: "'.$calledPath.'",
called_method: "'.$calledMethod.'"
called_method: "'.$calledMethod.'",
user_language: "'.$user_language.'"
};';
$toPrint .= "\n";
$toPrint .= '</script>';
@@ -149,6 +150,31 @@ function generateJSsInclude($JSs)
}
}
/**
* Generates tags for the javascript modules you want to include, the parameter could by a string or an array of strings
*/
function generateJSModulesInclude($JSModules)
{
$jsInclude = '<script type="module" src="%s"></script>';
$ci =& get_instance();
$cachetoken = '?'.$ci->config->item('fhcomplete_build_version');
if (isset($JSModules))
{
$tmpJSs = is_array($JSModules) ? $JSModules : array($JSModules);
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
{
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
echo $toPrint;
}
}
}
/**
* Generates all the includes needed by the Addons
*/
@@ -156,16 +182,26 @@ function generateAddonsJSsInclude($calledFrom)
{
$aktive_addons = array_filter(explode(";", ACTIVE_ADDONS));
// For each active addon
foreach ($aktive_addons as $addon)
{
// Build the path to the hook file
$hookfile = DOC_ROOT.'addons/'.$addon.'/hooks.config.inc.php';
// If the hook file exists
if (file_exists($hookfile))
{
include($hookfile);
$js_hooks = array(); // default value
include($hookfile); // include the hook file where the array js_hooks should be setup
// If it contains the provided key calledFrom
if (key_exists($calledFrom, $js_hooks))
{
foreach ($js_hooks[$calledFrom] as $js_file)
{
generateJSsInclude('addons/'.$addon.'/'.$js_file);
}
}
}
}
@@ -180,3 +216,4 @@ function generateBackwardCompatibleJSMsIe($js)
echo ' <script type="text/javascript" src="'.$js.'"></script>'."\n";
echo "<![endif]-->\n";
}
@@ -0,0 +1,43 @@
<?php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2019 - 2022, CodeIgniter Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
* @copyright Copyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)
* @license https://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 1.0.0
* @filesource
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
$lang['form_validation_has_write_permissions'] = 'You have no rights to edit {field} field.';
$lang['form_validation_is_valid_date'] = 'The date format is invalid or out of range.';
$lang['form_validation_has_permissions_for_stg'] = 'You have no rights for stg {field}.';
+95 -17
View File
@@ -37,19 +37,30 @@ class AnrechnungLib
* @param $lv_id
* @return StdClass
*/
public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id)
public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id, $anrechnung_id = null)
{
$antrag_data = new StdClass();
// Get students UID.
$uid = $this->ci->StudentModel->getUID($prestudent_id);
// Get lehrveranstaltung data. Break, if course is not assigned to student.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
// If Anrechnung exists
if (is_numeric($anrechnung_id))
{
show_error('You are not assigned to this course yet.');
// Just load LV by lv_id
$result = $this->ci->LehrveranstaltungModel->load($lv_id);
$lv = getData($result)[0];
}
// If Anrechnung not exists
else
{
// Load LV, but check if student is assigned to that LV. Break, if not.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
{
show_error('You are not assigned to this course yet.');
}
}
// Get the students personal data
if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0])
{
@@ -163,6 +174,8 @@ class AnrechnungLib
$anrechnung_data->insertvon = '';
$anrechnung_data->studiensemester_kurzbz = '';
$anrechnung_data->empfehlung = '';
$anrechnung_data->begruendung_ects = '';
$anrechnung_data->begruendung_lvinhalt = '';
$anrechnung_data->status_kurzbz = '';
$anrechnung_data->status = getUserLanguage() == 'German' ? 'neu' : 'new';
$anrechnung_data->dokumentname = '';
@@ -274,14 +287,21 @@ class AnrechnungLib
if (hasData($result))
{
$empfehlung_data->empfehlungsanfrageAm = (new DateTime($result->retval[0]->insertamum))->format('d.m.Y');
// Get lectors who received request for recommendation
$lector_arr = self::getLectors($anrechnung_id);
if (!isEmptyArray($lector_arr))
{
$empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($lector_arr, 'fullname'));
}
// Get users who received request for recommendation
if($this->ci->config->item('fbl') === TRUE)
{
$res = $this->getLeitungOfLvOe($anrechnung_id);
}
else
{
$res = $this->getLectors($anrechnung_id);
}
if (!isEmptyArray($res))
{
$empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($res, 'fullname'));
}
}
if (is_null($anrechnung->empfehlung_anrechnung))
@@ -741,6 +761,25 @@ class AnrechnungLib
// Continue, if LV has no lector (there is no one to ask for recommendation)
return hasData($result) ? true : false;
}
/**
* Check if user is allowed to recommend Anrechnung.
*
* @param $anrechnung_id
* @return bool
*/
public function isEmpfehlungsberechtigt($anrechnung_id)
{
if($this->ci->config->item('fbl') === TRUE)
{
return true;
}
// Get lv-leitungen or, if not present, all lectors of lv.
$lector_arr = $this->getLectors($anrechnung_id);
// Return false if lv-leitung is present and user is not lv-leitung. Otherways return always true.
return in_array(getAuthUID(), array_column($lector_arr, 'uid'));
}
/**
* Get LV Leitung. If not present, get all LV lectors.
@@ -774,11 +813,14 @@ class AnrechnungLib
// Check if lv has LV-Leitung
$key = array_search(true, array_column($result, 'lvleiter'));
// If lv has LV-Leitung, keep only the one
// If lv has 1 or more LV-Leitungen, keep only them
if ($key !== false)
{
$lector_arr[]= $result[$key];
foreach ($result as $lector)
{
if ($lector->lvleiter) $lector_arr[]= $lector;
}
}
// ...otherwise keep all lectors
else
@@ -803,6 +845,40 @@ class AnrechnungLib
return $lector_arr;
}
/**
* Get Leitung of Lehrveranstaltungs-Organisationseinheit.
*
* @param $anrechnung_id
* @return false|mixed|null
*/
public function getLeitungOfLvOe($anrechnung_id)
{
$this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id');
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
$lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
// Get Leitungen
$result = $this->ci->LehrveranstaltungModel->getLeitungOfLvOe($lehrveranstaltung_id);
if (!hasData($result))
{
return false;
}
$oeLeitung_arr = getData($result);
foreach ($oeLeitung_arr as $oeLeitung)
{
$oeLeitung->fullname = $oeLeitung->vorname. ' '. $oeLeitung->nachname;
}
// Now make the array unique
$oeLeitung_arr = array_unique($oeLeitung_arr, SORT_REGULAR);
return $oeLeitung_arr;
}
// Return an object with Anrechnungdata
private function _setAnrechnungDataObject($anrechnung)
{
@@ -820,6 +896,8 @@ class AnrechnungLib
$anrechnung_data->insertvon= $anrechnung->insertvon;
$anrechnung_data->studiensemester_kurzbz= $anrechnung->studiensemester_kurzbz;
$anrechnung_data->empfehlung= $anrechnung->empfehlung_anrechnung;
$anrechnung_data->begruendung_ects = $anrechnung->begruendung_ects;
$anrechnung_data->begruendung_lvinhalt = $anrechnung->begruendung_lvinhalt;
// Get last status_kurzbz
$result = $this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung->anrechnung_id);
File diff suppressed because it is too large Load Diff
+1 -4
View File
@@ -551,10 +551,7 @@ class AuthLib
// Needed information
$this->_ci->PersonModel->addSelect('person_id, vorname, nachname, uid');
// Retrieves the uid if it is possible for active users
$this->_ci->PersonModel->addJoin(
'(SELECT uid, person_id FROM public.tbl_benutzer WHERE aktiv = TRUE) tb', 'person_id',
'LEFT'
);
$this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id', 'LEFT');
// Execute query with where clause
$personResult = $this->_ci->PersonModel->loadWhere($queryParamsArray);
+2
View File
@@ -595,6 +595,8 @@ class DmsLib
if (isError($insDmsResult)) return $insDmsResult;
$upload_data['dms_id'] = getData($insDmsResult);
if(isset($upload_data['file_type']) && !isset($dms['mimetype']))
$dms['mimetype'] = $upload_data['file_type'];
// Insert DMS version
$insVersionResult = $this->_ci->DmsVersionModel->insert(
+304
View File
@@ -0,0 +1,304 @@
<?php
/* Copyright (C) 2022 fhcomplete.net
*
* 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.
*
*/
require_once(dirname(__FILE__).'/../../vendor/nategood/httpful/bootstrap.php');
use \ZipArchive as ZipArchive;
/**
* Simple client to convert documents using Docsbox
*/
class DocsboxLib
{
const ERROR = 1;
const SUCCESS = 0;
const STATUS_FINISHED = 'finished'; // Docsbox status when a document conversion ended
const STATUS_QUEUED = 'queued'; // Docsbox status when a file has been queued for the conversion
const STATUS_STARTED = 'started'; // Docsbox status when a file has started being worked
const STATUS_WORKING = 'working'; // Docsbox status when a file is being converted
const OUTPUT_FILENAME = 'out.zip.pdf'; // File name used by docsbox to save a converted document
const DEFAULT_FORMAT = 'pdf'; // Default supported format
// -------------------------------------------------------------------------------------------------
// Public static methods
/**
* Static method used to convert a document using a Docsbox installation (local/remote) over the network
* It return 0 on success and any other integer on error
* NOTE: currently format is not supported
*/
public static function convert($inputFileName, $outputFileName, $format)
{
// If a format has not been given
if (($format == null) || ($format != null && ctype_space($format) === true)) $format = self::DEFAULT_FORMAT;
// Posts the file to docsbox
$queueId = self::_postFile($inputFileName);
// If an error occurred
if ($queueId == null) return self::ERROR;
// Checks and waits if the file has been converted
$resultUrl = self::_checkConvertion($queueId);
// If an error occurred
if ($resultUrl == null) return self::ERROR;
// Download and rename the converted file
$downloaded = self::_downloadFile($resultUrl, $outputFileName);
// If an error occurred
if (!$downloaded) return self::ERROR;
return self::SUCCESS;
}
// -------------------------------------------------------------------------------------------------
// Private static methods
/**
* Posts the given file to a Docsboxserver and checks the response to return a valid queue id
* On failure it returns a null value
*/
private static function _postFile($inputFileName)
{
$queueId = null;
try
{
// Posts the given file and expects a response in JSON format
$postFileResponse = \Httpful\Request::post(DOCSBOX_SERVER.DOCSBOX_PATH_API)
->attach(array('file' => $inputFileName))
->expectsJson()
->send();
// Checks that:
// - the response is not empty
// - the reponse body has the property id
// - the property id is a valid string
// - the reponse body has the property status
// - docsbox queued the conversion of the posted file
if (is_object($postFileResponse)
&& isset($postFileResponse->body)
&& isset($postFileResponse->body->id)
&& $postFileResponse->body->id != '' && $postFileResponse->body->id != null
&& isset($postFileResponse->body->status)
&& $postFileResponse->body->status == self::STATUS_QUEUED)
{
$queueId = $postFileResponse->body->id;
}
else
{
// If docsbox refused to convert the posted file
if (isset($postFileResponse->body->status)
&& $postFileResponse->body->status != self::STATUS_QUEUED)
{
error_log(
'Docsbox did not queue the posted file. Returned status: '.
$postFileResponse->body->status
);
}
else // any other generic error
{
error_log(
'An error occurred while posting to docsbox. Response: '.
print_r($postFileResponse, 1)
);
}
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception
{
error_log($cee->getMessage());
}
catch (Exception $e) // any other exception
{
error_log($e->getMessage());
}
return $queueId;
}
/**
* Check the status of the file convertion identified by the given queue element id
* A URL is returned with the path where it is possible to download the converted file
* If an error occurred then a null value is returned
*/
private static function _checkConvertion($queueId)
{
$resultUrl = null;
$startConvertionsTime = time(); // time when the file conversion has started
// Until a timeout has occurred
while (time() - $startConvertionsTime <= DOCSBOX_CONVERSION_TIMEOUT)
{
sleep(DOCSBOX_WAITING_SLEEP_TIME); // takes a nap on every round
try
{
// Calls the docsbox server to check the status of the
// file conversion using the provided queue id
// it expects a response in JSON format
$getStatusResponse = \Httpful\Request::get(DOCSBOX_SERVER.DOCSBOX_PATH_API.$queueId)
->expectsJson()
->send();
// Checks that:
// - the response is not empty
// - the reponse body has the property id
// - the property id is a valid string
// - the reponse body has the property status
// - docsbox is working the conversion of the posted file
if (is_object($getStatusResponse)
&& isset($getStatusResponse->body->id)
&& $getStatusResponse->body->id != '' && $getStatusResponse->body->id != null
&& isset($getStatusResponse->body->status))
{
// Checks that docsbox has finished working on the file conversion
// and that there is a valid resultUrl property
if ($getStatusResponse->body->status == self::STATUS_FINISHED
&& isset($getStatusResponse->body->result_url)
&& $getStatusResponse->body->result_url != ''
&& $getStatusResponse->body->result_url != null)
{
$resultUrl = $getStatusResponse->body->result_url;
break;
}
// Just started or still working on it
elseif ($getStatusResponse->body->status == self::STATUS_WORKING
|| $getStatusResponse->body->status == self::STATUS_STARTED)
{
// go on!
}
else // any other status is abnormal
{
error_log(
'Not valid status for queue element: '.$queueId.'. Response: '.
print_r($getStatusResponse, 1)
);
break; // interrupt the loop on error
}
}
else // if the response from the docsbox server is not valid
{
error_log(
'An error occurred while checking the docsbox activity. Response: '.
print_r($getStatusResponse, 1)
);
break; // interrupt the loop on error
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception
{
error_log($cee->getMessage());
break; // interrupt the loop on error
}
catch (Exception $e) // any other exception
{
error_log($e->getMessage());
break; // interrupt the loop on error
}
}
return $resultUrl;
}
/**
* Download the converted file using the provided URL, unzip it, and renames it into the provided file name
*/
private static function _downloadFile($resultUrl, $outputFileName)
{
$downloaded = false; // pessimistic assumption
try
{
// Download the file
$getFileResponse = \Httpful\Request::get(DOCSBOX_SERVER.$resultUrl)->send();
// If the downloaded file content is valid and not empty
if (isset($getFileResponse->body)
&& $getFileResponse->body != null
&& $getFileResponse->body != '')
{
// Output directory where to unzip the downloaded zip file
$outputDirectory = dirname($outputFileName);
// The path and name of the downloaded zip file
$temporaryDownloadedZip = sys_get_temp_dir().'/'.basename($resultUrl);
// Write the file content into a temporary directory and file
if (file_put_contents($temporaryDownloadedZip, $getFileResponse->body) != false)
{
$zipArchive = new ZipArchive;
// Open and extract the dowloaded zip file into the directory of the output file
if ($zipArchive->open($temporaryDownloadedZip) === true
&& $zipArchive->extractTo($outputDirectory) === true
&& $zipArchive->close() === true)
{
// Opened, extracted and closed!
// Rename the extracted file to the given output file name
if (rename($outputDirectory.'/'.self::OUTPUT_FILENAME, $outputFileName))
{
$downloaded = true;
}
else
{
error_log(
'An error occurred while renaming the extracted file: '.
$outputDirectory.'/'.self::OUTPUT_FILENAME.' into: '.
$outputFileName
);
}
}
else
{
error_log(
'An error occurred while working the dowloaded zip file: '.
$temporaryDownloadedZip
);
}
}
else // if an error occurred while writing
{
error_log(
'An error occurred while writing the file content to: '.
$temporaryDownloadedZip
);
}
}
else // if the downloaded file is not valid
{
error_log(
'An error occurred while downloading the file from the docsbox server: '.
print_r($getFileResponse, 1)
);
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee)
{
error_log($cee->getMessage());
}
catch (Exception $e)
{
error_log($e->getMessage());
}
return $downloaded;
}
}
+50 -20
View File
@@ -14,20 +14,28 @@ class DocumentLib
// Gets CI instance
$this->ci =& get_instance();
exec('unoconv --version', $ret_arr);
if(isset($ret_arr[0]))
// Which document converter has to be used
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
$hlp = explode(' ', $ret_arr[0]);
if(isset($hlp[1]))
{
$this->unoconv_version = $hlp[1];
}
else
show_error('Could not get Unoconv Version');
// Use docsbox!!
}
else
show_error('Unoconv not found - Please install Unoconv');
{
exec('unoconv --version', $ret_arr);
if(isset($ret_arr[0]))
{
$hlp = explode(' ', $ret_arr[0]);
if(isset($hlp[1]))
{
$this->unoconv_version = $hlp[1];
}
else
show_error('Could not get Unoconv Version');
}
else
show_error('Unoconv not found - Please install Unoconv');
}
}
/**
@@ -57,9 +65,16 @@ class DocumentLib
case 'application/vnd.ms-word':
case 'application/vnd.oasis.opendocument.text':
case 'text/plain':
// Unoconv Version 0.6 seems to fail on converting TXT Files
if ($this->unoconv_version == '0.6')
return error();
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
// Use docsbox
}
else
{
// Unoconv Version 0.6 seems to fail on converting TXT Files
if ($this->unoconv_version == '0.6')
return error();
}
$ret = $this->convert($filename, $outFile, 'pdf');
if(isSuccess($ret))
@@ -105,6 +120,7 @@ class DocumentLib
finfo_close($finfo);
$out = null;
exec($cmd, $out, $ret);
if ($ret != 0)
{
@@ -123,13 +139,26 @@ class DocumentLib
*/
public function convert($inFile, $outFile, $format)
{
if ($this->unoconv_version == '0.6')
$command = 'unoconv -f %1$s %3$s > %2$s';
else
$command = 'unoconv -f %s --output %s %s 2>&1';
$command = sprintf($command, $format, $outFile, $inFile);
$ret = 0;
exec($command, $out, $ret);
// If it is set to use docsbox
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
require_once(dirname(__FILE__).'/../application/libraries/DocsboxLib.php');
$ret = DocsboxLib::convert($inFile, $outFile, $format);
}
else // otherwise use unoconv
{
if ($this->unoconv_version == '0.6')
$command = 'unoconv -f %1$s %3$s > %2$s';
else
$command = 'unoconv -f %s --output %s %s 2>&1';
$command = sprintf($command, $format, $outFile, $inFile);
$out = null;
exec($command, $out, $ret);
}
if ($ret != 0)
{
@@ -191,6 +220,7 @@ class DocumentLib
$cmd .= '/countspaces { [ exch { dup 32 ne { pop } if } forall ] length } bind def >> ';
$cmd .= 'setpagedevice viewJPEG"';
$out = null;
exec($cmd, $out, $ret);
if ($ret != 0)
{
+44 -20
View File
@@ -1,7 +1,25 @@
<?php
/**
* 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/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
* Library to manage core extensions
*/
@@ -23,7 +41,7 @@ class ExtensionsLib
// Directories that are part of the extension archive
private $SOFTLINK_TARGET_DIRECTORIES = array(
APPPATH => array('config', 'controllers', 'helpers', 'hooks', 'libraries', 'models', 'views', 'widgets'),
APPPATH => array('config', 'components', 'controllers', 'helpers', 'hooks', 'libraries', 'models', 'views', 'widgets'),
DOC_ROOT => array('public')
);
@@ -181,17 +199,15 @@ class ExtensionsLib
// Select all the version of this extension
$this->_ci->ExtensionsModel->addSelect('extension_id');
$result = $this->_ci->ExtensionsModel->loadWhere(array('name' => $extensionName));
if (hasData($result)) // if something was found
// If something was found
if (hasData($result))
{
$extsArray = array();
foreach ($result->retval as $key => $extension) // loops on them
// Loops on them
foreach ($result->retval as $extension)
{
// Remove them all
$result = $this->_ci->ExtensionsModel->delete($extension->extension_id);
if (isSuccess($result))
{
$delExtension = true;
}
if (isSuccess($result)) $delExtension = true;
}
}
}
@@ -432,9 +448,13 @@ class ExtensionsLib
// If no errors occurred
if ($extensionJson != null)
{
// Default value
$fhcomplete_version = 0;
require_once('version.php'); // get the core version
// Checks if the required core version of the extension is the same of this system
if (isset($extensionJson->core_version) && $extensionJson->core_version == $fhcomplete_version)
if (isset($extensionJson->core_version) && version_compare($extensionJson->core_version, $fhcomplete_version,'<='))
{
$this->_printMessage('Required core version: '.$extensionJson->core_version);
$this->_printMessage('Current core version: '.$fhcomplete_version);
@@ -587,18 +607,22 @@ class ExtensionsLib
for ($sqlDir = $startVersion; $sqlDir <= $extensionJson->version; $sqlDir++)
{
// If a directory with the same value of the version is present in the sql scripts directory
if (($files = glob($pkgSQLsPath.'/'.$sqlDir.'/*'.ExtensionsLib::SQL_FILE_EXTENSION)) != false)
{
$files = glob($pkgSQLsPath.'/'.$sqlDir.'/*'.ExtensionsLib::SQL_FILE_EXTENSION);
if ($files != false)
{
// Loads every sql files
foreach ($files as $file)
{
$sql = file_get_contents($file); // gets the entire content of the file
foreach ($files as $file)
{
$sql = file_get_contents($file); // gets the entire content of the file
$this->_printMessage('Executing query:');
$this->_printMessage($sql);
// Try to execute that
if (!isSuccess($result = @$this->_ci->ExtensionsModel->executeQuery($sql)))
$resultQuery = @$this->_ci->ExtensionsModel->executeQuery($sql);
// If _not_ a success
if (!isSuccess($resultQuery))
{
$this->_errorOccurred = true;
$this->_printFailure(' error occurred while executing the query');
@@ -608,11 +632,11 @@ class ExtensionsLib
else
{
$this->_printMessage('Query result:');
var_dump($result->retval); // KEEP IT!!!
var_dump(getData($resultQuery)); // KEEP IT!!!
$this->_ci->eprintflib->printEOL();
}
}
}
}
}
}
$this->_printSuccess(!$this->_errorOccurred);
@@ -673,7 +697,7 @@ class ExtensionsLib
foreach ($this->SOFTLINK_TARGET_DIRECTORIES as $rootPath => $targetDirectories)
{
foreach ($targetDirectories as $key => $targetDirectory)
foreach ($targetDirectories as $targetDirectory)
{
if (file_exists($rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName))
{
@@ -727,7 +751,7 @@ class ExtensionsLib
// For every target directory
foreach ($this->SOFTLINK_TARGET_DIRECTORIES as $rootPath => $targetDirectories)
{
foreach ($targetDirectories as $key => $targetDirectory)
foreach ($targetDirectories as $targetDirectory)
{
// If destination of the symlink does not exist
if (!file_exists($rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName))
File diff suppressed because it is too large Load Diff
+27 -6
View File
@@ -1,7 +1,26 @@
<?php
/**
* Copyright (C) 2023 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
* FilterWidget logic
*/
@@ -16,6 +35,7 @@ class FilterWidgetLib
const SESSION_SELECTED_FIELDS = 'selectedFields';
const SESSION_COLUMNS_ALIASES = 'columnsAliases';
const SESSION_ADDITIONAL_COLUMNS = 'additionalColumns';
const SESSION_ENCRYPTED_COLUMNS = 'encryptedColumns';
const SESSION_CHECKBOXES = 'checkboxes';
const SESSION_FILTERS = 'filters';
const SESSION_METADATA = 'datasetMetadata';
@@ -56,6 +76,7 @@ class FilterWidgetLib
const ADDITIONAL_COLUMNS = 'additionalColumns';
const CHECKBOXES = 'checkboxes';
const COLUMNS_ALIASES = 'columnsAliases';
const ENCRYPTED_COLUMNS = 'encryptedColumns';
// ...to format/mark records of a dataset
const FORMAT_ROW = 'formatRow';
@@ -120,7 +141,7 @@ class FilterWidgetLib
/**
* Gets the CI instance and loads message helper
*/
public function __construct($params = null)
public function __construct()
{
$this->_ci =& get_instance(); // get code igniter instance
}
@@ -367,7 +388,7 @@ class FilterWidgetLib
/**
* Retrieves the dataset from the DB
*/
public function getDataset($datasetQuery)
public function getDataset($datasetQuery, $encryptedColumns)
{
$dataset = null;
@@ -376,7 +397,7 @@ class FilterWidgetLib
$this->_ci->load->model('system/Filters_model', 'FiltersModel');
// Execute the given SQL statement suppressing error messages
$dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery);
$dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery, null, $encryptedColumns);
}
return $dataset;
@@ -390,7 +411,7 @@ class FilterWidgetLib
public function getFilterName($filterJson)
{
$filterName = $filterJson->name; // always present, used as default
$trimedname = (isset($filterJson->namePhrase)?trim($filterJson->namePhrase):'');
// Filter name from phrases system
if (isset($filterJson->namePhrase) && !isEmptyString($filterJson->namePhrase))
{
@@ -451,7 +472,8 @@ class FilterWidgetLib
if (in_array($selectedField, $fields))
{
// If the selected field is present in the list of the selected fields by the current filter
if (($pos = array_search($selectedField, $selectedFields)) !== false)
$pos = array_search($selectedField, $selectedFields);
if ($pos !== false)
{
// Then remove it and shift the rest of elements by one if needed
array_splice($selectedFields, $pos, 1);
@@ -750,7 +772,6 @@ class FilterWidgetLib
$this->_ci->load->library('NavigationLib', array(self::NAVIGATION_PAGE => $navigationPage));
$filterMenu = null;
$currentMenu = $this->_ci->navigationlib->getSessionMenu(); // The navigation menu currently stored in session
$session = $this->getSession(); // The filter currently stored in session (the one that is currently used)
if ($session != null)
+24 -5
View File
@@ -169,6 +169,9 @@ class IssuesLib
return $this->_changeIssueStatus($issue_id, $data, $user);
}
// --------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Changes status of an issue.
* @param int $issue_id
@@ -215,8 +218,15 @@ class IssuesLib
* @param string $inhalt_extern
* @return object success or error
*/
private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null, $fehlercode_extern = null, $inhalt_extern = null)
{
private function _addIssue(
$fehlercode,
$person_id = null,
$oe_kurzbz = null,
$fehlertext_params = null,
$resolution_params = null,
$fehlercode_extern = null,
$inhalt_extern = null
) {
if (isEmptyString($person_id) && isEmptyString($oe_kurzbz))
return error("Person_id or oe_kurzbz must be set.");
@@ -226,7 +236,15 @@ class IssuesLib
if (hasData($fehlerRes))
{
$fehlertextVorlage = getData($fehlerRes)[0]->fehlertext;
$fehlertext = isEmptyArray($fehlertext_params) ? $fehlertextVorlage : vsprintf($fehlertextVorlage, $fehlertext_params);
$fehlertext = $fehlertextVorlage;
if (!isEmptyArray($fehlertext_params))
{
if (count($fehlertext_params) != substr_count($fehlertextVorlage, '%s'))
return error('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehlercode);
$fehlertext = vsprintf($fehlertextVorlage, $fehlertext_params);
}
$openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount($fehlercode, $person_id, $oe_kurzbz, $fehlercode_extern);
@@ -252,6 +270,7 @@ class IssuesLib
return error("Invalid parameters for resolution");
}
// insert new issue
return $this->_ci->IssueModel->insert(
array(
'fehlercode' => $fehlercode,
@@ -267,8 +286,8 @@ class IssuesLib
)
);
}
else
return success($openIssueCount);
else // return success if issue already exists
return success("Issue already exists");
}
else
return error("Number of open issues could not be determined");
+1
View File
@@ -182,6 +182,7 @@ class MailLib
{
if ($this->sended == $this->email_number_per_time_range)
{
$this->sended = 0;
sleep($this->email_time_range); // Wait!!!
}
}
+34 -7
View File
@@ -1,4 +1,20 @@
<?php
/**
* 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/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
@@ -37,7 +53,7 @@ class NavigationLib
// Loads library ExtensionsLib
$this->_ci->load->library('ExtensionsLib');
$this->_navigationPage = $this->_getNavigationtPage($params); // sets the id for the related navigation widget
$this->_navigationPage = $this->_getNavigationPage($params); // sets the id for the related navigation widget
}
//------------------------------------------------------------------------------------------------------------------
@@ -67,9 +83,19 @@ class NavigationLib
* Returns the structure for one level of the menu
*/
public function oneLevel(
$description, $link = '#', $children = null, $icon = '', $expand = false,
$subscriptDescription = null, $subscriptLinkClass = null, $subscriptLinkValue = null, $target = '',
$sort = null, $requiredPermissions = null, $subscriptLinkHref = '#')
$description,
$link = '#',
$children = null,
$icon = '',
$expand = false,
$subscriptDescription = null,
$subscriptLinkClass = null,
$subscriptLinkValue = null,
$target = '',
$sort = null,
$requiredPermissions = null,
$subscriptLinkHref = '#'
)
{
return array(
'description' => $description,
@@ -223,7 +249,8 @@ class NavigationLib
$filename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_NAVIGATION_FILENAME;
if (file_exists($filename))
{
unset($config);
$config = array(); // default value
include($filename);
if (isset($config[$configName]) && is_array($config[$configName]))
@@ -278,7 +305,7 @@ class NavigationLib
}
else
{
foreach ($navigationArray as $key=>$row)
foreach ($navigationArray as $key => $row)
{
// Search for * Entries
if (mb_strpos($key, '*') === 0 || mb_strpos($key, '*') === mb_strlen($key) - 1)
@@ -300,7 +327,7 @@ class NavigationLib
* Return an unique string that identify this navigation widget
* NOTE: The default value is the URI where the NavigationWidget is called
*/
private function _getNavigationtPage($params)
private function _getNavigationPage($params)
{
if ($params != null
&& is_array($params)
+34 -14
View File
@@ -21,6 +21,8 @@ require_once(FHCPATH.'include/functions.inc.php');
require_once(FHCPATH.'include/wawi_kostenstelle.class.php');
require_once(FHCPATH.'include/benutzerberechtigung.class.php');
use \benutzerberechtigung as benutzerberechtigung;
class PermissionLib
{
// Available rights in the DB
@@ -65,8 +67,10 @@ class PermissionLib
if (!is_cli())
{
// API Caller rights initialization
$authObj = $this->_ci->authlib->getAuthObj();
self::$bb = new benutzerberechtigung();
self::$bb->getBerechtigungen(($this->_ci->authlib->getAuthObj())->{AuthLib::AO_USERNAME});
if ($authObj)
self::$bb->getBerechtigungen($authObj->{AuthLib::AO_USERNAME});
}
}
@@ -143,19 +147,7 @@ class PermissionLib
if (strpos($permissions[$pCounter], PermissionLib::PERMISSION_SEPARATOR) !== false)
{
// Retrieves permission and required access type from the $requiredPermissions array
list($permission, $requiredAccessType) = explode(PermissionLib::PERMISSION_SEPARATOR, $permissions[$pCounter]);
$accessType = '';
// Set the access type
if (strpos($requiredAccessType, PermissionLib::READ_RIGHT) !== false)
{
$accessType = PermissionLib::SELECT_RIGHT; // S
}
if (strpos($requiredAccessType, PermissionLib::WRITE_RIGHT) !== false)
{
$accessType .= PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT; // UID
}
list($permission, $accessType) = $this->convertAccessType($permissions[$pCounter]);
if (!isEmptyString($accessType)) // if compliant
{
@@ -166,6 +158,16 @@ class PermissionLib
if ($checkPermissions === true) break;
}
}
elseif ($permissions[$pCounter] == Auth_Controller::PERM_ANONYMOUS)
{
$checkPermissions = true;
break;
}
elseif ($permissions[$pCounter] == Auth_Controller::PERM_LOGGED)
{
$checkPermissions = isLogged();
break;
}
else
{
show_error('The given permission does not use the correct format');
@@ -195,6 +197,24 @@ class PermissionLib
return $checkPermissions;
}
/**
* Retrieves permission and required access type from the newly formatted permission string
*
* @param string $permission
*
* @return array
*/
public function convertAccessType($permission)
{
list($permission, $reqAccessType) = explode(PermissionLib::PERMISSION_SEPARATOR, $permission);
$accessType = '';
if (strpos($reqAccessType, PermissionLib::READ_RIGHT) !== false)
$accessType = PermissionLib::SELECT_RIGHT;
if (strpos($reqAccessType, PermissionLib::WRITE_RIGHT) !== false)
$accessType = PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT;
return [$permission, $accessType];
}
/**
* Checks if at least one of the permissions given as parameter (requiredPermissions) belongs to the authenticated user
* It checks the given permissions against a given method (controller method name) and a given permission type (R and/or W)
-165
View File
@@ -7,9 +7,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
*/
class PersonLogLib
{
const PARKED_LOGNAME = 'Parked';
const ONHOLD_LOGNAME = 'Onhold';
/**
* Constructor
*/
@@ -78,168 +75,6 @@ class PersonLogLib
else
show_error(getError($result));
}
/**
* Parks a person, i.e. marks a person so no actions are expected for the person (e.g. as a prestudent)
* Done by adding a logentry in the future
* @param $person_id
* @param $date
* @param $taetigkeit_kurzbz
* @param string $app
* @param null $oe_kurzbz
* @param null $user
* @return insert object
*/
public function park($person_id, $date, $taetigkeit_kurzbz, $app = 'core', $oe_kurzbz = null, $user = null)
{
$onhold = $this->getOnHoldDate($person_id);
if (hasData($onhold))
return error("Person already on hold");
$logjson = array(
'name' => self::PARKED_LOGNAME
);
return $this->_savePsLog($person_id, $date, $taetigkeit_kurzbz, $logjson, $app, $oe_kurzbz, $user);
}
/**
* Unparks a person, i.e. removes all log entries in the future with logname for parking
* @param $person_id
* @return array with deleted logids
*/
public function unPark($person_id)
{
$deleted = array();
$result = $this->ci->PersonLogModel->getLogsInFuture($person_id);
if (hasData($result))
{
foreach ($result->retval as $log)
{
$logdata = json_decode($log->logdata);
if (isset($logdata->name) && $logdata->name === self::PARKED_LOGNAME)
{
$delresult = $this->ci->PersonLogModel->deleteLog($log->log_id);
if (isSuccess($delresult))
{
$deleted[] = $log->log_id;
}
}
}
}
return success($deleted);
}
/**
* Gets date until which a person is parked
* @param $person_id
* @return the date if person is parked, null otherwise
*/
public function getParkedDate($person_id)
{
$result = $this->ci->PersonLogModel->getLogsInFuture($person_id);
$parkeddate = null;
if (hasData($result))
{
foreach ($result->retval as $log)
{
$logdata = json_decode($log->logdata);
if (isset($logdata->name) && $logdata->name === self::PARKED_LOGNAME)
{
$parkeddate = $log->zeitpunkt;
break;
}
}
}
return $parkeddate;
}
/**
* Sets person on hold, i.e. marks a person so no actions are expected for the person (e.g. as a prestudent).
* Done by adding a logentry with a special name. can be undone only manually by clicking button.
* @param $person_id
* @param $date
* @param $taetigkeit_kurzbz
* @param string $app
* @param null $oe_kurzbz
* @param null $user
* @return array
*/
public function setOnHold($person_id, $date, $taetigkeit_kurzbz, $app = 'core', $oe_kurzbz = null, $user = null)
{
$parked = $this->getParkedDate($person_id);
if (hasData($parked))
return error("Person already parked");
$logjson = array(
'name' => self::ONHOLD_LOGNAME
);
return $this->_savePsLog($person_id, $date, $taetigkeit_kurzbz, $logjson, $app, $oe_kurzbz, $user);
}
/**
* Removes on hold status, i.e. removes all log entries with logname for on hold
* @param $person_id
* @return array
*/
public function removeOnHold($person_id)
{
$deleted = array();
$result = $this->ci->PersonLogModel->filterLog($person_id);
if (hasData($result))
{
foreach ($result->retval as $log)
{
$logdata = json_decode($log->logdata);
if (isset($logdata->name) && $logdata->name === self::ONHOLD_LOGNAME)
{
$delresult = $this->ci->PersonLogModel->deleteLog($log->log_id);
if (isSuccess($delresult))
{
$deleted[] = $log->log_id;
}
}
}
}
return success($deleted);
}
/**
* Gets date until which a person is on hold
* @param $person_id
* @return the date if person is on hold, null otherwise
*/
public function getOnHoldDate($person_id)
{
$result = $this->ci->PersonLogModel->filterLog($person_id);
$onholddate = null;
if (hasData($result))
{
foreach ($result->retval as $log)
{
$logdata = json_decode($log->logdata);
if (isset($logdata->name) && $logdata->name === self::ONHOLD_LOGNAME)
{
$onholddate = $log->zeitpunkt;
break;
}
}
}
return $onholddate;
}
/**
* Saves a processstate log with specified parameters, including a specified log date.
* @param $person_id
+412
View File
@@ -0,0 +1,412 @@
<?php
/**
* FH-Complete
*
* @package FHC-Helper
* @author FHC-Team
* @copyright Copyright (c) 2023 fhcomplete.net
* @license GPLv3
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class PrestudentLib
{
/**
* Object initialization
*/
public function __construct()
{
$this->_ci =& get_instance();
// // Configs
// $this->_ci->load->config('studierendenantrag');
// // Models
$this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->_ci->load->model('crm/Student_model', 'StudentModel');
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->_ci->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
$this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
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))
return $result;
$result = getData($result);
if (!$result)
return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', [
'prestudent_id' => $prestudent_id,
'studiensemester_kurzbz' => $studiensemester_kurzbz
]));
$prestudent_status = current($result);
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
if (isError($result))
return $result;
$result = getData($result);
if (!$result)
return error($this->_ci->p->t('studierendenantrag', 'error_no_student_for_prestudent', ['prestudent_id' => $prestudent_id]));
$student = current($result);
if(!$datum)
$datum = date('c');
if(!$bestaetigtam)
$bestaetigtam = date('c');
//Status und Statusgrund updaten
$result = $this->_ci->PrestudentstatusModel->withGrund($statusgrund_kurzbz)->insert([
'prestudent_id' => $prestudent_id,
'status_kurzbz' => Prestudentstatus_model::STATUS_ABBRECHER,
'studiensemester_kurzbz' => $prestudent_status->studiensemester_kurzbz,
'ausbildungssemester' => $prestudent_status->ausbildungssemester,
'datum' => $datum,
'insertvon' => $insertvon,
'insertamum' => date('c'),
'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz,
'studienplan_id'=> $prestudent_status->studienplan_id,
'bestaetigtvon' => $bestaetigtvon,
'bestaetigtam' => $bestaetigtam
]);
if (isError($result))
return $result;
//Verband anlegen
$result = $this->_ci->LehrverbandModel->load([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'A',
'gruppe' => ''
]);
if (isError($result))
return $result;
$result = getData($result);
if (!$result)
{
$result = $this->_ci->LehrverbandModel->load([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => '',
'gruppe' => ''
]);
if (isError($result))
return $result;
$result = getData($result);
if(!$result)
{
$this->_ci->LehrverbandModel->insert([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => '',
'gruppe' => '',
'bezeichnung' => 'Ab-Unterbrecher',
'aktiv' => true,
]);
}
$this->_ci->LehrverbandModel->insert([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'A',
'gruppe' => '',
'bezeichnung' => 'Abbrecher',
'aktiv' => true
]);
}
//noch nicht eingetragene Zeugnisnoten auf 9 setzen
$result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $prestudent_status->studiensemester_kurzbz);
if (isError($result))
return $result;
$result = getData($result) ?: [];
foreach ($result as $lv)
{
if (!$lv->note)
{
$result = $this->_ci->ZeugnisnoteModel->insert([
'note' => 9,
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
'student_uid' => $lv->uid,
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
]);
if (isError($result)) {
$result = $this->_ci->ZeugnisnoteModel->update([
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
'student_uid' => $lv->uid,
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
], [
'note' => 9
]);
if (isError($result))
return $result;
}
}
}
//Update Aktionen
//StudentModel updaten
$this->_ci->StudentModel->update([
'student_uid' => $student->student_uid
], [
'verband' => 'A',
'gruppe' => '',
'semester' => 0,
'updatevon' => $insertvon,
'updateamum' => date('c')
]);
//Studentlehrverband setzen
$this->_ci->StudentlehrverbandModel->update([
'studiensemester_kurzbz' => $prestudent_status->studiensemester_kurzbz,
'student_uid' => $student->student_uid
], [
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'A',
'gruppe' => '',
'updateamum' => date('c'),
'updatevon' => $insertvon
]);
//Benutzer inaktiv setzen
$this->_ci->BenutzerModel->update([
'uid' => $student->student_uid
], [
'aktiv' => false,
'updateaktivvon' => $insertvon,
'updateaktivam' => date('c'),
'updatevon' => $insertvon,
'updateamum' => date('c')
]);
return success();
}
public function setUnterbrecher($prestudent_id, $studiensemester_kurzbz, $studierendenantrag_id, $insertvon = null)
{
$ausbildungssemester_plus = 0;
if (!$insertvon)
$insertvon = getAuthUID();
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz);
if (isError($result))
return $result;
$result = getData($result);
if (!$result) {
//NOTE(manu): only valid if nextSemester focus max
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id);
if (isError($result))
return $result;
$result = getData($result);
//check if ausbildungssemester is last
$this->_ci->StudiengangModel->addJoin('public.tbl_prestudent p', 'studiengang_kz');
$res = $this->_ci->StudiengangModel->loadWhere(['p.prestudent_id' => $prestudent_id]);
if(isError($res))
return $res;
if(!hasData($res))
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_for_prestudent', [
'prestudent_id' => $prestudent_id
]));
$studiengang = current(getData($res));
$prestudent_status = current($result);
if($prestudent_status->ausbildungssemester + 1 < $studiengang->max_semester)
$ausbildungssemester_plus = 1;
if(!$result)
{
return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', [
'prestudent_id' => $prestudent_id,
'studiensemester_kurzbz' => $studiensemester_kurzbz
]));
}
}
$prestudent_status = current($result);
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
if (isError($result))
return $result;
$result = getData($result);
if (!$result)
return error($this->_ci->p->t('studierendenantrag', 'error_no_student_for_prestudent', ['prestudent_id' => $prestudent_id]));
$student = current($result);
$resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id);
if (isError($resultAntrag))
return $resultAntrag;
$resultAntrag = getData($resultAntrag);
if (!$resultAntrag)
return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id]));
$antrag = current($resultAntrag);
//Status updaten
$result = $this->_ci->PrestudentstatusModel->insert([
'prestudent_id' => $prestudent_id,
'status_kurzbz' => Prestudentstatus_model::STATUS_UNTERBRECHER,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'ausbildungssemester' => $prestudent_status->ausbildungssemester + $ausbildungssemester_plus,
'datum' => date('c'),
'insertvon' => $insertvon,
'insertamum' => date('c'),
'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz,
'studienplan_id'=> $prestudent_status->studienplan_id,
'bestaetigtvon' => $insertvon,
'bestaetigtam' => date('c'),
'anmerkung'=> 'Wiedereinstieg ' . $antrag->datum_wiedereinstieg
]);
if (isError($result))
return $result;
//Verband anlegen
$result = $this->_ci->LehrverbandModel->load([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'B',
'gruppe' => ''
]);
if (isError($result))
return $result;
$result = getData($result);
if (!$result)
{
$result = $this->_ci->LehrverbandModel->load([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => '',
'gruppe' => ''
]);
if (isError($result))
return $result;
$result = getData($result);
if(!$result)
{
$this->_ci->LehrverbandModel->insert([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => '',
'gruppe' => '',
'bezeichnung' => 'Ab-Unterbrecher',
'aktiv' => true,
]);
}
$this->_ci->LehrverbandModel->insert([
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'B',
'gruppe' => '',
'bezeichnung' => 'Unterbrecher',
'aktiv' => true
]);
}
//noch nicht eingetragene Zeugnisnoten auf 9 setzen
$result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz);
if (isError($result))
return $result;
$result = getData($result) ?: [];
foreach ($result as $lv)
{
if (!$lv->note)
{
$result = $this->_ci->ZeugnisnoteModel->insert([
'note' => 9,
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
'student_uid' => $lv->uid,
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
]);
if (isError($result)) {
$result = $this->_ci->ZeugnisnoteModel->update([
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
'student_uid' => $lv->uid,
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
], [
'note' => 9
]);
if (isError($result))
return $result;
}
}
}
//Update Aktionen
//StudentModel updaten
$this->_ci->StudentModel->update([
'student_uid' => $student->student_uid
], [
'verband' => 'B',
'gruppe' => '',
'semester' => 0,
'updatevon' => $insertvon,
'updateamum' => date('c')
]);
//Studentlehrverband setzen
$result = $this->_ci->StudentlehrverbandModel->loadWhere([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student->student_uid
]);
if (hasData($result)) {
$this->_ci->StudentlehrverbandModel->update([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student->student_uid
], [
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'B',
'gruppe' => '',
'updateamum' => date('c'),
'updatevon' => $insertvon
]);
} else {
$this->_ci->StudentlehrverbandModel->insert([
'student_uid' => $student->student_uid,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $student->studiengang_kz,
'semester' => 0,
'verband' => 'B',
'gruppe' => '',
'insertamum' => date('c'),
'insertvon' => $insertvon
]);
}
return success();
}
}
+396
View File
@@ -0,0 +1,396 @@
<?php
/**
* 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/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
*
*/
class SearchBarLib
{
// Error constats
const ERROR_WRONG_JSON = 'ERR001';
const ERROR_WRONG_SEARCHSTR = 'ERR002';
const ERROR_NO_TYPES = 'ERR003';
const ERROR_WRONG_TYPES = 'ERR004';
const ERROR_NOT_AUTH = 'ERR005';
// List of allowed types of search
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student', 'prestudent', 'document', 'cms'];
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
private $_ci; // Code igniter instance
/**
* Gets the CI instance and loads model
*/
public function __construct()
{
$this->_ci =& get_instance(); // get code igniter instance
// It is loaded only to have the DB_Model available
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* It performes the search of the given search string using the specified search types
*/
public function search($searchstr, $types)
{
// Checks if the given parameters are fine
$search = $this->_checkParameters($searchstr, $types);
// If the check was successful then perform the search
if (isSuccess($search)) $search = $this->_search($searchstr, $types);
return $search; // return the result
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Checks:
* - The given searchstr is a not empty string
* - The given types is a not empty array and contains allowed search types
*/
private function _checkParameters($searchstr, $types)
{
// If searchstr is empty
if (isEmptyString($searchstr)) return error(self::ERROR_WRONG_SEARCHSTR);
// If types is not an array or it is empty
if (isEmptyArray($types)) return error(self::ERROR_NO_TYPES);
// If all the elements in types are allowed search types
if (!isEmptyArray(array_diff($types, self::ALLOWED_TYPES))) return error(self::ERROR_WRONG_TYPES);
return success(); // The check is fine!
}
/**
* Loops on types and perform the search of that type using searchstr
* Then it collects all the returned data into an array as property of an object
*/
private function _search($searchstr, $types)
{
// Object to be returned
$result = new stdClass();
$result->data = array();
// For each search type
foreach ($types as $type)
{
// Perform the search and then add the result to data
$result->data = array_merge($result->data, $this->{'_'.$type}($searchstr, $type));
}
return $result;
}
private function _mitarbeiter_ohne_zuordnung($searchstr, $type)
{
$dbModel = new DB_Model();
$sql = '
SELECT
\''.$type.'\' AS type,
b.uid AS uid,
p.person_id AS person_id,
p.vorname || \' \' || p.nachname AS name,
ARRAY_AGG(DISTINCT(org.bezeichnung)) AS organisationunit_name,
COALESCE(b.alias, b.uid) || \''.'@'.DOMAIN.'\' AS email,
TRIM(COALESCE(k.kontakt, \'\') || \' \' || COALESCE(m.telefonklappe, \'\')) AS phone,
\''.base_url(self::PHOTO_IMG_URL).'\' || p.person_id AS photo_url,
ARRAY_AGG(DISTINCT(stdkst.bezeichnung)) AS standardkostenstelle
FROM public.tbl_mitarbeiter m
JOIN public.tbl_benutzer b ON(b.uid = m.mitarbeiter_uid)
LEFT JOIN (
SELECT \'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
WHERE bf.funktion_kurzbz = \'kstzuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, ot.bezeichnung, bf.uid
) stdkst ON stdkst.uid = b.uid
JOIN public.tbl_person p USING(person_id)
LEFT JOIN (
SELECT \'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
WHERE bf.funktion_kurzbz = \'oezuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, ot.bezeichnung, bf.uid
) org ON org.uid = b.uid
LEFT JOIN (
SELECT kontakt, standort_id
FROM public.tbl_kontakt
WHERE kontakttyp = \'telefon\'
) k ON(k.standort_id = m.standort_id)
WHERE
(stdkst.bezeichnung IS NULL
OR org.bezeichnung IS NULL)
AND (
' .
$this->buildSearchClause(
$dbModel,
array('b.uid', 'p.vorname', 'p.nachname'),
$searchstr
) .
'
)
GROUP BY type, b.uid, p.person_id, name, email, m.telefonklappe, phone
';
$employees = $dbModel->execReadOnlyQuery($sql);
// If something has been found then return it
if (hasData($employees)) return getData($employees);
// Otherwise return an empty array
return array();
}
protected function buildSearchClause(DB_Model $dbModel, array $columns, $searchstr)
{
$document = implode(' || \' \' || ', $columns);
$query = '\'' . implode(':* & ', explode(' ', trim($searchstr))) . ':*\'';
$reversequery = '\'*:' . implode(' & *:', explode(' ', trim($searchstr))) . '\'';
$nospacequery = '\'' . implode('', explode(' ', trim($searchstr))) . ':*\'';
$searchclause = <<<EOSC
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$query}))
OR
to_tsvector(reverse(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g')))) @@ to_tsquery(reverse(lower({$reversequery})))
OR
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$nospacequery}))
EOSC;
return $searchclause;
}
/**
* Search for employees
*/
private function _mitarbeiter($searchstr, $type)
{
$dbModel = new DB_Model();
$employees = $dbModel->execReadOnlyQuery('
SELECT
\''.$type.'\' AS type,
b.uid AS uid,
p.person_id AS person_id,
p.vorname || \' \' || p.nachname AS name,
ARRAY_AGG(DISTINCT(org.bezeichnung)) AS organisationunit_name,
COALESCE(b.alias, b.uid) || \''.'@'.DOMAIN.'\' AS email,
TRIM(COALESCE(k.kontakt, \'\') || \' \' || COALESCE(m.telefonklappe, \'\')) AS phone,
\''.base_url(self::PHOTO_IMG_URL).'\' || p.person_id AS photo_url,
ARRAY_AGG(DISTINCT(stdkst.bezeichnung)) AS standardkostenstelle
FROM public.tbl_mitarbeiter m
JOIN public.tbl_benutzer b ON(b.uid = m.mitarbeiter_uid)
JOIN (
SELECT \'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
WHERE bf.funktion_kurzbz = \'kstzuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, ot.bezeichnung, bf.uid
) stdkst ON stdkst.uid = b.uid
JOIN public.tbl_person p USING(person_id)
JOIN (
SELECT \'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
WHERE bf.funktion_kurzbz = \'oezuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, ot.bezeichnung, bf.uid
) org ON org.uid = b.uid
LEFT JOIN (
SELECT kontakt, standort_id
FROM public.tbl_kontakt
WHERE kontakttyp = \'telefon\'
) k ON(k.standort_id = m.standort_id)
WHERE ' .
$this->buildSearchClause(
$dbModel,
array('b.uid', 'p.vorname', 'p.nachname', 'org.bezeichnung', 'stdkst.bezeichnung'),
$searchstr
) .
'
GROUP BY type, b.uid, p.person_id, name, email, m.telefonklappe, phone
');
// If something has been found then return it
if (hasData($employees)) return getData($employees);
// Otherwise return an empty array
return array();
}
/**
* Seach for organisation units
*/
private function _organisationunit($searchstr, $type)
{
$dbModel = new DB_Model();
$ous = $dbModel->execReadOnlyQuery('
SELECT
\''.$type.'\' AS type,
o.oe_kurzbz AS oe_kurzbz,
\'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS name,
oParent.oe_kurzbz AS parentoe_kurzbz,
(CASE WHEN oParent.bezeichnung IS NOT NULL THEN \'[\' || otParent.bezeichnung || \'] \' || oParent.bezeichnung END) AS parentoe_name,
ARRAY_AGG(DISTINCT(bfLeader.uid)) AS leader_uid,
ARRAY_AGG(DISTINCT(bfLeader.vorname || \' \' || bfLeader.nachname)) AS leader_name,
COUNT(bfCount.benutzerfunktion_id) AS number_of_people,
(CASE WHEN o.mailverteiler = TRUE THEN o.oe_kurzbz || \''.'@'.DOMAIN.'\' END) AS mailgroup
FROM public.tbl_organisationseinheit o
JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz)
LEFT JOIN public.tbl_organisationseinheit oParent ON(oParent.oe_kurzbz = o.oe_parent_kurzbz)
LEFT JOIN public.tbl_organisationseinheittyp otParent ON(oParent.organisationseinheittyp_kurzbz = otParent.organisationseinheittyp_kurzbz)
LEFT JOIN (
SELECT benutzerfunktion_id, oe_kurzbz
FROM public.tbl_benutzerfunktion
WHERE funktion_kurzbz = \'oezuordnung\'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
) bfCount ON(bfCount.oe_kurzbz = o.oe_kurzbz)
LEFT JOIN (
SELECT bf.oe_kurzbz, bf.uid, p.vorname, p.nachname
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_benutzer b USING(uid)
JOIN public.tbl_person p USING(person_id)
WHERE funktion_kurzbz = \'Leitung\'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND b.aktiv = TRUE
) bfLeader ON(bfLeader.oe_kurzbz = o.oe_kurzbz)
WHERE ' .
$this->buildSearchClause(
$dbModel,
array('o.oe_kurzbz', 'o.bezeichnung', 'ot.bezeichnung'),
$searchstr
) .
'
GROUP BY type, o.oe_kurzbz, o.bezeichnung, ot.bezeichnung, oParent.oe_kurzbz, oParent.bezeichnung, otParent.bezeichnung
');
// If something has been found
if (hasData($ous))
{
// Loop through the returned dataset
foreach (getData($ous) as $ou)
{
// Create the new property leaders as an empty array
$ou->leaders = array();
// Loop through the found leaders for this organisation unit
for ($i = 0; $i < count($ou->leader_uid); $i++)
{
// If a leader exists for this organisationunit and has a name :D
if (!isEmptyString($ou->leader_uid[$i]) && !isEmptyString($ou->leader_name[$i]))
{
// Empty object that will contains the leader uid and name
$leader = new stdClass();
// Set the properties name and uid
$leader->uid = $ou->leader_uid[$i];
$leader->name = $ou->leader_name[$i];
// Add the leader object to the leaders array
$ou->leaders[] = $leader;
}
}
// Remove the not needed properties leader_uid and leader_name
unset($ou->leader_uid);
unset($ou->leader_name);
}
// Returns the changed dataset
return getData($ous);
}
// Otherwise return an empty array
return array();
}
/**
* Search for persons
*/
private function _person($searchstr, $type)
{
return array();
}
/**
* Search for students
*/
private function _student($searchstr, $type)
{
return array();
}
/**
* Search for prestudents
*/
private function _prestudent($searchstr, $type)
{
return array();
}
/**
* Search for documents
*/
private function _document($searchstr, $type)
{
return array();
}
/**
* Search for CMSs
*/
private function _cms($searchstr, $type)
{
return array();
}
/**
* Search for rooms
*/
private function _raum($searchstr, $type)
{
return array();
}
}
+85
View File
@@ -0,0 +1,85 @@
<?php
/**
* Copyright (C) 2022 fhcomplete.net
*
* 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.
*
*/
require_once(dirname(__FILE__).'/../../vendor/nategood/httpful/bootstrap.php');
/**
* Simple client to call the signature server
*/
class SignatureLib
{
// -------------------------------------------------------------------------------------------------
// Public static methods
/**
* Returns the list of signature inside the given file
*/
public static function list($inputFileName)
{
try
{
// Dont send Document if it is bigger than 30 MB (Limit of Signature Server)
if (filesize($inputFileName) > 30000000)
{
$returnObject = new stdClass();
$returnObject->code = 1;
$returnObject->error = 1;
$returnObject->retval = 'File to big';
return $returnObject;
}
// Get the content of the given file
$inputFileContent = file_get_contents($inputFileName);
if ($inputFileContent === false) // if failed
{
error_log('An error occurred while getting the content from: '.$inputFileName);
}
else
{
// Posts the given file content + file name and expects a response in JSON format
$resultPost = \Httpful\Request::post(SIGNATUR_URL.'/'.SIGNATUR_LIST_API)
->sendsJson()
->authenticateWith(SIGNATUR_USER, SIGNATUR_PASSWORD)
->body('{"filename": "'.basename($inputFileName).'", "content": "'.base64_encode($inputFileContent).'"}')
->expectsJson()
->send();
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception
{
error_log($cee->getMessage());
}
catch (Exception $e) // any other exception
{
error_log($e->getMessage());
}
// If the response is fine
if (isset($resultPost->body) && is_object($resultPost->body)
&& isset($resultPost->body->retval) && is_array($resultPost->body->retval))
{
return $resultPost->body->retval;
}
// Otherwise return a null as error
return null;
}
}
+22 -3
View File
@@ -1,5 +1,22 @@
<?php
/**
* Copyright (C) 2023 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
@@ -16,6 +33,7 @@ class TableWidgetLib
const SESSION_FIELDS = 'fields';
const SESSION_COLUMNS_ALIASES = 'columnsAliases';
const SESSION_ADDITIONAL_COLUMNS = 'additionalColumns';
const SESSION_ENCRYPTED_COLUMNS = 'encryptedColumns';
const SESSION_CHECKBOXES = 'checkboxes';
const SESSION_METADATA = 'datasetMetadata';
const SESSION_ROW_NUMBER = 'rowNumber';
@@ -49,6 +67,7 @@ class TableWidgetLib
const ADDITIONAL_COLUMNS = 'additionalColumns';
const CHECKBOXES = 'checkboxes';
const COLUMNS_ALIASES = 'columnsAliases';
const ENCRYPTED_COLUMNS = 'encryptedColumns';
// ...to format/mark records of a dataset
const FORMAT_ROW = 'formatRow';
@@ -74,7 +93,7 @@ class TableWidgetLib
/**
* Gets the CI instance and loads message helper
*/
public function __construct($params = null)
public function __construct()
{
$this->_ci =& get_instance(); // get code igniter instance
}
@@ -177,7 +196,7 @@ class TableWidgetLib
/**
* Retrieves the dataset from the DB
*/
public function getDataset($datasetQuery)
public function getDataset($datasetQuery, $encryptedColumns)
{
$dataset = null;
@@ -186,7 +205,7 @@ class TableWidgetLib
$this->_ci->load->model('system/Filters_model', 'FiltersModel');
// Execute the given SQL statement suppressing error messages
$dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery);
$dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery, null, $encryptedColumns);
}
return $dataset;
@@ -0,0 +1,56 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Library containing definitions of all core plausichecks.
*/
class PlausicheckDefinitionLib
{
// set fehler for core plausichecks
// structure: fehler_kurzbz => class (library) name for resolving
private $_fehlerLibMappings = array(
'AbbrecherAktiv' => 'AbbrecherAktiv',
'AbschlussstatusFehlt' => 'AbschlussstatusFehlt',
'AktSemesterNull' => 'AktSemesterNull',
'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus',
'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus',
'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten',
'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt',
'DatumSponsionFehlt' => 'DatumSponsionFehlt',
'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge',
'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen',
'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen',
'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen',
'GbDatumWeitZurueck' => 'GbDatumWeitZurueck',
'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus',
'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich',
'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz',
'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant',
'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung',
'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde',
'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent',
'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform',
'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan',
'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent',
'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher',
'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung'
//'StudienplanUngueltig' => 'StudienplanUngueltig'
);
/**
* Gets all fehler_kurzbz-library mappings for fehler which need to be checked.
*/
public function getFehlerLibMappings()
{
return $this->_fehlerLibMappings;
}
/**
* Gets all fehler_kurzbz for fehler which need to be checked.
*/
public function getFehlerKurzbz()
{
return array_keys($this->_fehlerLibMappings);
}
}
@@ -0,0 +1,80 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class PlausicheckProducerLib
{
const CI_PATH = 'application';
const CI_LIBRARY_FOLDER = 'libraries';
const EXTENSIONS_FOLDER = 'extensions';
const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks';
const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck';
private $_ci; // ci instance
private $_extensionName; // name of extension
private $_konfiguration = array(); // configuration parameters
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName'];
// set application
$app = isset($params['app']) ? $params['app'] : null;
$this->_ci =& get_instance(); // get ci instance
// load models
$this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel');
// get all configuration parameters for the application
$fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($app);
if (hasData($fehlerkonfigurationRes))
{
$fehlerkonfiguration = getData($fehlerkonfigurationRes);
foreach ($fehlerkonfiguration as $fk)
{
$this->_konfiguration[$fk->fehler_kurzbz][$fk->konfigurationstyp_kurzbz] = $fk->konfiguration;
}
}
}
/**
* Executes plausicheck using a given library, returns the result.
* @param $libName string name of library producing the issue
* @param $fehler_kurzbz string unique short name of fehler, for which issue is produced
* @param $params parameters passed to issue production method
*/
public function producePlausicheckIssue($libName, $fehler_kurzbz, $params)
{
// if called from extension (extension name set), path includes extension names
$libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
// path for loading issue library
$issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/';
// file path of library for check if file exists
$issuesLibFilePath = DOC_ROOT . self::CI_PATH
. '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::PLAUSI_ISSUES_FOLDER . '/' . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath)) return error("Issue library file " . $issuesLibFilePath . " does not exist");
// load konfiguration parameters of the fehler_kurzbz
$config = isset($this->_konfiguration[$fehler_kurzbz]) ? $this->_konfiguration[$fehler_kurzbz] : null;
// load library connected to fehlercode
$this->_ci->load->library($issuesLibPath . $libName, $config);
$lowercaseLibName = mb_strtolower($libName);
// check if method is defined in library class
if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::EXECUTE_PLAUSI_CHECK_METHOD_NAME)))
return error("Method " . self::EXECUTE_PLAUSI_CHECK_METHOD_NAME . " is not defined in library $lowercaseLibName");
// call the function for checking for issue production
return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params);
}
}
@@ -0,0 +1,91 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AbbrecherAktiv extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id)
);
}
}
// return the results
return success($results);
}
/**
* Abbrecher cannot be active.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "
SELECT
pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudentstatus pre_status
JOIN public.tbl_prestudent pre USING(prestudent_id)
JOIN public.tbl_student student USING(prestudent_id)
JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
pre_status.status_kurzbz ='Abbrecher'
AND benutzer.aktiv=true";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND pre.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,143 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AbschlussstatusFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAbschlussstatusFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id)
);
}
}
// return the results
return success($results);
}
/**
* Prestudent should have a final status.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAbschlussstatusFehlt(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (pre.prestudent_id)
pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE
NOT EXISTS( /*student does not study anymore*/
SELECT
1
FROM
public.tbl_prestudentstatus ps
JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
WHERE
prestudent_id=pre.prestudent_id
/* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */
AND tbl_studiensemester.ende>now() - interval '4 months'
)
/* check only valid begininng with 2018 */
AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id)
AND NOT EXISTS( /* no end status */
SELECT 1
FROM public.tbl_prestudentstatus ps
WHERE
prestudent_id=pre.prestudent_id
AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming')
)
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
if (hasData($prevStudiensemesterRes))
{
// if Studiensemester given, check only if has status in current or previous semester
$prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
$qry .= " AND EXISTS (
SELECT 1
FROM public.tbl_prestudentstatus ps
WHERE studiensemester_kurzbz IN (?, ?)
AND ps.prestudent_id = pre.prestudent_id
)";
$params[] = $prevStudiensemester;
$params[] = $studiensemester_kurzbz;
}
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND pre.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,100 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AktSemesterNull extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
),
'resolution_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
)
);
}
}
// return the results
return success($results);
}
/**
* Current Ausbildungssemester shouldn't be 0.
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_prestudentstatus prestat USING(prestudent_id)
JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE
prestat.status_kurzbz != 'Incoming'
AND prestat.studiensemester_kurzbz = ?
AND ausbildungssemester = 0
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND pre.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,99 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AktiverStudentOhneStatus extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id)
);
}
}
// return the results
return success($results);
}
/**
* Students with active Benutzer should have a status in the current semester.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "
SELECT
DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_student student
JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid)
JOIN public.tbl_prestudent prestudent USING(prestudent_id)
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
WHERE
benutzer.aktiv=TRUE
AND stg.melderelevant
AND prestudent.bismelden
AND NOT EXISTS (
SELECT 1
FROM public.tbl_prestudentstatus
JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz)
WHERE prestudent_id = prestudent.prestudent_id
/* buffer of four months, as status are often entered later */
AND sem.ende::date > NOW() - interval '4 months'
)";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND prestudent.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,120 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
* Student with active status should have been charged, i.e. have a Kontobuchung with negative or zero value.
*/
class AktiverStudentstatusOhneKontobuchung extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAktiverStudentstatusOhneKontobuchung(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
),
'resolution_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
)
);
}
}
// return the results
return success($results);
}
/**
* Student with active status should have been charged, i.e. have a Kontobuchung with a negative or zero value.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAktiverStudentstatusOhneKontobuchung(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
DISTINCT ON (pre.prestudent_id)
pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_person pers USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE
status.studiensemester_kurzbz = ?
AND status.status_kurzbz IN ('Student', 'Incoming')
AND NOT EXISTS (
SELECT 1
FROM
public.tbl_konto
WHERE
person_id = pers.person_id
AND studiensemester_kurzbz = status.studiensemester_kurzbz
AND buchungsnr_verweis IS NULL
AND betrag <= 0
)
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND pre.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,116 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getAusbildungssemPrestudentUngleichAusbildungssemStatus(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array(
'status_ausbildungssemester' => $prestudent->status_ausbildungssemester,
'student_ausbildungssemester' => $prestudent->student_ausbildungssemester,
'student_uid' => $prestudent->student_uid,
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
),
'resolution_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
)
);
}
}
// return the results
return success($results);
}
/**
* Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus.
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getAusbildungssemPrestudentUngleichAusbildungssemStatus(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz);
$qry = "
SELECT
DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id,
status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz,
stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_student student
JOIN public.tbl_studentlehrverband lv USING(student_uid)
JOIN public.tbl_prestudent prestudent USING(prestudent_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
WHERE
status.studiensemester_kurzbz = ?
AND lv.studiensemester_kurzbz = ?
AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher')
AND get_rolle_prestudent (prestudent_id, ?)='Student'
AND status.ausbildungssemester != lv.semester";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND prestudent.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,123 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class BewerberNichtZumRtAngetreten extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getBewerberNichtZumRtAngetreten(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
'resolution_params' => array(
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz,
'prestudent_id' => $prestudent->prestudent_id
)
);
}
}
// return the results
return success($results);
}
/**
* Bewerber should have participated in Reihungstest.
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getBewerberNichtZumRtAngetreten(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes;
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz
FROM
public.tbl_prestudent prestudent
JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id)
JOIN public.tbl_person USING(person_id)
LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz)
JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE
status_kurzbz='Bewerber'
AND reihungstestangetreten=false
AND stg.melderelevant
AND prestudent.bismelden";
if (hasData($previousStudiensemesterRes))
{
$previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz;
$qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)";
$params[] = $previousStudiensemester;
}
else
{
$qry .= " AND studiensemester_kurzbz=?";
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND prestudent.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,123 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class DatumAbschlusspruefungFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getDatumAbschlusspruefungFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'abschlusspruefung_id' => $prestudent->abschlusspruefung_id
),
'resolution_params' => array('abschlusspruefung_id' => $prestudent->abschlusspruefung_id)
);
}
}
// return the results
return success($results);
}
/**
* Date of final exam shouldn't be missing for Absolvent.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getDatumAbschlusspruefungFehlt(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$abschlusspruefung_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
pre.person_id, pre.prestudent_id,
pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id,
stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING(prestudent_id)
JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid
WHERE
status_kurzbz = 'Absolvent'
AND NOT EXISTS ( /* exclude gs */
SELECT 1
FROM bis.tbl_mobilitaet
WHERE prestudent_id = pre.prestudent_id
AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz
)
AND abschlussbeurteilung_kurzbz!='nicht'
AND abschlussbeurteilung_kurzbz IS NOT NULL
AND pruefung.datum IS NULL
AND pre.bismelden
AND stg.melderelevant";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND prestatus.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($abschlusspruefung_id))
{
$qry .= " AND pruefung.abschlusspruefung_id = ?";
$params[] = $abschlusspruefung_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,123 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class DatumSponsionFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
// pass parameters needed for plausicheck
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->getDatumSponsionFehlt(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($prestudentRes)) return $prestudentRes;
if (hasData($prestudentRes))
{
$prestudents = getData($prestudentRes);
// populate results with data necessary for writing issues
foreach ($prestudents as $prestudent)
{
$results[] = array(
'person_id' => $prestudent->person_id,
'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
'fehlertext_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'abschlusspruefung_id' => $prestudent->abschlusspruefung_id
),
'resolution_params' => array('abschlusspruefung_id' => $prestudent->abschlusspruefung_id)
);
}
}
// return the results
return success($results);
}
/**
* Date of sponsion shouldn't be missing for Absolvent.
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getDatumSponsionFehlt(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$abschlusspruefung_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
pre.person_id, pre.prestudent_id,
pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id,
stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING(prestudent_id)
JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid
WHERE
status_kurzbz = 'Absolvent'
AND NOT EXISTS ( /* exclude gs */
SELECT 1
FROM bis.tbl_mobilitaet
WHERE prestudent_id = pre.prestudent_id
AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz
)
AND abschlussbeurteilung_kurzbz!='nicht'
AND abschlussbeurteilung_kurzbz IS NOT NULL
AND pruefung.sponsion IS NULL
AND pre.bismelden
AND stg.melderelevant";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND prestatus.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($abschlusspruefung_id))
{
$qry .= " AND pruefung.abschlusspruefung_id = ?";
$params[] = $abschlusspruefung_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}

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