Compare commits

...

519 Commits

Author SHA1 Message Date
ma0068 a60345e7c8 bugfix 2023-07-27 14:11:44 +02:00
Andreas Österreicher f4c8f00c8f Added AuthLib to Searchbar Component 2023-07-10 17:18:30 +02:00
Andreas Österreicher 477da65817 Laden der Organisationseinheiten bei Berechtigungszuordnung behoben 2023-07-10 15:17:09 +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
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
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
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
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
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
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
KarpAlex c9c6955198 issue configuration: enabled deletion of single configuration values, updated fehlermonitoring phrases 2023-06-05 19:29:27 +02:00
Andreas Österreicher bce7e6ce7f Merge branch 'feature-29133/einzelne_studiengaenge_aus_issues_check_ausnehmen' 2023-06-05 11:03:09 +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
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
Andreas Österreicher 34715712f3 App für Personalverwaltung hinzugefügt 2023-05-24 16:26:53 +02:00
KarpAlex 4b2e3c2f6b Merge branch 'master' into feature-29133/einzelne_studiengaenge_aus_issues_check_ausnehmen 2023-05-23 16:22:05 +02:00
KarpAlex de43e69ccf plausichecks GUI: added fehlercode to recognise fehler in fehler monitoring issues 2023-05-23 14:29:38 +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
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
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 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
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
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
Andreas Österreicher f7ec0c4ce0 Merge branch 'feature-27946/infocenter_zusaetzliche_spalte_fuer_kaution' 2023-05-05 08:53:17 +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
Andreas Österreicher 3b1d913006 Merge branch 'TechnikumWienAcademy-ku-prod-hotfix-221118' 2023-05-04 09:46:02 +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
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
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 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
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
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
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
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
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
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 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
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 d93c19913b - spalte fuer kaution hinzugefuegt 2023-04-04 15:07:23 +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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Cris fe7cd05d57 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2023-02-22 10:10:10 +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
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
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
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
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
Manfred c8fb2080da Studiengangsfilter bei Fragenübersicht 2023-01-20 10:46:22 +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
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
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
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
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
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
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
Cris ca217f1869 Fixed: Downloadlink erzeugt nach Page Reload keine Fehlermeldung mehr 2022-11-29 18:10:39 +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
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
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
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 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
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
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
ma0048 a9d065044d - Inaktive LektorInnen im Lehrauftrags-Dropdown kennzeichnen 2022-11-07 12:17:09 +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 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 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
ma0048 f0fd071e31 - notizen ausblenden 2022-10-31 13:44:17 +01:00
ma0048 f7bd49b408 - master messages an studiengang, wenn bereits bestaetigt
- lehrgang messages direkt an lehrgang
2022-10-28 10:56:02 +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
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
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
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 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
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
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
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
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
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
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
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
ma0068 3570b2c04d BT: Adaptierung Prüfung auf Abbrecher auf aktuellen Prestudentstatus 2022-09-21 12:54:41 +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
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
KarpAlex 824a148b92 adapted core to Projektarbeitsbeurteilung Zweitbegutachter/Erstbegutacher Controller split 2022-08-31 13:38:38 +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
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
ma0068 fe6a6c5da3 neue Funktion getVorgesetzteMonatTimesheet() 2022-07-06 15:24:28 +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
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
ma0068 c87aee0ddf Zeitsperre Umbau Mail auf Sanchomail, Anzeige Zeitsaldo in Sanchomail, Adpatierungen Urlaub 2022-06-24 08:10:51 +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 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 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
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 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
Paolo d3c30af9f7 Merge branch 'master' into feature-15029/Docsbox 2022-04-11 20:14:26 +02:00
ma0068 6d1c926ec0 Anzeige AllinSaldo in Zeitaufzeichnung 2022-03-29 13:56:00 +02: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
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
282 changed files with 17929 additions and 4291 deletions
+6 -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,9 @@ $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;
+35 -4
View File
@@ -120,11 +120,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'
)
)
@@ -157,7 +164,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 +191,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'),
@@ -260,10 +283,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')
),
);
@@ -17,6 +17,9 @@ class SearchBar extends FHC_Controller
{
parent::__construct();
// Loads the AuthLib and starts the authentication
$this->load->library('AuthLib');
// Load the library SearchBarLib
$this->load->library('SearchBarLib');
}
+27 -1
View File
@@ -22,7 +22,33 @@ 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_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));
}
}
@@ -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,48 +213,46 @@ 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
);
}
}
// 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
);
}
/**
* Send mails to lectors
@@ -259,21 +261,24 @@ class approveAnrechnungDetail extends Auth_Controller
* */
if (!isEmptyArray($retval))
{
self::_sendSanchoMailToLectors($retval);
if ($this->config->item('send_mail') === TRUE)
{
$this->_sendSanchoMailToLectors($anrechnung_id);
}
// Output json to ajax
return $this->outputJsonSuccess($retval);
}
// Output json to ajax
if (isEmptyArray($retval) && $counter > 0)
if (isEmptyArray($retval))
{
return $this->outputJsonError(
$this->terminateWithJsonError(
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
);
}
return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
$this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
/**
@@ -467,39 +472,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 +536,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 +578,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 +608,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),
@@ -226,19 +250,27 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
/**
* Send mails to lectors
* Send mails
* 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);
if ($this->config->item('send_mail') === TRUE)
{
$this->_sendSanchoMail($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);
@@ -316,7 +348,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 +364,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 +466,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,
@@ -234,32 +230,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;
}
/**
@@ -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;
}
@@ -121,6 +121,7 @@ class InfoCenter extends Auth_Controller
'unlockPerson' => 'infocenter:rw',
'saveFormalGeprueft' => 'infocenter:rw',
'saveDocTyp' => 'infocenter:rw',
'updateStammdaten' => 'infocenter:rw',
'saveNachreichung' => 'infocenter:rw',
'getPrestudentData' => 'infocenter:r',
'getLastPrestudentWithZgvJson' => 'infocenter:r',
@@ -141,12 +142,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 +158,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 +168,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',
@@ -600,7 +601,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 +692,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 +746,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 +777,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 +1113,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 +1158,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 +1222,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 +1380,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)) {
@@ -1794,14 +1815,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 +2017,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 +2031,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 +2193,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 +2291,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 +2310,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
);
}
}
+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");
}
}
+91 -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])
{
@@ -274,14 +285,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 +759,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 +811,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 +843,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)
{
+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);
+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)
{
+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");
-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
+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;
}
}
@@ -0,0 +1,55 @@
<?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'
//'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,81 @@
<?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 $_app; // name of application
private $_konfiguration = array(); // konfigratio 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);
}
}
@@ -0,0 +1,108 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class DatumStudiensemesterFalscheReihenfolge 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->getDatumStudiensemesterFalscheReihenfolge($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);
}
/**
* Status Dates and status studysemester dates should be in correct order.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge
* @return success with prestudents or error
*/
public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
// all active students with Status student in current semester
$qry = "
SELECT DISTINCT ON (prestudent_id) *
FROM (
SELECT
prestudent.person_id, prestudent.prestudent_id,
stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
ROW_NUMBER () OVER (
PARTITION BY prestudent.prestudent_id
ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC
) AS reihenfolge_semester,
ROW_NUMBER () OVER (
PARTITION BY prestudent.prestudent_id
ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC
) AS reihenfolge_datum
FROM
public.tbl_student student
JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid)
JOIN public.tbl_prestudent prestudent USING(prestudent_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz)
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
WHERE
benutzer.aktiv=true
AND status.status_kurzbz='Student'
) reihenfolge
WHERE reihenfolge_semester <> reihenfolge_datum";
if (isset($studiengang_kz))
{
$qry .= " AND studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,125 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscheAnzahlAbschlusspruefungen 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->getFalscheAnzahlAbschlusspruefungen(
$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);
}
/**
* Students with finished studies should have exactly one final exam.
* @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 getFalscheAnzahlAbschlusspruefungen(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT * FROM (
SELECT
DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
(
SELECT COUNT(*)
FROM lehre.tbl_abschlusspruefung
WHERE student_uid = stud.student_uid
AND abschlussbeurteilung_kurzbz != 'nicht'
AND abschlussbeurteilung_kurzbz IS NOT NULL
) AS anzahl_abschlusspruefungen
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING(prestudent_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
status_kurzbz = 'Absolvent'
AND pre.bismelden
AND stg.melderelevant
AND NOT EXISTS ( /* exclude gs */
SELECT 1
FROM bis.tbl_mobilitaet
WHERE prestudent_id = pre.prestudent_id
AND studiensemester_kurzbz = status.studiensemester_kurzbz
)";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($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;
}
$qry .= ") studenten
WHERE anzahl_abschlusspruefungen != 1";
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,113 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscheAnzahlHeimatadressen 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
$personRes = $this->getFalscheAnzahlHeimatadressen(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$persons = getData($personRes);
// populate results with data necessary for writing issues
foreach ($persons as $person)
{
$results[] = array(
'person_id' => $person->person_id,
'resolution_params' => array('person_id' => $person->person_id)
);
}
}
// return the results
return success($results);
}
/**
* Students should have exactly one home address.
* @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 person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getFalscheAnzahlHeimatadressen(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT person_id
FROM
(
SELECT person_id, COUNT(adresse_id) AS anzahl_adressen
FROM public.tbl_adresse addr
WHERE heimatadresse IS TRUE
GROUP BY person_id
) adressen
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudent pre USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_student USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
anzahl_adressen != 1
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($person_id))
{
$qry .= " AND person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,113 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscheAnzahlZustelladressen 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
$personRes = $this->getFalscheAnzahlZustelladressen(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$persons = getData($personRes);
// populate results with data necessary for writing issues
foreach ($persons as $person)
{
$results[] = array(
'person_id' => $person->person_id,
'resolution_params' => array('person_id' => $person->person_id)
);
}
}
// return the results
return success($results);
}
/**
* Students should have exactly one delivery address.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getFalscheAnzahlZustelladressen(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT person_id
FROM
(
SELECT person_id, COUNT(adresse_id) AS anzahl_adressen
FROM public.tbl_adresse addr
WHERE zustelladresse IS TRUE
GROUP BY person_id
) adressen
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudent pre USING(person_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_student USING(prestudent_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
anzahl_adressen != 1
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($person_id))
{
$qry .= " AND person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,104 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class GbDatumWeitZurueck 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
$personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$persons = getData($personRes);
// populate results with data necessary for writing issues
foreach ($persons as $person)
{
$results[] = array(
'person_id' => $person->person_id,
'resolution_params' => array('person_id' => $person->person_id)
);
}
}
// return the results
return success($results);
}
/**
* Birthdate is too long ago.
* @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getGbDatumWeitZurueck(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
pers.person_id
FROM
public.tbl_person pers
WHERE
pers.gebdatum < '1920-01-01'
AND EXISTS (
SELECT 1
FROM public.tbl_prestudent
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE person_id = pers.person_id";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
$qry .= ")";
if (isset($person_id))
{
$qry .= " AND pers.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,113 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class InaktiverStudentAktiverStatus 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->getInaktiverStudentAktiverStatus(
$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,
'studiensemester_kurzbz' => $studiensemester_kurzbz
)
);
}
}
// return the results
return success($results);
}
/**
* Students with active status should have an active Benutzer.
* @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 getInaktiverStudentAktiverStatus(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt();
if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes;
$studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : '';
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_benutzer benutzer
JOIN public.tbl_student student 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=false
AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?)
AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant')
AND stg.melderelevant
AND prestudent.bismelden";
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,104 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class IncomingHeimatNationOesterreich 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
$personRes = $this->getIncomingHeimatNationOesterreich(
$studiensemester_kurzbz,
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$persons = getData($personRes);
// populate results with data necessary for writing issues
foreach ($persons as $person)
{
$results[] = array(
'person_id' => $person->person_id,
'resolution_params' => array('person_id' => $person->person_id, 'studiensemester_kurzbz' => $studiensemester_kurzbz)
);
}
}
// return the results
return success($results);
}
/**
* Incoming shouldn't have austrian home address.
* @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 person_id int if check is to be executed only for one person
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getIncomingHeimatNationOesterreich(
$studiensemester_kurzbz,
$studiengang_kz = null,
$person_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
DISTINCT pers.person_id, status.studiensemester_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_person pers USING(person_id)
JOIN public.tbl_adresse addr USING(person_id)
JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE
status.status_kurzbz = 'Incoming'
AND addr.nation = 'A'
AND addr.heimatadresse
AND status.studiensemester_kurzbz = ?
AND stg.melderelevant
AND pre.bismelden";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($person_id))
{
$qry .= " AND pers.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,96 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class IncomingOhneIoDatensatz 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->getIncomingOhneIoDatensatz($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);
}
/**
* Incoming should have IN/OUT data.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param prestudent_id int if check is to be executed only for one prestudent
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "
SELECT
DISTINCT ON(student_uid, nachname, vorname)
tbl_person.person_id,
tbl_prestudent.prestudent_id,
stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_student
JOIN public.tbl_benutzer ON(student_uid=uid)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_prestudent USING(prestudent_id)
JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id)
JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz)
WHERE
bismelden=TRUE
AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid)
AND stg.melderelevant";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND tbl_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,125 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class IncomingOrGsFoerderrelevant 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->getIncomingOrGsFoerderrelevant(
$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);
}
/**
* Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant).
* @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 object success or error
*/
public function getIncomingOrGsFoerderrelevant(
$studiensemester_kurzbz = null,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON(prestudent_id)
pers.person_id,
ps.prestudent_id,
stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_student stud
JOIN public.tbl_benutzer ON(student_uid=uid)
JOIN public.tbl_person pers USING(person_id)
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz)
WHERE
(
status.status_kurzbz = 'Incoming'
OR EXISTS (
SELECT 1
FROM
bis.tbl_mobilitaet
JOIN public.tbl_prestudent USING(prestudent_id)
WHERE
prestudent_id = ps.prestudent_id
AND gsstudientyp_kurzbz = 'Extern'
)
)
AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL)
AND bismelden=TRUE
AND stg.melderelevant";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND status.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND ps.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,148 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class InskriptionVorLetzerBismeldung 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->getInskriptionVorLetzerBismeldung(
$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(
'datum_bismeldung' => date_format(date_create($prestudent->datum_bismeldung), 'd.m.Y'),
'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);
}
/**
* Students of a semester shouldn't start studies before the date of Bismeldung.
* e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020
* e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @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 getInskriptionVorLetzerBismeldung(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
// get Bismeldedatum
$datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz);
$params = array($datumBis, $studiensemester_kurzbz, $datumBis);
// get active students
$qry = "
SELECT
DISTINCT ON (student.student_uid) ? AS datum_bismeldung,
prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz
FROM
public.tbl_benutzer benutzer
JOIN public.tbl_student student on(benutzer.uid = student.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
benutzer.aktiv=true
AND status.studiensemester_kurzbz = ?
/* inscription date before date of first student status */
AND (
SELECT datum
FROM public.tbl_prestudentstatus
WHERE prestudent_id = prestudent.prestudent_id
AND studiensemester_kurzbz = status.studiensemester_kurzbz
AND status_kurzbz = 'Student'
ORDER BY datum, insertamum, ext_id
LIMIT 1
) < ?
AND stg.melderelevant
AND prestudent.bismelden";
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);
}
/**
* Gets Bismeldedate from Studiensemester.
* @param studiensemester_kurzbz string
*/
private function _getBisdateFromSemester($studiensemester_kurzbz)
{
$semesterYear = substr($studiensemester_kurzbz, 2, 6);
$semesterType = substr($studiensemester_kurzbz, 0, 2);
if ($semesterType == 'SS')
{
return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d');
}
if ($semesterType == 'WS')
{
return date_format(date_create($semesterYear."-04-15"), 'Y-m-d');
}
}
}
@@ -0,0 +1,94 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class NationNichtOesterreichAberGemeinde 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
$personRes = $this->getNationNichtOesterreichAberGemeinde(
$studiengang_kz,
null,
$exkludierte_studiengang_kz
);
if (isError($personRes)) return $personRes;
if (hasData($personRes))
{
$persons = getData($personRes);
// populate results with data necessary for writing issues
foreach ($persons as $person)
{
$results[] = array(
'person_id' => $person->person_id,
'fehlertext_params' => array('gemeinde' => $person->gemeinde, 'adresse_id' => $person->adresse_id),
'resolution_params' => array('adresse_id' => $person->adresse_id)
);
}
}
// return the results
return success($results);
}
/**
* Nation is not Austria, but address has austrian Gemeinde.
* @param studiengang_kz int if check is to be executed for certain Studiengang
* @param person_id int if check is to be executed only for one person
* @return success with prestudents or error
*/
public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id
FROM
public.tbl_adresse adr
JOIN public.tbl_prestudent USING(person_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_student USING(prestudent_id)
JOIN public.tbl_benutzer ON(uid=student_uid)
JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz
WHERE
adr.nation!='A'
AND tbl_benutzer.aktiv
AND gemeinde NOT IN ('Münster')
AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($person_id))
{
$qry .= " AND tbl_person.person_id = ?";
$params[] = $person_id;
}
if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
{
$qry .= " AND stg.studiengang_kz NOT IN ?";
$params[] = $exkludierte_studiengang_kz;
}
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,130 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OrgformStgUngleichOrgformPrestudent 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->getOrgformStgUngleichOrgformPrestudent(
$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(
'student_studiengang' => $prestudent->student_studiengang,
'student_orgform' => $prestudent->student_orgform,
'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);
}
/**
* Orgform of a Studiengang in Studienplan should be the same as orgform of student.
* @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 getOrgformStgUngleichOrgformPrestudent(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz,
studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform,
prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_studiengang studiengang
JOIN public.tbl_student student USING(studiengang_kz)
JOIN public.tbl_prestudent prestudent USING(prestudent_id)
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid)
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
LEFT JOIN lehre.tbl_studienplan stpl USING (studienplan_id)
WHERE
benutzer.aktiv = true
AND status.status_kurzbz IN ('Student', 'Unterbrecher', 'Abbrecher', 'Diplomand', 'Absolvent')
AND studiengang.studiengang_kz < 10000
AND status.studiensemester_kurzbz = ?
AND NOT (status.orgform_kurzbz IS NULL AND studiengang.mischform = FALSE)
AND NOT EXISTS(
SELECT 1
FROM
lehre.tbl_studienplan
JOIN
lehre.tbl_studienordnung USING(studienordnung_id)
WHERE
tbl_studienplan.studienplan_id = stpl.studienplan_id
AND tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz
AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)";
if (isset($studiengang_kz))
{
$qry .= " AND studiengang.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;
}
$qry .= "
ORDER BY student_uid";
return $this->_db->execReadOnlyQuery($qry, $params);
}
}
@@ -0,0 +1,29 @@
<?php
/**
* class defining ressources and method to use for plausicheck issue producer
*/
abstract class PlausiChecker
{
protected $_ci; // code igniter instance
protected $_config; // configuration parameters for this plausicheck
protected $_db; // database for queries
public function __construct($configurationParams = null)
{
$this->_ci =& get_instance(); // get code igniter instance
// set configuration
$this->_config = $configurationParams;
// get database for queries
$this->_db = new DB_Model();
}
/**
* Executes a plausi check.
* @param $paramsForChecking array parameters needed for executing the check
* @return array with objects which failed the plausi check
*/
abstract public function executePlausiCheck($paramsForChecking);
}
@@ -0,0 +1,109 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class PrestudentMischformOhneOrgform 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->getPrestudentMischformOhneOrgform(
$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);
}
/**
* Students in "mixed" Studiengang should have Orgform.
* @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 getPrestudentMischformOhneOrgform(
$studiensemester_kurzbz,
$studiengang_kz = null,
$prestudent_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array($studiensemester_kurzbz);
$qry = "
SELECT
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
status.status_kurzbz IN ('Bewerber', 'Student')
AND stg.mischform
AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL)
AND status.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,90 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StgPrestudentUngleichStgStudent 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->getStgPrestudentUngleichStgStudent($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);
}
/**
* Studiengang should be the same for prestudent and student.
* @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 getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "
SELECT
pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_student stud USING(prestudent_id)
JOIN public.tbl_person pers USING(person_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz
WHERE
stud.studiengang_kz != pre.studiengang_kz";
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,104 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StgPrestudentUngleichStgStudienplan 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->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, 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, 'studienplan' => $prestudent->studienplan),
'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id, 'studienordnung_id' => $prestudent->studienordnung_id)
);
}
}
// return the results
return success($results);
}
/**
* Studiengang should be the same for prestudent and studienplan.
* @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 studienordnung_id int if check is to be executed only for a certain studienordnung_id
* @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
* @return success with prestudents or error
*/
public function getStgPrestudentUngleichStgStudienplan(
$studiengang_kz = null,
$prestudent_id = null,
$studienordnung_id = null,
$exkludierte_studiengang_kz = null
) {
$params = array();
$qry = "
SELECT
DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id,
stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudent ps
JOIN public.tbl_prestudentstatus USING(prestudent_id)
JOIN lehre.tbl_studienplan stplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id)
JOIN public.tbl_person USING(person_id)
JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz
WHERE
ps.studiengang_kz<>stordnung.studiengang_kz
AND stg.melderelevant";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND ps.prestudent_id = ?";
$params[] = $prestudent_id;
}
if (isset($studienordnung_id))
{
$qry .= " AND stordnung.studienordnung_id = ?";
$params[] = $studienordnung_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,90 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StudentstatusNachAbbrecher 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->getStudentstatusNachAbbrecher($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);
}
/**
* There shouldn't be any status after Abbrecher status.
* @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 getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
{
$params = array();
$qry = "
SELECT
prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_student student
JOIN public.tbl_prestudent prestudent USING(prestudent_id)
JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id)
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
WHERE
prestatus.status_kurzbz = 'Abbrecher'
AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'";
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,126 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StudienplanUngueltig 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->getStudienplanUngueltig(
$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(
'studienplan' => $prestudent->studienplan,
'ausbildungssemester' => $prestudent->ausbildungssemester,
'prestudent_id' => $prestudent->prestudent_id
),
'resolution_params' => array(
'prestudent_id' => $prestudent->prestudent_id,
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
)
);
}
}
// return the results
return success($results);
}
/**
* Studienplan should be valid in current Ausbildungssemester of prestudent.
* @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 getStudienplanUngueltig(
$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,
tbl_studienplan.bezeichnung AS studienplan,
status.status_kurzbz,
status.studiensemester_kurzbz,
status.ausbildungssemester,
stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
FROM
public.tbl_prestudent pre
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
JOIN public.tbl_person USING(person_id)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
WHERE
status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener')
AND NOT EXISTS (
SELECT
1
FROM
lehre.tbl_studienplan_semester
WHERE
studienplan_id=status.studienplan_id
AND tbl_studienplan_semester.semester = status.ausbildungssemester
AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz
)
AND status.studiensemester_kurzbz=?
AND pre.bismelden
AND stg.melderelevant";
if (isset($studiengang_kz))
{
$qry .= " AND stg.studiengang_kz = ?";
$params[] = $studiengang_kz;
}
if (isset($prestudent_id))
{
$qry .= " AND tbl_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);
}
}
@@ -15,7 +15,6 @@ class CORE_INOUT_0006 implements IIssueResolvedChecker
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->model('codex/Bisio_model', 'BisioModel');
//$this->_ci->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel');
// get all Zwecke
$this->_ci->BisioModel->addSelect('ects_erworben');
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Incoming shouldn't have austrian home address.
*/
class CORE_INOUT_0007 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['issue_person_id']) || !is_numeric($params['issue_person_id']))
return error('Person Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/IncomingHeimatNationOesterreich');
// check if issue persists
$checkRes = $this->_ci->incomingheimatnationoesterreich->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Incoming should have IN/OUT data entry.
*/
class CORE_INOUT_0008 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/IncomingOhneIoDatensatz');
// check if issue persists
$checkRes = $this->_ci->incomingohneiodatensatz->getIncomingOhneIoDatensatz(null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Incoming or external GS student should not be foerderrelevant.
*/
class CORE_INOUT_0009 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/IncomingOrGsFoerderrelevant');
// check if issue persists
$checkRes = $this->_ci->incomingorgsfoerderrelevant->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Birth date of person shouldn't be too long ago.
*/
class CORE_PERSON_0001 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['issue_person_id']) || !is_numeric($params['issue_person_id']))
return error('Person Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/GbDatumWeitZurueck');
// check if issue persists
$checkRes = $this->_ci->gbdatumweitzurueck->getGbDatumWeitZurueck(null, null, $params['issue_person_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Nation of person should be austria if Gemeinde (city) is austrian.
*/
class CORE_PERSON_0002 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['issue_person_id']) || !is_numeric($params['issue_person_id']))
return error('Person Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/NationNichtOesterreichAberGemeinde');
// check if issue persists
$checkRes = $this->_ci->nationnichtoesterreichabergemeinde->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Person should have only one home adress.
*/
class CORE_PERSON_0003 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['issue_person_id']) || !is_numeric($params['issue_person_id']))
return error('Person Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/FalscheAnzahlHeimatadressen');
// check if issue persists
$checkRes = $this->_ci->falscheanzahlheimatadressen->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Person should have only one delivery adress.
*/
class CORE_PERSON_0004 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['issue_person_id']) || !is_numeric($params['issue_person_id']))
return error('Person Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/FalscheAnzahlZustelladressen');
// check if issue persists
$checkRes = $this->_ci->falscheanzahlzustelladressen->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Studiengang should be the same for prestudent and student.
*/
class CORE_STG_0001 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudent');
// check if issue persists
$checkRes = $this->_ci->stgprestudentungleichstgstudent->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Orgform of a Studiengang in Studienplan should be the same as orgform of student.
*/
class CORE_STG_0002 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/OrgformStgUngleichOrgformPrestudent');
// check if issue persists
$checkRes = $this->_ci->orgformstgungleichorgformprestudent->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Students in "mixed" Studiengang should have Orgform.
*/
class CORE_STG_0003 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/PrestudentMischformOhneOrgform');
// check if issue persists
$checkRes = $this->_ci->prestudentmischformohneorgform->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Studiengang should be the same for prestudent and studienplan.
*/
class CORE_STG_0004 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studienordnung_id']) || !is_numeric($params['studienordnung_id']))
return error('Studienordnung Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudienplan');
// check if issue persists
$checkRes = $this->_ci->stgprestudentungleichstgstudienplan->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Abbrecher cannot be active.
*/
class CORE_STUDENTSTATUS_0001 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/AbbrecherAktiv');
// check if issue persists
$checkRes = $this->_ci->abbrecheraktiv->getAbbrecherAktiv(null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* There shouldn't be any status after Abbrecher status.
*/
class CORE_STUDENTSTATUS_0002 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/StudentstatusNachAbbrecher');
// check if issue persists
$checkRes = $this->_ci->studentstatusnachabbrecher->getStudentstatusNachAbbrecher(null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,36 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus.
*/
class CORE_STUDENTSTATUS_0003 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus');
// check if issue persists
$checkRes = $this->_ci->ausbildungssemprestudentungleichausbildungssemstatus->getAusbildungssemPrestudentUngleichAusbildungssemStatus(
$params['studiensemester_kurzbz'],
null,
$params['prestudent_id']
);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,36 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Students with active status should have an active Benutzer.
*/
class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/InaktiverStudentAktiverStatus');
// check if issue persists
$checkRes = $this->_ci->inaktiverstudentaktiverstatus->getInaktiverStudentAktiverStatus(
$params['studiensemester_kurzbz'],
null,
$params['prestudent_id']
);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Students of a semester shouldn't start studies before the date of Bismeldung.
*/
class CORE_STUDENTSTATUS_0005 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/InskriptionVorLetzerBismeldung');
// check if issue persists
$checkRes = $this->_ci->inskriptionvorletzerbismeldung->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Status Dates and status studysemester dates should be in correct order.
*/
class CORE_STUDENTSTATUS_0006 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/DatumStudiensemesterFalscheReihenfolge');
// check if issue persists
$checkRes = $this->_ci->datumstudiensemesterfalschereihenfolge->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Students with active Benutzer should have a status in the current semester.
*/
class CORE_STUDENTSTATUS_0007 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/AktiverStudentOhneStatus');
// check if issue persists
$checkRes = $this->_ci->aktiverstudentohnestatus->getAktiverStudentOhneStatus(null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Studienplan should be valid in current Ausbildungssemester of prestudent.
*/
class CORE_STUDENTSTATUS_0008 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/StudienplanUngueltig');
// check if issue persists
$checkRes = $this->_ci->studienplanungueltig->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Students with finished studies should have exactly one final exam.
*/
class CORE_STUDENTSTATUS_0009 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/FalscheAnzahlAbschlusspruefungen');
// check if issue persists
$checkRes = $this->_ci->falscheanzahlabschlusspruefungen->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Date of final exam shouldn't be missing for Absolvent.
*/
class CORE_STUDENTSTATUS_0010 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['abschlusspruefung_id']) || !is_numeric($params['abschlusspruefung_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/DatumAbschlusspruefungFehlt');
// check if issue persists
$checkRes = $this->_ci->datumabschlusspruefungfehlt->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Date of sponsion shouldn't be missing for Absolvent.
*/
class CORE_STUDENTSTATUS_0011 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['abschlusspruefung_id']) || !is_numeric($params['abschlusspruefung_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/DatumSponsionFehlt');
// check if issue persists
$checkRes = $this->_ci->datumsponsionfehlt->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,36 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Bewerber should have participated in Reihungstest.
*/
class CORE_STUDENTSTATUS_0012 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/BewerberNichtZumRtAngetreten');
// check if issue persists
$checkRes = $this->_ci->bewerbernichtzumrtangetreten->getBewerberNichtZumRtAngetreten(
$params['studiensemester_kurzbz'],
null,
$params['prestudent_id']
);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Current Ausbildungssemester shouldn't be 0.
*/
class CORE_STUDENTSTATUS_0013 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/AktSemesterNull');
// check if issue persists
$checkRes = $this->_ci->aktsemesternull->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,29 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Prestudent should have a final status.
*/
class CORE_STUDENTSTATUS_0014 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/AbschlussstatusFehlt');
// check if issue persists
$checkRes = $this->_ci->abschlussstatusfehlt->getAbschlussstatusFehlt(null, null, $params['prestudent_id']);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
@@ -0,0 +1,36 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Student with active status should have been charged, i.e. have a Kontobuchung with negative or zero value.
*/
class CORE_STUDENTSTATUS_0015 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id']))
return error('Prestudent Id missing, issue_id: '.$params['issue_id']);
if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz']))
return error('Studiensemester missing, issue_id: '.$params['issue_id']);
$this->_ci =& get_instance(); // get code igniter instance
$this->_ci->load->library('issues/plausichecks/AktiverStudentstatusOhneKontobuchung');
// check if issue persists
$checkRes = $this->_ci->aktiverstudentstatusohnekontobuchung->getAktiverStudentstatusOhneKontobuchung(
$params['studiensemester_kurzbz'],
null,
$params['prestudent_id']
);
if (isError($checkRes)) return $checkRes;
if (hasData($checkRes))
return success(false); // not resolved if issue is still present
else
return success(true); // resolved otherwise
}
}
+2 -2
View File
@@ -128,8 +128,8 @@ class Messages_model extends CI_Model
{
$ouOptions .= sprintf(
"\n".'<option value="%s">%s</option>',
is_numeric($ou->prestudent_id) ? $ou->oe_kurzbz : self::ALT_OE,
$ou->bezeichnung . (is_numeric($ou->prestudent_id) ? '' : ' *')
($ou->typ === 'l' ? $ou->oe_kurzbz : (is_numeric($ou->prestudent_id) ? $ou->oe_kurzbz : self::ALT_OE)),
$ou->bezeichnung . ((is_numeric($ou->prestudent_id) || $ou->typ === 'l' ) ? '' : ' *')
);
}
}
+4 -1
View File
@@ -171,7 +171,7 @@ class Akte_model extends DB_Model
* @param bool $nachgereicht if true, retrieves only nachgereichte Dokumente. if false, only not nachgereichte. default: null, all Dokumente
* @return array
*/
public function getAktenWithDokInfo($person_id, $dokument_kurzbz = null, $nachgereicht = null)
public function getAktenWithDokInfo($person_id, $dokument_kurzbz = null, $nachgereicht = null, $archiv = null)
{
$this->addSelect('public.tbl_akte.*, bezeichnung_mehrsprachig, dokumentbeschreibung_mehrsprachig, public.tbl_dokument.bezeichnung as dokument_bezeichnung, bis.tbl_nation.*, ausstellungsdetails');
$this->addJoin('public.tbl_dokument', 'dokument_kurzbz');
@@ -184,6 +184,9 @@ class Akte_model extends DB_Model
if(is_bool($nachgereicht))
$where['nachgereicht'] = $nachgereicht;
if (is_bool($archiv))
$where['archiv'] = $archiv;
$dokumente = $this->loadWhere($where);
if($dokumente->error) return $dokumente;
+38 -5
View File
@@ -309,13 +309,39 @@ class Prestudent_model extends DB_Model
*/
public function getLastPrestudent($person_id, $withzgv = false)
{
$qry = 'SELECT * FROM public.tbl_prestudent
WHERE person_id = ?
$qry = 'SELECT * FROM public.tbl_prestudent ps
%s
WHERE ps.person_id = ?
ORDER BY updateamum DESC NULLS LAST, insertamum DESC NULLS LAST
LIMIT 1';
$zgvwhere = $withzgv === true ? 'AND zgv_code IS NOT NULL' : '';
$zgvwhere = '';
if ($withzgv === true)
{
$zgvwhere = '
LEFT JOIN (
SELECT ps2.zgvmas_code,
ps2.zgvmanation,
ps2.zgvmadatum,
ps2.zgvmaort,
ps2.zgvmas_erfuellt,
ps2.person_id
FROM tbl_prestudent ps2
WHERE zgvmas_code IS NOT NULL
ORDER BY updateamum DESC NULLS LAST, insertamum DESC NULLS LAST
) zgvmas ON zgvmas.person_id = ps.person_id
LEFT JOIN (
SELECT ps2.zgv_code,
ps2.zgvnation,
ps2.zgvdatum,
ps2.zgvort,
ps2.zgv_erfuellt,
ps2.person_id
FROM tbl_prestudent ps2
WHERE zgv_code IS NOT NULL
ORDER BY updateamum DESC NULLS LAST, insertamum DESC NULLS LAST
)zgv ON zgv.person_id = ps.person_id';
}
$qry = sprintf($qry, $zgvwhere);
@@ -560,9 +586,10 @@ class Prestudent_model extends DB_Model
o.bezeichnung,
(CASE
WHEN sg.typ = \'b\' THEN ps.prestudent_id
WHEN sg.typ = \'m\' THEN ps.prestudent_id
WHEN sg.typ = \'m\' THEN mps.prestudent_id
ELSE NULL
END) AS prestudent_id
END) AS prestudent_id,
sg.typ
FROM public.tbl_prestudent p
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
@@ -571,11 +598,17 @@ class Prestudent_model extends DB_Model
FROM public.tbl_prestudentstatus
WHERE status_kurzbz = \'Bewerber\'
) ps USING(prestudent_id)
LEFT JOIN (
SELECT prestudent_id
FROM public.tbl_prestudentstatus
WHERE status_kurzbz = \'Interessent\' AND bestaetigtam IS NOT NULL
) mps ON p.prestudent_id = mps.prestudent_id
WHERE p.person_id = ?
GROUP BY o.oe_kurzbz,
o.bezeichnung,
sg.typ,
ps.prestudent_id,
mps.prestudent_id,
p.prestudent_id
ORDER BY o.bezeichnung';
@@ -0,0 +1,14 @@
<?php
class RueckstellungStatus_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'public.tbl_rueckstellung_status';
$this->pk = 'status_kurzbz';
}
}
@@ -0,0 +1,33 @@
<?php
class Rueckstellung_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'public.tbl_rueckstellung';
$this->pk = 'rueckstellung_id';
$this->hasSequence = true;
}
public function getByPersonId($person_id, $status = null)
{
$language_index = getUserLanguage() == 'German' ? 0 : 1;
$this->addLimit(1);
$this->addJoin('tbl_rueckstellung_status', 'status_kurzbz');
$this->addSelect('*,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>'.$language_index . 'as bezeichnung');
$this->addOrder('datum_bis', 'DESC');
$where['person_id'] = $person_id;
if (!isEmptyString($status))
$where['status_kurzbz'] = $status;
return $this->loadWhere($where);
}
}
@@ -0,0 +1,87 @@
<?php
class Anrechnungszeitraum_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_anrechnungszeitraum';
$this->pk = 'anrechnungszeitraum_id';
}
/**
* Save new Anrechnungszeitraum.
*
* @param $studiensemester_kurzbz
* @param $anrechnungstart
* @param $anrechnungende
* @return array|stdClass
*/
public function insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende)
{
$result = $this->insert(array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'anrechnungstart' => $anrechnungstart,
'anrechnungende' => $anrechnungende,
'insertvon' => getAuthUID()
));
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum speichern.');
}
// Return new anrechnungszeitraum_id
return success($result->retval);
}
/**
* Delete Anrechnungszeitraum.
*
* @param $anrechnungszeitraum_id
* @return array|stdClass
*/
public function deleteAzr($anrechnungszeitraum_id)
{
$result = $this->delete(array('anrechnungszeitraum_id' => $anrechnungszeitraum_id));
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum löschen.');
}
return success($result->retval);
}
/**
* Update existing Anrechnungszeitraum.
*
* @param $anrechnungszeitraum_id
* @param $studiensemester_kurzbz
* @param $anrechnungstart
* @param $anrechnungende
* @return array|stdClass
*/
public function updateAzr($anrechnungszeitraum_id, $studiensemester_kurzbz, $anrechnungstart, $anrechnungende)
{
$result = $this->update(
$anrechnungszeitraum_id,
array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'anrechnungstart' => $anrechnungstart,
'anrechnungende' => $anrechnungende
)
);
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum update.');
}
return success($result->retval);
}
}
@@ -200,6 +200,28 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz));
}
/**
* Gets all Leiter of Lehrveranstaltungsorganisationseinheit
* @param $lehrveranstaltung_id
* @return array|null
*/
public function getLeitungOfLvOe($lehrveranstaltung_id)
{
$query = "select distinct vorname, nachname, uid
FROM
lehre.tbl_lehrveranstaltung lv
JOIN public.tbl_organisationseinheit og using (oe_kurzbz)
JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz)
join public.tbl_benutzer b using (uid)
join public.tbl_person p using (person_id)
where
bf.datum_von <= now()::date
and (bf.datum_bis >= now()::date or bf.datum_bis is null)
and bf.funktion_kurzbz = 'Leitung' -- Leitung of LV-OE
and lehrveranstaltung_id = ?";
return $this->execQuery($query, array($lehrveranstaltung_id));
}
/**
* Gets Lehrveranstaltungen of a student
@@ -1,7 +1,6 @@
<?php
class Paabgabe_model extends DB_Model
{
/**
* Constructor
*/
@@ -11,4 +10,24 @@ class Paabgabe_model extends DB_Model
$this->dbTable = 'campus.tbl_paabgabe';
$this->pk = 'paabgabe_id';
}
/**
* Gets last Endabgabe of a Projektarbeit, including filename.
* @param int $projektarbeit_id
* @return object
*/
public function getEndabgabe($projektarbeit_id)
{
$qry = "SELECT paabgabe_id, student_uid, paabg.datum, paabg.abgabedatum, projekttyp_kurzbz, titel, titel_english,
paabgabe_id || '_' || student_uid || '.pdf' AS filename
FROM campus.tbl_paabgabe paabg
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
WHERE projektarbeit_id = ?
AND paabgabetyp_kurzbz = 'end'
AND paabg.abgabedatum IS NOT NULL
ORDER BY paabg.abgabedatum, paabg.datum DESC
LIMIT 1";
return $this->execQuery($qry, array($projektarbeit_id));
}
}

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