Compare commits

...

755 Commits

Author SHA1 Message Date
Paolo 82c2652148 Fix: code quality checks 2023-04-20 15:05:45 +02:00
Paolo a128d57c60 Bugfix infocenter message list 2023-04-19 15:35:54 +02:00
Paolo 29c91a1cda FAS page to read messages wrongly displays the sender 2023-04-19 15:15:23 +02:00
Paolo a0b368683e - Remove global constant OU_SENDER_TEST_REMINDER from application/config/constants.php
- Page for the Infocenter details messages block should use CL/Message_model logic
- Page to read personal messages wrongly displays the sender
- Page to read message with token wrongly displays the sender
- All the pages should display the sender using the following logic:
 	- If the sender id is set and it is not the system sender and the organization unit is not set then display the sender name + surname
 	- If the sender id is set and it is not the system sender and the organization unit is set then display the sender name + surname
 	- If the sender id is set and it is the system sender and the organization unit is set then display the organization unit
 	- If the sender id is set and it is the system sender and the organization unit is not set then display "System sender"
 	- The organization unit should firstly retrieved from the degree programs, if not available then from the organization units, if not available then display "System sender"
- Centralized this logic in the CL/Message_model as much as possible
2023-04-19 13:51:53 +02:00
Paolo 932f5efb5c Merge branch 'master' into feature-18197/ReihungstestReminderLog 2023-04-18 14:29:05 +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
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
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
Andreas Österreicher 995b3ecb18 Merge branch 'feature-28539/Projektarbeitsbeurteilung_Anpassungen' 2023-04-05 15:10:54 +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
Manfred 9527fd006f Rechte-Detailansicht 2023-03-27 17:08:22 +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
KarpAlex b827d8cbea Projektarbeit Abgabetool: Text is displayed for student instead of note if Projektarbeit Benotung is saved, but not abgeschickt (sent) 2023-03-17 17:33:18 +01:00
Andreas Österreicher 4787159071 Merge branch 'feature-24880/Sprachaenderung_in_Projektarbeitsbeurteilung_mit_Token' 2023-03-16 15:13:07 +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
KarpAlex 9c1d58c447 Merge branch 'master' into feature-24880/Sprachaenderung_in_Projektarbeitsbeurteilung_mit_Token 2023-03-15 21:47:33 +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
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
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
Andreas Österreicher c411b826d9 Merge branch 'feature-25518/bewerbungstool_messages_direkt_an_permesser' 2023-03-06 16:54:43 +01:00
Andreas Österreicher 90a518a70d Merge branch 'bug-27845/rt_zeit_hinzufuegen_bug' 2023-02-28 15:45:48 +01:00
ma0068 7bbada7e63 BugFix Anzeige Constant OE Infocenter 2023-02-27 13:52:15 +01:00
ma0048 012e7b9691 - kollision bei ganztaetigen zeitsperren 2023-02-27 11:35:04 +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
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 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
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
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
ma0068 090345d6c0 OE-Unit in Abhängigkeit von der Sender-OE anzeigen 2022-12-13 10:58:52 +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
ma0068 ac4b815596 Anzeige OE als Sender in der Messagelist 2022-12-07 11:39:02 +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
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
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
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
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 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
Paolo 50bf478f0b If the title is not provided to the FilterComponent then the title div is not rendered 2022-11-04 14:06:50 +01:00
Paolo 317a1f87fa Added colors to the LogsViewer app 2022-11-04 13:56:54 +01:00
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
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 50b19161b9 Merge branch 'master' into feature-18197/ReihungstestReminderLog 2022-11-02 16:22:25 +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
Andreas Österreicher 1c0b21cb74 JS Includes Korrigiert für Prüfungsprotokolle und UDFs 2022-10-31 16:30:41 +01:00
Andreas Österreicher 15b2c469e2 Restricted Access 2022-10-31 15:31:50 +01:00
Andreas Österreicher 771395cbbf Versionsnummer auf 3.4 erhöht. Extension installer Prüft auf
Minimalversion vom Core. Neue Ordnerstruktur für Checksystem
2022-10-31 15:16:30 +01:00
ma0048 f0fd071e31 - notizen ausblenden 2022-10-31 13:44:17 +01:00
Andreas Österreicher 989a7b8720 Neuen Config für BASE_LOCATION hinzugefügt 2022-10-31 13:23:03 +01:00
Andreas Österreicher 556e58e78e Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' 2022-10-31 11:29:51 +01:00
ma0048 f7bd49b408 - master messages an studiengang, wenn bereits bestaetigt
- lehrgang messages direkt an lehrgang
2022-10-28 10:56:02 +02:00
Harald Bamberger c9aba38803 change name of column StdKst to Standardkostenstelle 2022-10-28 07:01:39 +02:00
ma0048 4518eab1a8 - stammdaten include 2022-10-25 07:14:47 +02:00
ma0048 9192befce1 - stammdaten include 2022-10-25 07:08:29 +02:00
ma0048 572e53f554 - addon angepassst fuer die stammdaten 2022-10-25 07:02:13 +02:00
Harald Bamberger b3ce06cb90 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-10-24 15:21:11 +02:00
Manfred 73dd6e6dc1 Autocomplete in Berechtigungrolle 2022-10-24 14:27:54 +02:00
Manfred 5e9b5b2ce5 Direktlink auf Rolle 2022-10-24 14:27:34 +02:00
Manfred bf8aa6c4ac Student im Max-Semester nicht vorrücken 2022-10-24 12:23:03 +02:00
Manfred 409ccd7640 BugFix DISTINCT in getOrganisationunitsByPersonId 2022-10-24 12:21:40 +02:00
Manfred b89494f80a Merge remote-tracking branch 'origin/master' 2022-10-24 12:18:31 +02:00
Harald Bamberger 50ab6ae5e9 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-10-24 11:02:52 +02:00
KarpAlex 7a1f36cb5e issuesData Fehlermonitoring: changed order for issue display, first by error type, then by status 2022-10-23 18:02:59 +02:00
ma0048 53dc6b3c63 - tag closed 2022-10-21 11:07:52 +02:00
ma0048 1609543a31 - lv evaluierung ubersichtsseite optimiert 2022-10-20 14:01:31 +02:00
Manfred aadd6b0d92 Anzahl Rechte zählen 2022-10-18 16:48:27 +02:00
ma0048 0bd7d6f7c6 - editieren von stammdaten im infocentertool 2022-10-18 11:00:57 +02:00
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
Werner Masik 235f15e9f7 removed primeflex.mini.css 2022-10-17 12:36:08 +02:00
Werner Masik 4480b6ce57 removed 'Bottom Panel' text from verticalSplitter because it is shown on empty pages 2022-10-17 12:36:08 +02:00
Werner Masik 23b228c085 added primeflex css classes 2022-10-17 12:36:08 +02:00
ma0068 4f71a274e2 Update Überprüfungen ZGV mit get_rolle_prestudent() 2022-10-17 08:36:36 +02:00
ma0068 458117fced Funktion existsZGV: prestudents mit Last Status Abbrecher werden nicht berücksichtigt 2022-10-14 16:24:45 +02:00
ma0068 382da823e4 Erweiterung Funktion existsZGV um LastStatusPrestudent 2022-10-14 16:12:41 +02:00
ma0048 bfb24320d7 - editieren der ZGV Master nur noch mit eigenen Recht moeglich 2022-10-14 11:11:25 +02:00
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
Andreas Österreicher 30fbeda1ba Merge branch 'master' into feature-15029/Docsbox 2022-10-11 09:32:24 +02:00
Paolo 08a58b919a Added the operations equal and not equal for strings in the FilterComponent 2022-10-10 14:55:49 +02:00
Paolo ba5fb29d13 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-10-10 14:44:31 +02:00
Andreas Österreicher 6a2f570ffa Merge branch 'feature-20088/BIS_Studiengangsmeldung_Anpassungen' 2022-10-10 14:42:43 +02:00
Paolo aead693675 - Removed not used methods sortSelectedFields, removeSelectedField and addSelectedField from controllers/components/Filter
- Removed not used methods sortSelectedFields, addSelectedField and removeSelectedField from libraries/FilterCmptLib
- CSS fixes for FilterComponent and NavigationComponent
- Removed not used API calls from public/js/components/filter/API.js
- Added second level menu entries to the NavigationComponent
- Added new property side-menu to the FilterComponent to render the filters selection via the NavigationComponent or directly from the FilterComponent
- FilterComponent:
	- Column positioning is now managed by tabulator
	- Splitted the column selection from the filter options
	- Added the rendering of the filters selection via an optional dropdown
	- Changed the usability and the look of the filter options
	- German translation
2022-10-10 14:38:02 +02:00
Andreas Österreicher 617fa1c450 Merge branch 'master' into feature-20088/BIS_Studiengangsmeldung_Anpassungen 2022-10-10 14:27:39 +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
Andreas Österreicher 22613af9fe Merge branch 'feature-25002/Sonstiges-Sprint-192' 2022-10-06 15:12:33 +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
Andreas Österreicher 02445ceff4 Zeitaufzeichnung - Zeit verlängert für die Anzeigen von "allen"
Zeitaufzeichnungen auf 360 Tage
2022-10-06 06:51:14 +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
KarpAlex 6d457fd573 added codex/Mobilitaet_model for bis.tbl_mobilitaet 2022-10-06 00:32:53 +02:00
Manfred 5f8a530857 Merge branch 'master' into benutzerberechtigungGUIneu 2022-10-05 17:51:27 +02:00
Manfred 7fb8c02cd6 Merge remote-tracking branch 'origin/master' 2022-10-05 17:43:57 +02:00
Manfred dfc19f56cb Spalten LAS, ALVS und Anzahl Studierende ergänzt 2022-10-05 17:43:50 +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
Cris c27534c93c Corrected: Mail wird nun an alle STGL versendet, wenn mehrere vorhanden sind
Bei der Abgabe von Anrechnungsempfehlungen wurde bisher nur dem ersten STGL
aus potentiell mehreren STGLeitungen ein mail zugeschickt. Nun werden alle addressiert.
2022-10-05 16:27:17 +02:00
Cris c1180c0879 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-10-05 16:19:03 +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
Andreas Österreicher fded192a98 Merge branch 'feature-21609/LVVerwaltungDefaultwertFuerNeueLvs' 2022-10-03 16:47:54 +02:00
Andreas Österreicher 7cfc6369b6 Optionalen Eintrag beibehalten bei der Anlage von LVs da sonst alte
Einträge ohne Lehrmodus falsch dargestellt werden
2022-10-03 16:46:49 +02:00
Andreas Österreicher 7b6314dc96 Merge branch 'master' into feature-21609/LVVerwaltungDefaultwertFuerNeueLvs 2022-10-03 16:32:33 +02:00
Andreas Österreicher 3bc1654b76 Merge branch 'feature-25001/warning_beim_zuweisen_von_variablen_zu_personen' 2022-10-03 16:12:47 +02:00
Andreas Österreicher 49124f3100 Added JQueryUI css 2022-10-03 15:22: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
KarpAlex 854e0a422f Merge branch 'master' into feature-20088/BIS_Studiengangsmeldung_Anpassungen 2022-09-30 18:16:46 +02:00
KarpAlex c00b9006b5 Merge branch 'master' into feature-20088/BIS_Studiengangsmeldung_Anpassungen 2022-09-30 18:14:33 +02:00
Andreas Österreicher 9d3d84e7ea Pfad zu Bootstrap angepasst 2022-09-30 15:11:01 +02:00
Andreas Österreicher ae4bf1feb1 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-09-30 14:54:07 +02:00
Andreas Österreicher f7b3a3ccaf Merge branch 'feature-19556/Templates_Detailansicht' 2022-09-30 13:50:12 +02:00
ma0048 3967494775 - typo gefixed 2022-09-30 12:52:47 +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
Andreas Österreicher b9b7af0e1d Merge branch 'origin/feature-24110/weiterentwicklung_internationalisierungsmassnahmen' 2022-09-30 09:07:34 +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
Andreas Österreicher 9e32330a6c Paragraph für Plagiatscheck angepasst bei Beurteilungsformularen 2022-09-29 10:35:21 +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
ma0068 8533454ad7 Defaulteintrag in Dropdown Lehrmodus gemäß Configeintrag bei Anlegen neuer LV 2022-09-28 12:13:13 +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
Andreas Österreicher 17ad37ac8e Merge branch 'feature-24767/infocenter_zgv_pruefungen_und_lehre_error' 2022-09-26 16:45:06 +02:00
Andreas Österreicher 4f044fb724 Merge branch 'feature-20696/pausenfehler_wird_nicht_angezeigt' 2022-09-26 16:28:22 +02:00
KarpAlex a238a9f550 studentenmeldung.php: previous first Unterbrechungsdatum is used when there are multiple Unterbrecher status after each other 2022-09-26 11:45:48 +02:00
ma0048 2ab548fc87 - absagegrund wird nun mitgespeichert
- neue filter
- studiengangsleitung kann bestaetigung nur noch ablehnen und nicht loeschen
- neue cronjobs
- neue formatierung
- neue phrasen
2022-09-26 09:46:16 +02:00
KarpAlex 9bae6bb0a4 added params to plausicheck libraries, added PlausicheckProducerLib to enable execution of plausichecks for GUI as well, removed old IssueProducer_Controller 2022-09-26 00:41:48 +02:00
KarpAlex 2c475f8bde fehlerupdate: renamed NationNichtOesterreichAberGemeinde Plausicheck, PlausicheckLib: added comments 2022-09-22 19:54:18 +02:00
ma0068 cb5c11a6ab Zeiterfassung config DEFAULT_ALLIN_DIENSTVERTRAG für Anzeige Saldo AllIn 2022-09-22 13:50:43 +02:00
Harald Bamberger e4590909e2 use alias if available instead of uid for email address 2022-09-22 13:20:12 +02:00
ma0068 f9e33a1779 Zeiterfassung: Config ECHTER_DIENSTVERTRAG 2022-09-22 11:32:49 +02:00
ma0068 c1df686edc Zeiterfassung: Projektvalidierung in Klassen refactored 2022-09-22 10:30:15 +02:00
Harald Bamberger 921b1d337d fix typo 2022-09-22 10:21:24 +02:00
Harald Bamberger bf216e6505 search also in stdkst and oe unit 2022-09-22 10:00:23 +02:00
Harald Bamberger 225b3b7c6e only show current stdkst in searchresult 2022-09-22 09:39:05 +02:00
KarpAlex edb69498e5 added PlausicheckLib for checking plausi issues 2022-09-21 19:55:37 +02:00
KarpAlex 5d1e99a222 Plausichecks: enabled passing of params to plausi issue checkers, created first checker StgPrestudentUngleichStgStudent 2022-09-21 19:54:20 +02:00
KarpAlex 0643b99e86 added Plausicheck fehler (for issues) to database 2022-09-21 19:50:30 +02:00
Harald Bamberger 85338b8477 add PersonalFilters to sideMenu, refresh sideMenu in the session after a custom filter was saved 2022-09-21 15:56:42 +02:00
Harald Bamberger de667990a3 add Standard-Kostenstelle to search result for employees 2022-09-21 15:23:45 +02:00
ma0068 3570b2c04d BT: Adaptierung Prüfung auf Abbrecher auf aktuellen Prestudentstatus 2022-09-21 12:54:41 +02:00
Paolo aa217a42d4 Fixed handlerApplyFilterFields of the components/filter/Filter 2022-09-21 12:47:07 +02:00
Manfred a27ad33e0e Merge branch 'master' into benutzerberechtigungGUIneu 2022-09-21 11:09:27 +02:00
ma0068 4d44bbb79c Anzeige Aktueller Urlaubssaldo in Sanchomail 2022-09-20 12:39:20 +02:00
Paolo 07a1d7ecb2 - Added CSS for the navigation component and the filter component
- Changed layout of the filter component
2022-09-19 16:31:55 +02:00
Andreas Österreicher 0c9d535941 Merge branch 'feature-20221/PHP_7.1_Kompatibilitäte_Excel_Lib' 2022-09-19 16:26:51 +02:00
Andreas Österreicher 4976804f8d Merge branch 'feature-18874/CISMoodleGradeImportMitUID' 2022-09-19 16:02:17 +02:00
Andreas Österreicher 253b1352f9 Merge branch 'bug-20124/FilterWidget_query_executed_before_changes_are_applied_bug' 2022-09-19 15:55:51 +02:00
Andreas Österreicher 4f35d6bf0a Merge branch 'feature-19547/CoodleZeitsperrenAnzeigen' 2022-09-19 15:44:40 +02:00
Andreas Österreicher 0f6836385f Added Column Wahlname to campus.vw_mitarbeiter 2022-09-19 15:31:31 +02:00
Andreas Österreicher 66b9576e15 Merge branch 'bug-24165/Message_reply_token_allow_to_write_to_anybody' 2022-09-19 15:11:51 +02:00
Andreas Österreicher cac01a50ec Added Column Wahlname to campus.vw_student and campus.vw_benutzer 2022-09-19 15:08:50 +02:00
Andreas Österreicher 6ae6751aa4 Merge branch 'feature-19171/Wahlname' 2022-09-19 14:48:05 +02:00
Manfred 79fbb4b7b2 Merge remote-tracking branch 'origin/master' 2022-09-19 14:05:19 +02:00
Manfred 1e85aeb8da Studiensemester save empty string as null 2022-09-19 14:05:12 +02:00
Andreas Österreicher 2a43793982 Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' 2022-09-19 10:26:44 +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
Manfred 83ef4be673 Bugfix Limit 10 entfernt 2022-09-16 14:54:11 +02:00
Manfred ec87bd0c80 UID in Dropdown anzeigen und inaktive Mitarbeiter kennzeichnen 2022-09-16 14:47:59 +02:00
Manfred f65ae01dd0 Suche nach LV-Kurzbz, Bugfix Checksubmit 2022-09-16 14:47:06 +02:00
KarpAlex d5eff7d615 issue plausichecks: added issue producer files, code formatting 2022-09-15 18:56:18 +02:00
KarpAlex e34d9afefe BIS Lehrgangsmeldung: correctly placed Orgformcode Tag, indent formatting 2022-09-15 17:22:33 +02:00
KarpAlex 9fb077afdc studentenmeldung bis: renamed Studienkennunguni, master ZGV elements, correct placement of duales studium, correct checkof duales studium 2022-09-15 14:59:04 +02:00
Cris d366c672b9 Merge branch 'master' into feature-18224/Anrechnungen_ECTS-Grenze 2022-09-15 10:18:11 +02:00
Cris 3690984682 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-09-15 10:17:33 +02:00
Cris 941bbaaa79 Fixed falschen ECTS Höchstgrenze Hinweis in STGL Detailansicht
Es wird nun bei der Berechnung der ECTS Höchstgrenze auch auf den
Anrechnungsgrund geschaut.
2022-09-15 10:17:02 +02:00
Manfred 00ac201596 Text-Inputs in eckigen Klammern werden als Array interpretiert 2022-09-14 15:56:01 +02:00
Manfred 450b0b6433 Initial commit 2022-09-14 15:55:07 +02:00
Manfred c2024ada3a Merge remote-tracking branch 'origin/master' 2022-09-14 15:50:35 +02:00
ma0048 f0cec85d8f style anpassungen und funktionen geloescht 2022-09-14 11:57:23 +02:00
Andreas Österreicher 91f867c0d6 Merge branch 'master' into feature-19171/Wahlname 2022-09-14 11:55:02 +02:00
Andreas Österreicher 4e68989c06 Merge branch 'feature-24817/infocenter_doc_loeschen_error' 2022-09-14 10:36:45 +02:00
ma0048 4cae13d2ee zgv und nation dropdowns gefixed 2022-09-14 08:55:54 +02:00
KarpAlex 0d03689f57 added IIssueExistsChecker and Issue<producer_Controller for detection of issues 2022-09-14 02:48:43 +02:00
ma0048 f7fa97499c error von loeschen der doc gefixed 2022-09-13 18:01:09 +02:00
Andreas Österreicher 85a6fa5600 Merge branch 'feature-19538/Gruppenadministratoren' 2022-09-12 18:08:17 +02:00
Andreas Österreicher 1d93652b0c Merge branch 'master' into feature-19538/Gruppenadministratoren 2022-09-12 18:07:13 +02:00
Andreas Österreicher c4fbaaaa9d Logging for Students implemented 2022-09-12 17:53:51 +02:00
Andreas Österreicher b526f4ee3a Merge branch 'bug-15317/BTAusbildungsvertragNichtAkzeptierenBeiAbgewiesenen' 2022-09-12 16:29:23 +02:00
Andreas Österreicher dd671bf583 Merge branch 'feature-24767/infocenter_zgv_pruefungen_und_lehre_error' 2022-09-12 14:43:48 +02:00
ma0048 030f1c9c4e zgvpruefung fehler behoben und studienartberechtigung 2022-09-12 14:30:12 +02:00
Andreas Österreicher d6a35603e1 Merge branch 'feature-23977/ZGVNeueKodextabellen' 2022-09-12 13:06:07 +02:00
Andreas Österreicher 9afd03d630 Merge branch 'feature-18984/infocenter_tool_fuer_lehrgaenge_anpassen' 2022-09-12 12:50:43 +02:00
Andreas Österreicher 22088b82ba Merge branch 'feature-19487/infocenter_letzter_bearbeiter_wenn_student' 2022-09-12 12:43:17 +02:00
Andreas Österreicher 75e8c35dcc Merge branch 'feature-19484/infocenter_reihungstest_freigegeben_liste_zeigt_immer_nur_einen_an' 2022-09-12 12:41:41 +02:00
Andreas Österreicher 6855e6ff2e Merge branch 'feature-18940/infocenter_loeschen_von_dokumenten' 2022-09-12 12:36:19 +02:00
ma0048 9c85c7cd97 Merge remote-tracking branch 'origin/master' into feature-19487/infocenter_letzter_bearbeiter_wenn_student 2022-09-12 10:17:52 +02:00
ma0048 f571fef11b Merge remote-tracking branch 'origin/master' into feature-19484/infocenter_reihungstest_freigegeben_liste_zeigt_immer_nur_einen_an 2022-09-12 10:17:15 +02:00
ma0048 33b35286d3 Merge remote-tracking branch 'origin/master' into feature-18984/infocenter_tool_fuer_lehrgaenge_anpassen 2022-09-12 10:15:50 +02:00
ma0048 98cf234f6f Merge remote-tracking branch 'origin/master' into feature-18940/infocenter_loeschen_von_dokumenten 2022-09-12 09:52:19 +02:00
ma0068 7252bc1e6f add config.file 2022-09-09 13:20:50 +02:00
Paolo f91d3ad75f Code improvements 2022-09-09 09:58:35 +02:00
KarpAlex 26236bc989 issues fix: error text is correctly passed when invalid issues status passed from GUI 2022-09-08 15:14:09 +02:00
Andreas Österreicher 1867807cdd Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' 2022-09-08 14:29:44 +02:00
Cris 3a595dda58 Merge branch 'master' into feature-18224/Anrechnungen_ECTS-Grenze
# Conflicts:
#	application/controllers/lehre/anrechnung/RequestAnrechnung.php
2022-09-08 14:15:49 +02:00
Cris 617dcc0646 Changed application dates for testing reason 2022-09-08 14:09:37 +02:00
Cris 15121ced6d Fixed missing disabled formular and wrong status-test when student emits Anrechnung with Begruendung Hochschule 2022-09-08 14:08:46 +02:00
Cris d13cc789ad Fix Anrechnung Student View: Änderung des Download-Dokumentnamens zurückgenommen
Der Download-Dokumentname ist in der Studierendenansicht nun wieder gleich wie der originale Dokuementname beim Hochladen.
2022-09-08 12:53:44 +02:00
Paolo 02481a4119 Code improvements 2022-09-08 10:02:59 +02:00
ma0068 604592cdd1 Bewerbungstool: neue Funktion isPastAbbrecher() 2022-09-07 15:27:47 +02:00
Paolo 2056150917 Code quality improvements 2022-09-07 12:18:27 +02:00
Paolo bcaff5b276 jobs/ReihungstestJob->remindApplicantsOfPlacementTest now makes use of infocenter as organization unit to send messages 2022-09-07 10:50:14 +02:00
ma0068 625b3c74c4 Bewerbungstool: keine ZGV bei Abbrechern, Berücksichtigung studentstatus für Dokumenthandling 2022-09-07 09:22:06 +02:00
Cris 7ea9b6a741 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-09-07 09:06:03 +02:00
Andreas Österreicher 393eaea91d Removed Dashboard Testfiles 2022-09-07 09:00:00 +02:00
Andreas Österreicher 00f1eb38d1 Added missing index files 2022-09-07 08:27:31 +02:00
Paolo fd649c49c8 Fixed PHP 8.1 compatibilities problems for include/Excel/* 2022-09-06 15:38:42 +02:00
Cris 522e341d3d Dashboard Test V1 2022-09-06 15:29:42 +02:00
Paolo 1f7fd6989e jobs/ReihungstestJob->remindApplicantsOfPlacementTest now set the organization unit in the message sender database table 2022-09-06 15:21:50 +02:00
Paolo 10ce6128de If a message is sent from:
- An organization unit: when opened via token then the organization unit is displayed as sender and no answer button is displayed
- The system sender: when opened via token then it is displayed as sender: "System sender"
2022-09-06 14:24:42 +02:00
Cris c88061463f Hotfix Anrechnung Student View: Änderung des Download-Dokumentnamens zurückgenommen
Der Download-Dokumentname ist in der Studierendenansicht nun wieder gleich wie der originale Dokuementname beim Hochladen.
2022-09-06 14:21:54 +02:00
Andreas Österreicher 7f64f5c29f Merge branch 'feature-19173/mobilityonline_grant_agreement_ins_fas_uebernehmen' 2022-09-06 12:38:21 +02:00
Cris 262b5b869a Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-09-06 12:15:46 +02:00
Manfred 14c5bdcf3d BugFix Personen zusammenlegen 2022-09-06 11:47:35 +02:00
Manfred 729aec00b3 Admins sehen PreStudent ID und Person ID zum rauskopieren 2022-09-06 11:41:28 +02:00
ma0068 bb4bf02aa8 Merge branch 'master' into feature-20696/pausenfehler_wird_nicht_angezeigt 2022-09-06 09:20:57 +02:00
ma0068 4f7dd73535 Merge branch 'master' into feature-19484/infocenter_reihungstest_freigegeben_liste_zeigt_immer_nur_einen_an 2022-09-06 09:18:58 +02:00
ma0068 52fe5a78e1 Merge branch 'master' into feature-18940/infocenter_loeschen_von_dokumenten 2022-09-06 09:17:39 +02:00
Andreas Österreicher 259dbe9bdc Fixed Error on File Download from Student View 2022-09-05 18:46:13 +02:00
ma0068 985a430888 Merge branch 'master' into feature-19547/CoodleZeitsperrenAnzeigen 2022-09-05 15:23:03 +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
Andreas Österreicher d109747cfc Merge branch 'master' into feature-19173/mobilityonline_grant_agreement_ins_fas_uebernehmen 2022-09-01 15:34:12 +02:00
KarpAlex cc33502ab3 adapted "resend token for Begutachter" mail to Projektarbeitsbeurteilung controller split 2022-09-01 02:23:32 +02:00
Paolo 537ce0940c Code quality check improvements 2022-08-31 15:48:35 +02:00
KarpAlex 824a148b92 adapted core to Projektarbeitsbeurteilung Zweitbegutachter/Erstbegutacher Controller split 2022-08-31 13:38:38 +02:00
Andreas Österreicher 1ddd5b7f14 Merge branch 'feature-20226/erfassung_internationalisierungsmassnahmen_bekanntgabe' 2022-08-31 13:36:18 +02:00
ma0048 74331d5e6c dms kategoerie hinzugefuegt 2022-08-31 11:56:19 +02:00
Andreas Österreicher c215b2cb5f Merge branch 'feature-24103/kartenverlaengerung_gueltig_bis_zu_gueltig_fuer' 2022-08-31 11:42:34 +02:00
Andreas Österreicher 162858721c Merge branch 'feature-24184/infocenter_messages_bei_statuswechsel' 2022-08-31 11:34:38 +02:00
ma0048 90a13e445c fix damit messages wieder geschickt werden 2022-08-31 11:33:29 +02:00
Paolo 8e0734ca8c Added check in CL/Messages_model->sendReply to check that $receiver_id, $relationmessage_id and $token match in the database to avoid to be able to write to anyone using a token 2022-08-30 17:31:04 +02:00
Andreas Österreicher ed9f6e0c9b Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-30 14:44:13 +02:00
Andreas Österreicher a2bacae6d7 Merge branch 'feature-19001/VUE_ROUTER' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-30 14:43:10 +02:00
ma0048 03535b7589 text aenderung und holen alle studienbeitraege 2022-08-30 14:08:00 +02:00
ma0068 d1bb1b9666 Infocenter: Adaptierungen ZGV-Master und ZGVmasternation Dropdown 2022-08-30 13:10:47 +02:00
ma0068 67f1c9a707 Infocenter: Umbau von disabled auf Zusatz bei Dropdowns ZGV und ZGVNation 2022-08-30 11:28:16 +02:00
ma0068 8fd69ccd26 Infocenter: Anzeige gesperrte Nationen als disabled im Dropdown ZGVNation 2022-08-30 09:41:45 +02:00
Andreas Österreicher 81a33654a4 Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' 2022-08-30 09:10:40 +02:00
Andreas Österreicher 68d6e3c549 Merge branch 'master' into feature-18224/Anrechnungen_ECTS-Grenze 2022-08-29 16:23:20 +02:00
ma0068 54a1c486c5 Infocenter: Anzeige inaktive ZGVs als disabled im Dropdown ZGV 2022-08-29 15:12:06 +02:00
cgfhtw 49647c8ded Textänderungen "KVP" entfernen 2022-08-29 14:05:15 +02:00
KarpAlex 079137f497 renamed "dual" checkbox to "duales Studium" 2022-08-29 13:28:26 +02:00
cgfhtw ca9281dbf9 Textänderung KVP 2022-08-29 09:08:27 +02:00
KarpAlex 8dd7f72e37 added Studienkennung Uni to table in gsprogramm vilesci gui 2022-08-27 01:44:37 +02:00
KarpAlex 92762c5dc2 Projektarbeitsbeurteilung:
- getZweitbegutachterWithToken: returns Zweitbegutachter (Senatspruefer) 
from Senatspruefungen as well
- added phrase
2022-08-27 01:34:03 +02:00
Andreas Österreicher da85c69f36 Problem behoben wodurch die Anrechnungen im FAS nicht angezeigt werden
wenn diese ohne Anrechnungstool im FAS erfasst werden
2022-08-25 14:34:40 +02:00
Andreas Österreicher 962ec56b3f Merge branch 'feature-20665/kartenautomat_anpassungen' 2022-08-25 12:48:47 +02:00
ma0048 a13c010cd5 textaenderungen und getzutrittskarte by uid 2022-08-25 10:43:26 +02:00
ma0048 566f2f6399 prueft beim loeschen des dok noch auf person_id 2022-08-25 09:54:33 +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
Andreas Österreicher df3f7565e7 Merge branch 'feature-20665/kartenautomat_anpassungen' 2022-08-24 13:39:01 +02:00
ma0068 8292e00aaf neues Feld aktiv in den ZGV-Tabellen, Ansicht als durchgestrichen der inaktiven ZGV-Einträge in FAS 2022-08-24 12:52:49 +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
Andreas Österreicher c234843bfd Satzungsteil Paragrahen korrigiert 2022-08-23 16:20:19 +02:00
KarpAlex 282b46d54e Added betreuerart Senatsvorsitz and Senatsprüfer 2022-08-23 15:26:13 +02:00
ma0048 f2fcdf2cbf app per dbupdate hinzufuegen 2022-08-22 14:40:39 +02:00
ma0048 06e62cac11 phrasen angepasst 2022-08-22 14:35:05 +02:00
Harald Bamberger 238810b5a8 workaround issue with resizable columns 2022-08-19 12:38:29 +02:00
Paolo b0ffbea9a5 Composer changes 2022-08-19 12:21:04 +02:00
Werner Masik 5af4f7a405 Merge remote-tracking branch 'origin/feature-19473/VUE_Filter_Navigation_Widgets' into feature-19001/VUE_ROUTER 2022-08-18 21:31:54 +02:00
Harald Bamberger 3138ac3e25 add columns Aktiv and StdKst to MA Uebersicht Filterx 2022-08-18 16:38:28 +02:00
Harald Bamberger 582cb20b72 rename Handler functions to do not have a data and methods property error 2022-08-18 15:27:02 +02:00
Paolo c9eb60aade Removed tabulator property from Filter component 2022-08-18 14:52:50 +02:00
Paolo a0e2d7e37d Filter component: changed columns handling for the tabulator 2022-08-18 11:53:54 +02:00
ma0068 075e8ede0a Job Reminder Reihungstest: sender_id statt organization unit abbilden 2022-08-18 10:55:49 +02:00
Werner Masik 7b95ca4b92 Merge remote-tracking branch 'origin/feature-19473/VUE_Filter_Navigation_Widgets' into feature-19001/VUE_ROUTER 2022-08-17 22:13:29 +02:00
Werner Masik a3c9d75617 added model for adressentyp 2022-08-16 13:10:20 +02:00
Paolo 7dd48b2350 Fixed meta includes 2022-08-16 10:57:32 +02:00
Paolo 492014db3a Changed variable names for includes 2022-08-16 10:28:13 +02:00
Harald Bamberger dd38765237 Merge branch 'feature-19538/Gruppenadministratoren' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-16 10:25:46 +02:00
Harald Bamberger dd6383c57b Merge branch 'master' into feature-19538/Gruppenadministratoren 2022-08-16 07:54:43 +02:00
Werner Masik 5ea46ece47 added VueRouter to composer; integrate router.php from extensions 2022-08-15 20:25:42 +02:00
Harald Bamberger 2e00f30e71 Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 16:07:39 +02:00
Harald Bamberger 083c360338 remove duplicate body tags 2022-08-11 16:05:15 +02:00
Cris 73c516cbed Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 14:59:39 +02:00
Cris 08b1047b09 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of https://github.com/FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 14:59:06 +02:00
Paolo 1103bb7aa1 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-11 14:47:31 +02:00
Paolo d95cbb39e3 Reverted bootstrap and jquery include order 2022-08-11 14:46:28 +02:00
ma0048 d7fb91371e added missing includes for infocenter 2022-08-11 14:34:32 +02:00
ma0048 979f8d96bc ermoeglicht das sperren der zutrittskarten 2022-08-11 14:29:56 +02:00
ma0048 f19e13ffd8 ermoeglicht das planen, akzeptieren und erstellen der massnahmen 2022-08-11 14:11:59 +02:00
Cris 6f1ca8e374 Removed unnecessary HTML body tags and added FHC_Footer
Body tags are set in FHC_Header and FHC_Footer.
2022-08-11 14:00:20 +02:00
Cris f85dd2fd2e Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-10 18:21:01 +02:00
Cris a5f6ffa237 Changed content in Student view as requested by QM
. changed tooltip text and help text regarding Maximale ECTS and Berufliche Praxis.
2022-08-10 18:19:50 +02:00
Cris c6aa3c7d9b Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-10 16:28:08 +02:00
Cris 4f435fbc20 Removed date limitation for testing 2022-08-10 16:26:36 +02:00
Cris fabdb70d72 Merge branch 'feature-18224/Anrechnungen_ECTS-Grenze' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-10 16:08:54 +02:00
Cris bfa9c2c8a7 Merge remote-tracking branch 'origin/feature-18224/Anrechnungen_ECTS-Grenze' into feature-18224/Anrechnungen_ECTS-Grenze 2022-08-10 16:01:42 +02:00
Cris 1d728336a2 Hided colums 'ECTS Schule bisher'/'ECTS Beruf bisher'
Hide by default colums 'ECTS Schule bisher'/'ECTS Beruf bisher',
as dynamic ECTS column is providing those informations.
2022-08-10 15:59:11 +02:00
Cris debfbf7827 Created AnrechnungJob sendMailRemindRecommendation
...to remind lecturers to provide their recommendation if not done until
one week after request.
2022-08-10 15:58:13 +02:00
Paolo e39bb1ea8a Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-09 18:43:06 +02:00
Harald Bamberger 7499a7f90a navigation component add option to pass css classes for left menu, verticalsplit add isCollapsed function, searchbar remove search button and prevent page reload on pressing enter 2022-08-09 17:12:47 +02:00
Cris c0ce8997ba Optimized Usability: Column 'Details' now on very left side of table
User needs to open details link very often, but needed to scroll until end of table to open link.
Now the link is set as first column to provide direct access.
2022-08-09 16:52:23 +02:00
Cris e56237038d Optimized 'Ablehnen'-/'Nicht empfehlen'-panels for better usability
- Copy-icons are now right aligned and bigger
- Less in-between-text, instead short explanation text into textarea placeholder
2022-08-09 16:40:43 +02:00
Cris 844bfe9150 Fixed wrong 'Bisher angerechnete ECTS' calculation when approving and withdrawing in one go 2022-08-09 11:10:16 +02:00
Harald Bamberger e63d34132c merged current master 2022-08-08 13:29:44 +02:00
Paolo 6d81e36e68 Merge branch 'master' into feature-19473/VUE_Filter_Navigation_Widgets 2022-08-08 12:11:08 +02:00
Paolo b912ca9a06 Navigation and Filter components code improvements 2022-08-08 10:31:30 +02:00
Manfred 602bd375c4 BugFix PHP 7.4 Milak 2022-08-04 17:32:03 +02:00
Manfred 7b0de6b3e1 BugFix PHP 4 Milak 2022-08-04 14:41:34 +02:00
ma0048 6fd50d3c8d letzter bearbeiter online satt studentenname 2022-08-04 13:26:15 +02:00
Cris fc94ea4b49 Fixed: Maximale Dokument Uploadgröße 2022-08-03 16:43:34 +02:00
Cris fac257a2b1 Corrected: Falsche ECTS Summenberechnung, wenn Genehmigung zurückgenommen wurde, korrigiert.
Zurückgenommene Anrechnungen haben noch einen Eintrag "angerechnet" in der Zeugnisnotentabelle, weshalb
sie in der ECTS Summenberechnung mitgerechnet wurden. Das ist nun behoben.
2022-08-03 16:40:58 +02:00
Cris bb8a2a97a5 Fixed: Unclickable URLs after approving Anrechnung are clickable now 2022-08-02 15:25:06 +02:00
Manfred e9c2bcd690 Merge remote-tracking branch 'origin/master' 2022-08-01 14:09:10 +02:00
Manfred 62700194dd Bugfix aktuelles Studiensemester 2022-08-01 14:09:00 +02:00
ma0048 1a6b645693 pausefehlt bei 6.5 stunden hinzugefuegt 2022-08-01 10:49:17 +02:00
KarpAlex 80e15b9448 studentenmeldung.php: added field "dualesstudium" 2022-07-27 18:51:59 +02:00
Cris bf3ed6e48e Corrected ECTS Summen Display in Detail View when Withdrawing
If STGL withdraws a former rejection, there is no need to substract the ECTS in "Bisher angerechnete ECTS".
This is needed only if STGL withdraws a former approvement.
2022-07-27 16:22:17 +02:00
Cris 952d5e51b2 Refactoring der Dynamischen Max-ECTS-Berechnungsspalte, Berechnungen stimmen nun auch nach einem Genehmigungs-Update 2022-07-27 16:03:24 +02:00
KarpAlex aafdc41af2 core BPKWartung: corrected comments, removed uid property 2022-07-27 14:26:26 +02:00
ma0048 937236933e zeigt alle RTs an 2022-07-27 10:52:46 +02:00
KarpAlex 0055243a64 DmsLib: replaced _writeFile function with _copyFile to copy all file in one go (php copy method) instead of reading blocks and writing them 2022-07-27 01:52:08 +02:00
Cris 94644b4403 Adapted: Hochschulqualifikation werden bei Berechnung der max ECTS Überschreitung ausgenommen
Anrechnung aufgrund von Hochschulqualifikationen sind ungeschränkt möglich.
2022-07-26 18:22:51 +02:00
Cris 7b9fd39bbc Added: Hochschul-Qualifikation + ECTS Anzeige in Student View
Checkbox zur Angabe von Hochschulqualifikation
Anzeige, wenn ECTS Grenzen überschritten werden.
2022-07-26 18:18:08 +02:00
Cris 6a43928322 Added: Display (Qualifikations-)Begruendung in STGL Anrechnungen Detail View 2022-07-26 18:14:23 +02:00
KarpAlex 8da4bbd14b studentenmeldung.php: removed TODO comment 2022-07-22 18:40:55 +02:00
ma0048 1ee0e8eeb9 verhindert das starten von fremden gebieten 2022-07-22 12:33:47 +02:00
KarpAlex 1b457bda83 check that getting last status of previous semester is successfull before setting Wiedereintrittsdatum and Unterbrechungsdatum 2022-07-20 18:47:31 +02:00
Cris 86d7f8a35e Code refactoring of Dynamic ECTS Summen
. now build with tabulators column formatter.
. rows are reinitialized instead of using the updateData.
. format of cell background-color has moved out from row formatter to cell formatter
2022-07-20 11:25:35 +02:00
KarpAlex 503fbd5bde bis studentenmeldung: Unterbrechungsdatum und Wiedereintrittsdatum gesetzt 2022-07-20 01:01:58 +02:00
Cris 760e5758ce Optimized performance of all 'Alle auswählen'-buttons defined via tableWidgetHook
...by passing an array of rows to be selected, instead of selecting each row one by one.
Further triggered functions, e.g. rowSelectionChanged, are now called once only, not for each row.
2022-07-19 17:50:37 +02:00
Cris 4ba1f2cef5 Changed: Dynamic ECTS Summen (LV ECTS Sum by Prestudent + former ECTS) now build with tabulators mutator and rowFormatter 2022-07-18 17:38:20 +02:00
Cris 1544653fa3 Added Begründungstext 'Max ECTS überschritten' als Ablehnungsgrund 2022-07-18 17:33:50 +02:00
Cris 3b1d0f3aaa Merged DB Model Int/Float conversion
+ query type cast adaptation
2022-07-18 17:33:20 +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
KarpAlex 1c457f7ab7 studentenmeldung:
- added fields MeldeStatus
- added field HerkunftslandCode for IO Container
- splitted Ausstellungsstaat in ZugangAusstellungsstaat and 
ZugangMaAusstellungsstaat
2022-07-18 00:39:37 +02:00
KarpAlex 055f52a0bd lehrgangsmeldung:
- added field orgform_kurzbz, meldestatus and GS-Block
- splitted Ausstellungsstaat into ZugangAusstellungsstaat and 
ZugangMaAusstellungsstaat
2022-07-18 00:37:27 +02:00
KarpAlex 043f444bb6 added tbl_bisio.herkunftsland_code in db and made it editable as IO data in FAS 2022-07-14 19:50:50 +02:00
Harald Bamberger a463fc0dbf Merge branch 'feature-18236/Standardisierung_Extension_OP-KVP' 2022-07-14 15:58:58 +02:00
Paolo 6b4b3bad6a Fixed application/libraries/FilterCmptLib->applyFilterFields, from arrays to objects 2022-07-14 11:47:28 +02:00
Paolo 267f5b2972 - Added new directory public/js/apps/LogsViewer/
- Moved public/js/apps/LogsViewer.js to public/js/apps/LogsViewer/
- Added new JS file public/js/apps/LogsViewer/TabulatorSetup.js to setup the tabulator in the LogsViewer app
- Added new property tabulatorEvents to the FilterCmpt to subscribe events for the tabulator
2022-07-14 11:28:06 +02:00
Manfred 9fa2f56c89 Grant SELECT to bis.tbl_gsprogramm for web-user 2022-07-14 10:37:25 +02:00
Manfred d569384e66 Merge remote-tracking branch 'origin/master' 2022-07-14 10:34:51 +02:00
Manfred c851cf9da2 Testkorrektur HR Services 2022-07-14 10:34:24 +02:00
Paolo de07d1f340 Switched FilterCmpt to tabulator 2022-07-13 18:57:55 +02:00
Paolo e433affcc3 - Fixed disappearing side menu when additional menu entries are provided by another component
- Fixed wrong parameter for removeFilterField call
2022-07-13 15:44:00 +02:00
KarpAlex 8a813e0a2c added "StudienkennungUni" to BIS XML studentenmeldung 2022-07-13 11:27:10 +02:00
ma0068 141986ca67 Zeitsperren als fixe Termine 2022-07-13 11:11:22 +02:00
Paolo 4dab69cb15 Reverted changes in application/models/person/Benutzer_model.php, pk => array 2022-07-13 09:45:58 +02:00
ma0068 12bff57e0b Erweiterung Coodle und Freebusy um Zeitsperren 2022-07-13 09:24:37 +02:00
KarpAlex f72c165fe6 added codex/Gsprogramm_model 2022-07-12 19:41:08 +02:00
KarpAlex 013def84e3 bis.tbl_gsprogramm: studienkennung_uni can be added and edited in vilesci 2022-07-12 18:16:09 +02:00
KarpAlex 17493a6e40 dbupdate: added bis.tbl_gsprogramm studienkennung_uni to check array 2022-07-12 16:37:18 +02:00
Paolo 8b8515ee03 Fixed typo in system/filtersupdate.php 2022-07-12 14:51:39 +02:00
Paolo 137af3ef71 Fixed typo 2022-07-12 14:10:47 +02:00
Paolo ae70dbcb64 Fixed includes of filter type in FilterCmptLib when it is declared in an extension 2022-07-12 14:09:17 +02:00
Paolo f7e057d7db Fixed identation public/js/components/filter/Filter.js 2022-07-12 13:02:16 +02:00
Paolo c400641754 Includes fixes twbs/bootstrap to twbs/bootstrap3 2022-07-12 12:46:19 +02:00
Paolo 6ce7068ead Includes fixes tinymce/tinymce to tinymce/tinymce4 2022-07-12 12:39:48 +02:00
Paolo 790f2bb130 Includes fixes jsoneditor to josdejong/jsoneditor 2022-07-12 12:34:30 +02:00
Paolo 3f07aa172c Includes fixes json-forms to brutusin/json-forms 2022-07-12 12:29:11 +02:00
Paolo 76db7bd53a Includes fixes jquery/jqueryV2 to jquery/jquery2 2022-07-12 12:18:35 +02:00
Paolo a780338367 Includes fixes components/font-awesome to fortawesome/font-awesome4 2022-07-12 12:16:48 +02:00
Paolo 946ccc33d5 Include fixes alvaro-prieto/colResizable to alvaro-prieto/colresizable 2022-07-12 12:11:09 +02:00
Paolo eb2b738133 Includes fixes: jquery/jqueryV1 to jquery/jquery1 2022-07-12 11:59:52 +02:00
Paolo abcb575ef0 Added swith to turn on/off the top menu of the navigation component 2022-07-12 11:02:56 +02:00
Werner Masik 8c8623ce4f change primary key to string instead of array
because it is not a composite key and the load method gets confused otherwise
2022-07-11 17:31:37 +02:00
Harald Bamberger 17322283f5 use searchresult property photo_url 2022-07-11 16:15:48 +02:00
Paolo 5896a75a44 Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-07-11 16:11:53 +02:00
Harald Bamberger 26eb77f030 change orgunit renderer to expect array of of objects for leaders 2022-07-11 16:10:28 +02:00
Paolo b53add9e67 libraries/SearchBarLib->_organisationunit removes from the leaders array those elements with uid and name == null 2022-07-11 16:10:24 +02:00
Paolo 198c6baf3d - Added new protected method getPostJSON to FHC_Controller to get POSTed JSON
- application/controllers/components/Filter.php now makes use of getPostJSON from the FHC_Controller
- RESTClient now POST a JSON request
- public/js/components/filter/Filter.js improvements
2022-07-11 14:54:14 +02:00
Cris 91447d7218 Adapted Query getEctsSummeSchulisch: exclude Anrechnung aufgrund universitärer Qualifikation.
Anrechnungen mit universiäterer Qualifikation sind unbegrenzt möglich.
2022-07-11 11:29:42 +02:00
Cris a8f329e501 Added new Anrechnungbegruendung: Hochschulzeugnis 2022-07-11 10:46:53 +02:00
Paolo cfe7c6b9a4 Fixed typo in application/libraries/FilterCmptLib.php, renamed __getDatasetQueryCondition to _getDatasetQueryCondition 2022-07-11 10:27:49 +02:00
Paolo aac21c9fda Updated composer.lock 2022-07-08 12:33:11 +02:00
Harald Bamberger 9d6d759fd0 current composer.lock for axios zip from github 2022-07-08 12:17:52 +02:00
Andreas Österreicher b2eb035613 Merge branch 'feature-20265/infocenter_check_duplicate_user' 2022-07-08 11:24:10 +02:00
Andreas Österreicher 21650a8782 Merge branch 'feature-19486/infocenter_nationengruppe_anzeigen' 2022-07-08 11:20:59 +02:00
Paolo b3caa4c0ac Bugfix: FilterWidget: query executed before changes are applied 2022-07-08 11:15:52 +02:00
KarpAlex cd7fed2b43 Added studienkennung_uni field to bis.tbl_gsprogramm 2022-07-08 00:33:44 +02:00
Paolo 8ab83a0baa Added directory "components" to the extension installation 2022-07-07 17:26:49 +02:00
Paolo 4e201f1002 Added slot in the header of the navigation component 2022-07-07 17:24:18 +02:00
Paolo 2f1d5f157f - Added new constant PHOTO_IMG_URL to application/libraries/SearchBarLib.php
- phone and photo_url are now return from SearchBarLib->_mitarbeiter
- SearchBarLib->_organisationunit fixed correct number of employees per organisation unit
- SearchBarLib->_organisationunit now returns the mailgroup
- SearchBarLib->_organisationunit returns an array of leaders, each element of this array is an object having the properties uid and name
2022-07-07 16:56:43 +02:00
ma0048 1434deeca1 zeigt die nation gruppe an 2022-07-07 11:29:38 +02:00
ma0048 377cb8ab7f ermoeglicht das loeschen der dokumente ueber das infocenter 2022-07-07 11:25:54 +02:00
Cris b2715bb408 Fixed: Added missing Summe ECTS Schulisch to AntragData. 2022-07-07 10:27:50 +02:00
Cris ade55c9d1f Added ECTS Summen to Anrechnung Detail View 2022-07-07 10:26:56 +02:00
Cris b40db6abbd Added ECTS Summen columns to Anrechnung Übersichtstable 2022-07-07 10:26:13 +02:00
Cris 4d05f54b54 Added ECTS Summen top AnrechnungData in the AnrechnungLib 2022-07-07 10:25:19 +02:00
Cris 2fb4118e69 Added to DB Update: Create functions to get total ECTS Summe by berufliche and schulische Qualifikation 2022-07-07 10:23:33 +02:00
Cris 1dc49ec494 Added methods to sum total ECTS, to be displayed on Anrechnung Details and Uebersicht 2022-07-07 10:21:23 +02:00
Cris 9d7589ddc4 Added DB methods to get ECTS Summen by schulische/berufliche Qualifikation 2022-07-07 10:18:40 +02:00
Werner Masik 647b2a9f45 added rudimentary filter for employee search 2022-07-06 18:02:31 +02:00
Werner Masik 39520d32fd added selectRecord event to filter component 2022-07-06 18:02:10 +02:00
Werner Masik f5df010884 added application/components/extensions/ to .gitignore 2022-07-06 17:52:13 +02:00
Werner Masik f7c394547e * fixed missing $primevue3 var in FHC-Common.php 2022-07-06 17:52:13 +02:00
Werner Masik 19273003ee * changed composer.json
* primvue is now included with help of https://asset-packagist.org/
* https://asset-packagist.org/ makes including npm packages with composer easy
2022-07-06 17:52:13 +02:00
Werner Masik 6c618c9a20 * changed some { to [ for PHP 7.4 compatibility
* added some PrimeVUE 3 components to composer (currently used in organization chart of PV21 extension)
2022-07-06 17:52:13 +02:00
Paolo 74b0fc5662 - Added new directory public/js/components/filter/
- Moved component public/js/components/Filter.js to public/js/components/filter/
- Moved API calls from public/js/components/filter/Filter.js to public/js/components/filter/API.js
- public/js/components/filter/Filter.js now imports public/js/components/filter/API.js
2022-07-06 16:59:33 +02:00
ma0068 fe6a6c5da3 neue Funktion getVorgesetzteMonatTimesheet() 2022-07-06 15:24:28 +02:00
Cris 44a3231d55 Merge branch 'master' into feature-18224/Anrechnungen_ECTS-Grenze
# Conflicts:
#	application/models/education/Lehrveranstaltung_model.php
2022-07-06 12:00:09 +02:00
Cris 72428d0587 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-07-06 11:54:48 +02:00
ma0048 acffebf515 check doppelte benutzer auch mit unterschiedlicher groß und kleinschreibung 2022-07-06 10:56:24 +02:00
Paolo ce9aa4c388 - Removed inlcudes of RESTClient from PHP (FHC-Common, FHC-Footer and views/system/logs/logsViewer)
- Changed RESTClient to be a JS module
- Now RESTClient is included via JS in the app LogsViewer and in component Navigation
- Added new directory public/js/components/navigation
- Moved component Navigation to public/js/components/navigation
- Moved API calls of the Navigation component to public/js/components/navigation/API.js
- Navigation component now imports public/js/components/navigation/API.js
2022-07-06 09:48:15 +02:00
Manfred 759a2b4c8a Merge remote-tracking branch 'origin/master' 2022-07-05 15:33:22 +02:00
Manfred e7587a9f00 Rechtecheck im Skript studienplan_vorrueckung auf lehre/studienplan 2022-07-05 15:33:17 +02:00
Manfred afb9bec9ba Zugangscode ausblenden, wenn Bewerbungstool-Addon nicht aktiv 2022-07-05 15:32:29 +02:00
Paolo 2927682dae Merge branch 'feature-19473/VUE_Filter_Navigation_Widgets' of github.com:FH-Complete/FHC-Core into feature-19473/VUE_Filter_Navigation_Widgets 2022-07-04 19:30:18 +02:00
Paolo 60b3be3d64 - Added new JS public/js/RESTClient.js as axios wrapper
- composer.json: added axios from github
- Added new directory application/components/extensions/
- Added new utility function findResource to application/helpers/hlp_common_helper.php
- Now the library libraries/FilterCmptLib loads the component definition php files from the extensions
- views/system/logs/logsViewer now includes axios and restclient, removed the includes for ajaxlib and jQueryUI
- Added includes for the RESTClient and axios to views/templates/FHC-Common and views/templates/FHC-Footer
- Improved component js/components/Fetch
- Components public/js/components/Filter.js and public/js/components/Navigation.js now they are making use of the Fetch component or/and the RESTClient
2022-07-04 19:25:16 +02:00
Andreas Österreicher 1d980274fe Merge branch 'feature-19651/OEH_Beitragsliste' 2022-07-04 16:27:26 +02:00
Harald Bamberger 5c94e33f24 render array properties correct, resize result on window resize, hide result on loosing focus 2022-07-02 13:26:18 +02:00
Andreas Österreicher ac231722f1 Problem behoben wodruch Fehlermeldungen nicht korrekt angezeigt wurden
in der Zeitaufzeichnung
2022-07-01 14:31:39 +02:00
Andreas Österreicher 1641a879af PHP Version Compatibility fixed 2022-07-01 09:04:52 +02:00
KarpAlex 6341246550 Gruppenmanagement vilesci:
- changed description of manager input field
- error messsages are displayed in red color
2022-06-30 15:48:32 +02:00
ma0068 2e4085c8de Validierung bei Löschen zeitaufzeichnungsrelevanter Zeitsperren und bereits abgeschickter Monatsliste 2022-06-30 14:22:29 +02:00
KarpAlex 9262dc6197 added Gruppenmanagement navigation menu entry to Persons category 2022-06-30 14:22:12 +02:00
Andreas Österreicher dd66e9d119 Merge branch 'feature-19766/Issues_Studiengang_der_Person_anzeigen' 2022-06-30 12:35:22 +02:00
ma0068 35426251cb Delete Testausgabe 2022-06-30 11:42:14 +02:00
KarpAlex f74e036ec8 moved Berechtigung "extension/dvuh_gui_ekz_anfordern" to DVUH extension SQL 2022-06-30 11:27:24 +02:00
ma0068 cf7ad022a7 Sancho Mail im Urlaubstool, neue Funktion checkActiveAddon 2022-06-30 10:51:02 +02:00
KarpAlex 1c3acc6366 issue overview: added column "Zugehörigkeit"(Belonging) to show study programs of concerning person and wether it is an employee 2022-06-29 17:59:57 +02:00
ma0068 60cbb8bd8c Einfügen Spalte Status Monatsliste, Verhindern bei Löschen von ZA wenn Monatsliste abgeschickt 2022-06-29 15:01:16 +02:00
Harald Bamberger 32daed2ad2 first draft data fetch component 2022-06-29 13:17:57 +02:00
Paolo f85225cc4e Addex axios to the views/templates/ includes 2022-06-29 10:58:33 +02:00
Paolo 091307680b - Sorted composer packages in composer.json
- New composer.lock generated
- Added new package axios
2022-06-29 10:57:08 +02:00
Paolo 796c09999f Changed FilterCmptLib public methods to private where they were not used outside the library itself 2022-06-29 10:55:30 +02:00
ma0068 ad30cc862e Neue Spalte Status Monatsliste 2022-06-29 10:53:45 +02:00
ma0068 797cabccb9 neue Mailvorlagen Sancho fuer Zeitausgleich und Urlaub 2022-06-29 08:46:01 +02:00
KarpAlex 500bbec2c1 added "hasSequence" = false to crm/Dokumentprestudent_model to avoid "lastval not found" error 2022-06-28 19:07:09 +02:00
Andreas Österreicher eeba5c7bd5 Merge branch 'feature-18887/Datenverbund_Clearing_und_Community_Changes' 2022-06-28 14:28:04 +02:00
Paolo bcaa560a46 Bugfix: query executed before changes are applied 2022-06-28 10:29:44 +02:00
Paolo 2a298dc6d1 - Added JSON post parameter check in controllers/components/SearchBar->search
- Expanded search capabilities for organization units and employees
2022-06-27 16:22:40 +02:00
Andreas Österreicher 2692accbdf Merge branch 'master' into feature-18887/Datenverbund_Clearing_und_Community_Changes 2022-06-27 14:48:11 +02:00
Harald Bamberger 47f7c03075 virtualsplit and searchbar vue component, TestSearch Controller and View for Demonstration, minor change to SearchBar Controller to work with posted json 2022-06-24 19:26:37 +02:00
Paolo 147ab92bae - Added new library libraries/SearchBarLib
- Added new controller components/SearchBar
- Removed not anymore used view application/views/system/logs/logsViewerData.php
2022-06-24 17:59:01 +02:00
Paolo 24b78454d3 - Added new function generateJSModulesInclude to application/helpers/hlp_header_helper.php
- Added entry "customJSModules" to the application/views/templates/FHC-Footer.php to be passed to the generateJSModulesInclude function to generate JS modules tags
- The new VUE components are making use of the JS import and export functionalities
2022-06-24 15:07:50 +02:00
Paolo 9e48ba09d8 - Moved GUI options from application/components/filters/LogsViewer.php to application/views/system/logs/logsViewer.php
- Changed controller components/Filter to work with the new FilterComponent
- Removed unused code from library libraries/FilterCmptLib
- Changed library libraries/FilterCmptLib to work with the new changes in the controller components/Filter
- Added new CSSs for the new FilterComponent and NavigationComponent
2022-06-24 14:55:04 +02:00
Manfred f0df99c46a Merge remote-tracking branch 'origin/master' 2022-06-24 14:29:35 +02:00
Manfred fcf829d03b Button "Liste ausräumen" ergänzt
Löscht leere (unbenutzte) Prüflinge
2022-06-24 14:29:08 +02:00
ma0068 c87aee0ddf Zeitsperre Umbau Mail auf Sanchomail, Anzeige Zeitsaldo in Sanchomail, Adpatierungen Urlaub 2022-06-24 08:10:51 +02:00
Cris 5f5031e8d1 Added ECTS Summe to Anrechnung Detail View. 2022-06-22 10:54:17 +02:00
Cris 7bba155bb5 Adapted function getPreviousFrom to return more than 1 previous semester if needed 2022-06-22 10:52:51 +02:00
Cris b52a3c9397 Added DB queries to calculate ECTS Summe in Lehrveranstaltung_model.php 2022-06-22 10:51:39 +02:00
Cris 12c9afbd3d Added function getFirstStatus to Prestudentstatus_model.php
Funktion liefert den Ersten Status eines Prestudenten mit der übergebenen Statuskurzbezeichnung.
2022-06-22 10:48:48 +02:00
Cris 42fb7a4fc8 Added ECTS Summe functions to AnrechnungLib
Added functions to calculate total ECTS Summe of
. angerechnete Studiensemester of Quereinsteiger
. bisher angerechnete schulische Kenntnisse
. bisher angerechente berufliche Kenntisse
2022-06-22 10:47:29 +02:00
cgfhtw 65ba946321 Rework Studienplan->getStudienplanLehrveranstaltung for Templates & use it in Vilesci "Lehrveranstaltung" 2022-06-22 09:39:53 +02:00
KarpAlex ca667feb0d Added document type "Grant Agreement" for syncing of documents with Mobility Online 2022-06-20 18:55:29 +02:00
KarpAlex 40efdf4acf Merge branch 'feature-19538/Gruppenadministratoren' of github.com:FH-Complete/FHC-Core into feature-19538/Gruppenadministratoren 2022-06-20 18:42:35 +02:00
KarpAlex accef23cb8 Gruppenmanagent: correct table cell size when adding/deleting managers and when there are no managers 2022-06-20 18:38:49 +02:00
Andreas Österreicher cfea30162c Merge branch 'feature-19839/rt_freigegeben_liste_uhrzeit_des_rts_anzeigen' 2022-06-20 12:32:41 +02:00
KarpAlex 95f1d87878 melde_studienang_kz can be edited in vilesci 2022-06-15 23:15:23 +02:00
KarpAlex f631cda7a5 Gruppenmanagement: added uid as insertvon when adding Gruppe 2022-06-15 22:53:37 +02:00
KarpAlex dc45427143 gruppenmanagement: renamed variable gruppemanager_class into gruppemanager_hlp 2022-06-15 22:52:37 +02:00
KarpAlex c771cbc644 Gruppenmanagement: added phrases 2022-06-14 18:24:10 +02:00
KarpAlex de08bfd0fc Gruppenmanagement:
- renamed gruppenadministration to gruppenmanagement
- added additional columns to gruppenmanagement filterwidget
- improved comments
- write public.tbl_log every time user is added or deleted from a group
2022-06-14 17:30:07 +02:00
Harald Bamberger 5c65b78a62 Merge branch 'bug-19556/Wrong_LV_Id_on_Template_copy' 2022-06-14 16:27:05 +02:00
KarpAlex 1066dff8e0 Gruppenmanager:
- set on update cascade for gruppe_kurzbz foreign key
- Notice + disabling add of group managers when group is "generiert"
2022-06-14 14:08:27 +02:00
ma0048 5731a98127 uhrzeit bei der rt freigegeben uebersicht hinzugefuegt 2022-06-14 10:29:20 +02:00
cgfhtw e83b1a6ee9 Bugfix: Wrong LV Id on Template copy 2022-06-14 09:11:04 +02:00
KarpAlex 2e728462ca Gruppenmanager:
- Berechtigung "lehre/gruppemanager" needed for managing groups
- added column "aktiv" to benutzeroverview
- group manager are deleted together with their group
- check: generated groups cannot have manager
2022-06-13 19:59:30 +02:00
Harald Bamberger aa8452682d fix error undefined variable 2022-06-13 15:31:40 +02:00
Harald Bamberger 2a95aa3abd Merge branch 'master' of github.com:FH-Complete/FHC-Core 2022-06-13 15:08:56 +02:00
Manfred 8304808127 Beim Zusammenlegen von Personen wird in der Anmerkung "von" ergänzt 2022-06-13 14:18:20 +02:00
Manfred 0f236b1da8 Merge remote-tracking branch 'origin/master' 2022-06-13 12:50:37 +02:00
Manfred 42275f2af1 Bugfix LV-Teile kopieren. Vertrag_id wird nicht mehr kopiert 2022-06-13 12:50:32 +02:00
KarpAlex f57123e100 Gruppenadministration Benutzergruppen:
- changed phrases
- show error dialog when json error returned
- zebra table
- hide filter header for non-filtered columns
- empty input field after adding Benutzer
2022-06-13 12:01:00 +02:00
Harald Bamberger c90fd7d120 Merge branch 'feature-18233-18234/Standardisierung' 2022-06-13 10:27:12 +02:00
Harald Bamberger 47843423d0 add column lehrveranstaltung_template_id to gegenpruefung 2022-06-13 10:19:26 +02:00
Harald Bamberger ec19d2e045 Merge master 2022-06-13 09:57:51 +02:00
KarpAlex 5bc57767d1 Gruppenadministration: - added delete functionality - Benutzer per group are retrieved via javascript and refreshed when group added/delted - moved gruppenadministration files to person folder from organisation - handle error when benutzer was already assigned to a group 2022-06-10 22:01:48 +02:00
KarpAlex 83351e7329 Manager Gruppenadministration:
first version of adding Benutzer to Gruppe
2022-06-09 20:05:46 +02:00
KarpAlex d2fea1ac6f Merge branch 'master' into feature-19538/Gruppenadministratoren 2022-06-09 17:27:07 +02:00
Andreas Österreicher a21ad7bbc7 Merge branch 'feature-19020/Checks_bei_Statusaenderungen' 2022-06-09 14:56:27 +02:00
Andreas Österreicher 2faa649cf3 Löschen von Statuseinträgen auch mit Berechtigung
student/keine_studstatuspruefung ermöglicht
2022-06-09 14:55:15 +02:00
KarpAlex 457ab9dc3e Gruppenadministration: first version of list with Gruppen of a manager. 2022-06-08 19:49:30 +02:00
Andreas Österreicher 9d769bbc16 Merge branch 'feature-18473/UrlaubstoolKeinEintragBeiVorhandenerZeitaufzeichnung' 2022-06-08 14:51:17 +02:00
Andreas Österreicher 25ee7f76cb Merge branch 'feature-18188/Issues_GUI_zum_Pflegen_der_Fehlerzustaendigkeiten' 2022-06-08 14:10:28 +02:00
Andreas Österreicher 90e760a9ff Merge branch 'feature-19351/infocenter_vorhandene_benutzer' 2022-06-08 14:03:45 +02:00
Andreas Österreicher ab408958b7 Merge branch 'Sprint-186/Sonstiges' 2022-06-08 13:34:20 +02:00
Nikolaus Krondraf c7df848d9d consider OE when generating document 2022-06-08 13:16:46 +02:00
Andreas Österreicher 9a1d4bf54d Merge branch 'master' of github.com:FH-Complete/FHC-Core 2022-06-08 13:10:30 +02:00
Andreas Österreicher 71fa8cb355 Merge branch 'bug-19149/Reihungstest_Sprache_Prio' 2022-06-08 13:09:38 +02:00
Nikolaus Krondraf 734fa31111 consider OE when generating document 2022-06-08 13:08:20 +02:00
cgfhtw 2c932f3d86 Bugfix 2022-06-08 10:30:07 +02:00
Andreas Österreicher 0ee1f3723b Räume mit Raumtyp Gesperrt werden am Infoterminal als besetzt/gesperrt
angezeigt
2022-06-08 08:39:53 +02:00
Andreas Österreicher e89a55b73f Removed unused WYSIWYG Editor 2022-06-08 07:09:04 +02:00
KarpAlex c547fd86a7 replaced Berechtigung dvuh_gui_begrenz with dvuh_gui_ekz_anfordern for requesting ekz only 2022-06-07 18:31:43 +02:00
KarpAlex 549396148d Gruppenmanager can be added and deleted in vilesci gui 2022-06-07 17:54:05 +02:00
Paolo 618a62425b Adapted composer.json and includes to be compatible to composer version 2 2022-06-07 14:56:33 +02:00
ma0068 e2b3dbda7b Suche Cis: Wahlname vor Vorname, kein Hinweis auf Wahlname 2022-06-02 14:07:58 +02:00
Manfred 37af8ea331 Gesamtzeilenanzahl wird im FAS immer angezeigt X/Y 2022-06-02 12:55:25 +02:00
Manfred f2defe2c22 BugFix FAS-Filter Anzahl Reihungstest nicht angemedet
Ergänzung um Studiensemester
2022-06-02 12:31:23 +02:00
Paolo f3fe3aa099 New changes for the Navigation and Filter components 2022-06-02 10:34:45 +02:00
Paolo 29002124cc - Added new controller components/Filter.php
- Added new library FilterCmptLib
- Fixed includes paths in FHC-Footer and FHC-Header
- Moved the LogsViewer tool to VUE+BS5
2022-06-02 10:32:26 +02:00
Manfred 3803c72a97 Merge remote-tracking branch 'origin/master' 2022-05-31 18:03:16 +02:00
Manfred 20c71e1788 Logo statt Fehlermeldung am Informationsbildschirm 2022-05-31 18:03:12 +02:00
Manfred ed08dde5a6 Projektarbeit ID anzeigen um leichter rauskopieren zu können 2022-05-31 18:02:29 +02:00
Manfred 1019d42c73 SQL-Korrektur 2022-05-31 17:54:42 +02:00
Manfred bde469f4b8 Abfrage Brandschutzbeauftragte geändert. FHTW Übergangslösung entfernt 2022-05-31 17:54:23 +02:00
KarpAlex 0cb303c242 added table public.tbl_gruppe_manager for adding managers to groups 2022-05-31 14:59:05 +02:00
ma0068 956e3804bc Merge branch 'feature-19171/Wahlname' of github.com:FH-Complete/FHC-Core into feature-19171/Wahlname 2022-05-31 09:31:57 +02:00
ma0068 3f17c51834 Wahlname bei Suche in Spalte Vorname 2022-05-31 09:31:29 +02:00
Andreas Österreicher f4988f8211 Zeitwuensche Update Mail wird temporär nicht an Studiengänge geschickt 2022-05-30 17:09:11 +02:00
Andreas Österreicher 84ff29ffd2 Merge branch 'feature-16370/AkteLib_create_new_CI_library_to_handle_akte' 2022-05-30 16:08:54 +02:00
KarpAlex 6aa4d4d719 added extension/dvuh_gui_begrenzt Berechtigung for limited functionality access in DVUH GUI 2022-05-30 11:37:59 +02:00
Andreas Österreicher 974791e19b Ausbildungssemester Limitiert damit bei Wiederholern die anzeige
funktioniert
2022-05-27 14:23:24 +02:00
Andreas Österreicher ac91d8ccbc Merge branch 'master' into feature-16370/AkteLib_create_new_CI_library_to_handle_akte 2022-05-27 14:18:30 +02:00
Andreas Österreicher df321c4047 Merge branch 'master' into feature-19171/Wahlname 2022-05-27 13:30:19 +02:00
Andreas Österreicher 0c33ad4a7a Warning bei Fotoliste behoben wenn kein Lektor zugeteilt ist 2022-05-27 13:20:56 +02:00
Andreas Österreicher 95d43753c2 Merge branch 'feature-18486/reihungstest_stoppen_fuer_einzelne_personen' 2022-05-27 11:33:13 +02:00
Andreas Österreicher 99db3ab9f6 Merge branch 'master' into feature-18486/reihungstest_stoppen_fuer_einzelne_personen 2022-05-27 11:01:30 +02:00
KarpAlex dc47a2ffc9 added permission student/keine_studstatuspruefung to enable non-admins to bypass studstatus checks 2022-05-24 18:38:44 +02:00
ma0048 3d3f4d5453 erste version infocenter lehrgaenge 2022-05-24 13:51:39 +02:00
Paolo 061780a0d2 - Added new VUE based JS public/js/components/Filter.js, public/js/components/Navigation.js and public/js/apps/LogsViewer.js
- Fixed bootstrap includes in FHC-Footer and FHC-Header
- Moved Job Logs Viewer to VUE
2022-05-24 09:45:31 +02:00
KarpAlex d7708e2f6c Statusänderungen check studentDBDML.php: improved way of checking status by saving status in array first 2022-05-23 18:53:16 +02:00
Paolo a603081544 - Changed composer.json and updated composer.lock
- Added new PostgreSQL types in application/core/DB_Model.php
- Updated the includes in application/views/*
- Added new view template application/views/templates/FHC-Common.php
- Moved JS includes in application/views/templates/FHC-Footer.php
- Updated JS and CSS includes in application/views/templates/FHC-Footer.php and application/views/templates/FHC-Header.php
- Updated public/js/bootstrapper.js
- Changed global variable names in application/views/templates/FHC-Common.php to include the version of the included source
2022-05-23 18:45:29 +02:00
Andreas Österreicher a73d2a06e8 Merge branch 'bug-19281/Bewerbungen01011970' 2022-05-23 17:54:15 +02:00
Andreas Österreicher 69c30ab39d Merge branch 'bug-19529/Projektarbeituebersicht' 2022-05-23 17:17:03 +02:00
Andreas Österreicher 0a8c7aa032 Problem behoben wodurch die Prüfung auf doppelte Zahlungen bei Personen
nicht funktionierte die noch keine Studierenden sind
2022-05-23 17:01:15 +02:00
Andreas Österreicher 3b1aba63b0 Neue Berechtigung für Verwaltung eigener Variablen hinzugefügt, Filter
für Projektabgabeuebersicht angepasst
2022-05-21 12:10:42 +02:00
ma0068 1871dcc332 Umstellung Job RTRemindsApplicants von Sancho Mail auf OneTimemessage, Korrektur return Arrayobject Messages 2022-05-20 16:38:13 +02:00
Cris 9a57b263d1 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-05-17 16:33:07 +02:00
Paolo 3d0bdcf95a Changed composer.json and updated composer.lock 2022-05-17 16:05:02 +02:00
ma0068 ba8543716c Erweiterung Gesamtnotenimport um student_uid 2022-05-17 13:24:49 +02:00
ma0068 8b061eab74 Adaptierungen FAS für Ergänzung Wahlname + Hinzufügen Zeitstempel kontakt.xul.php für Mitarbeiter 2022-05-16 09:17:31 +02:00
Manfred 71848c5bfc Merge remote-tracking branch 'origin/master' 2022-05-11 16:41:34 +02:00
Manfred 4b3163b67d Anpassung der Breite der Inputfelder 2022-05-11 16:41:31 +02:00
Manfred a9ca16dddc Beim Zusammenlegen von Personen werden beide Anmerkungen erhalten
Außerdem wird eine Info über das Zusammenlegen in der Anmerkung ergänzt
2022-05-11 16:41:14 +02:00
ma0048 fdce499f37 prueft auf doppelte benutzer 2022-05-11 11:31:52 +02:00
ma0068 84bc73f948 Anzeige Wahlname statt Vorname in Noten-,Anwesenheits und Fotoliste, Berücksichtigung in Cis-Suche 2022-05-11 11:18:01 +02:00
Paolo 704b32c76c Fixed constant values in application/libraries/DocsboxLib.php 2022-05-11 11:06:53 +02:00
KarpAlex f2e337b179 FAS prestudent status: added checks when adding or modifiying status, including status and status date checks 2022-05-11 04:36:23 +02:00
Cris a654cbe583 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-05-10 10:34:07 +02:00
Cris 90c5ec53bf Lehrauftragsmail an KF-Leitung: Bei Berechtigungsabfrage wird nun auch Lese-/Schreibrecht berücksichtigt 2022-05-10 10:33:00 +02:00
Cris 455dd4b8ff Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-05-09 10:38:54 +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
KarpAlex 707c8a3a6a dbupdate_3.3.php: field melde_studiengang_kz in tbl_studiengang is prefilled correctly 2022-05-02 18:12:29 +02:00
Andreas Österreicher fddc0068e4 Fixed wrong RegEx on Date Check 2022-04-29 12:49:16 +02:00
Harald Bamberger d89fba33e8 Merge branch 'feature-18234/Standardisierung_Studiengangsverwaltungstool_Template_verwenden' into feature-18233-18234/Standardisierung 2022-04-29 11:06:54 +02:00
Harald Bamberger a493ddd68e merge feature 18233 2022-04-29 11:04:32 +02:00
Andreas Österreicher a055a695e3 Merge branch 'master' into feature-18473/UrlaubstoolKeinEintragBeiVorhandenerZeitaufzeichnung 2022-04-29 10:58:06 +02:00
Andreas Österreicher b7b6cd5399 Merge branch 'master' into feature-18188/Issues_GUI_zum_Pflegen_der_Fehlerzustaendigkeiten 2022-04-28 18:26:18 +02:00
ma0068 b6cc084799 Adaptierung Funktion getLastBisZAPflicht() 2022-04-28 11:46:45 +02:00
ma0068 9e094f38d5 Erweiterung der Validierung um ganztägige Zeitsperren 2022-04-28 11:08:39 +02:00
cgfhtw 63142f58d5 admin templates - & error phrases 2022-04-28 08:56:38 +02:00
ma0068 9bf20dd7a4 neue Funktion: getLastVerwendungZapflicht 2022-04-28 07:54:43 +02:00
ma0048 398c04d0ac sperrt alle prestudents von der person 2022-04-27 08:13:56 +02:00
cgfhtw 899e2e18df 18775 - Admin GUI f. Tabelle extension.tbl_opkvp_organisationseinheit_opprj 2022-04-21 15:29:16 +02:00
KarpAlex 5522d97afe issuesZustaendigkeiten.js: fixed comments 2022-04-15 23:47:16 +02:00
KarpAlex 3f40622af3 bugfixes issues Zuständigkeiten GUI:
- all needed oe kurzbz are shown at any time for assignment
- funktion can only be entered after oe
2022-04-15 21:15:19 +02:00
KarpAlex 087006a7a5 bugfixes issues Zuständigkeiten GUI:
- all needed oe kurzbz are shown at any time for assignment
- only functions not already assigned are shown
- funktion can only be entered after oe
2022-04-15 21:14:42 +02:00
cgfhtw 48333f62f0 autocomplete redesign & template field placement 2022-04-14 15:07:44 +02:00
Paolo 5a00ae5a5e Removed not use constant DEFAULT_USER from libraries/AkteLib.php 2022-04-14 10:21:17 +02:00
KarpAlex 4fe562cbe2 Fehlerzuständigkeiten and issues GUI improvements:
- menu link opens in new tab
- controller id set for easier refresh
- added person and oe Zuständigkeiten to issues list
-
2022-04-13 20:08:08 +02:00
Paolo d1b487e91a - Removed authentication functions from AkteLib and DmsLib
- Added new optional parameter who to write in the database who added the new document
- PHPMD optimizations
2022-04-13 13:22:16 +02:00
ma0048 7c6adaabeb rt stoppen fuer einzelene personen 2022-04-13 11:43:25 +02:00
KarpAlex 3804cce361 studentenmeldung.php: export for all Studiengänge: ausserordentliche Studierende are also included if their Studiengang is melderelevant 2022-04-12 18:34:06 +02:00
ma0068 d5225da80c Kein Eintrag Urlaubstool bei vorhandener Zeitaufzeichnung 2022-04-12 16:48:22 +02:00
KarpAlex 1f13c352a6 Issues.php: moved variable declaration out of if clause (phpcs issue) 2022-04-12 12:04:13 +02:00
Paolo d3c30af9f7 Merge branch 'master' into feature-15029/Docsbox 2022-04-11 20:14:26 +02:00
KarpAlex 0344904631 AkteLib.php, DmsLib.php coding style fixes:
- splitted too long parameter lines
- method call closing parenthesis on new line
2022-04-11 10:57:08 +02:00
KarpAlex 9e8e8c98c8 checksystem: added column melde_studiengang_kz for tbl_studiengang 2022-04-11 10:23:45 +02:00
KarpAlex b6d61c510d checksystem: added columns insertamum and insertvon to system.tbl_fehler_zustaendigkeiten check array 2022-04-09 19:11:42 +02:00
KarpAlex f2ec48682b Fehler Zuständigkeiten assignment page improvements:
- added the page to navigation
- added organisationseinheiten type to oe dropdown
- correct order of oe and funktion dropdown entries
- bugfix: delete button was not shown when german language
- mitarbeiter autocomplete search also works for "vorname nachname" form
2022-04-09 18:32:47 +02:00
KarpAlex df3cab593c fehlerzustaendigkeit phrase "zuweisen" was incorrectly defined 2022-04-07 12:40:46 +02:00
KarpAlex dcf00b04ce Fehler Zuständigkeiten GUI: removed double row for fehlertyp in fehler info modal 2022-03-31 17:47:20 +02:00
KarpAlex 427a75b74b added GUI for managing Issues Zuständigkeiten 2022-03-31 12:41:18 +02:00
Cris ad77c233e4 Merge branch 'master' of https://github.com/FH-Complete/FHC-Core 2022-03-31 10:00:18 +02:00
ma0068 6d1c926ec0 Anzeige AllinSaldo in Zeitaufzeichnung 2022-03-29 13:56:00 +02:00
cgfhtw 1445876955 Copy Template on save 'tbl_studienplan_lehrveranstaltung' 2022-03-28 16:32:52 +02:00
cgfhtw 56079a3674 phrasesupdate 2022-03-28 11:32:32 +02:00
cgfhtw d5d6432f14 modified model added db entry for lehrtyp added db col for template modified vilesci and added webservicerights for autocomplete 2022-03-23 15:54:44 +01:00
cgfhtw 1197f051a2 kvp phrases 2022-03-17 16:20:54 +01:00
Paolo e50cc27a89 Fixed exec second parameter value 2022-03-04 20:13:03 +01:00
Paolo db49f2b1e7 - libraries/DocsboxLib:
- Added new constant DEFAULT_FORMAT
	- ERROR and SUCCESS constant values are the same of EXIT_ERROR
	  and EXIT_SUCCESS
	- public method convert parameter format does not have a default
	  value anymore
	- Added use import of ZipArchive
- libraries/DocumentLib: removed unused variables
2022-03-04 19:47:32 +01:00
Paolo 18d06c6e0c Added commento to an echo in the application/core/FHC_Controller.php
because it is not possible to replace the echo
2022-02-02 11:52:08 +01:00
KarpAlex 40493936c3 - AkteLib: added optional params "archiv", "signiert", "stud_selfservice", removed "uid"
- AkteLib and DmsLib: added comments, added fallback default user for insertvon
- FS_Model: added TempFS_model.php for writing temp files, added comments
2021-12-17 18:03:34 +01:00
KarpAlex 8c2af28595 added AkteLib for adding, updating and deleting akte together with DMS documents 2021-12-14 06:26:20 +01:00
KarpAlex d6fb714b21 - added methods in dmslib for adding and removing files and file versions
- FS_Model: added remove method
2021-12-13 10:04:15 +01:00
Paolo 9b1182405e - core/FHC_Controller->outputFile cleaned
- Adapted controllers/lehre/anrechnung/* to make use of the changed core/FHC_Controller->outputFile
- Changed application/core/FS_Model:
	- It's not abstract anymore
	- Added new constants READ_MODE, READ_WRITE_MODE, READ_APPEND_MODE, BLOCK_SIZE, META_URI
	- Constructor accept a mandatory parameter
	- Does not load the FilesystemLib anymore
	- Renamed all the public methods with the suffix Base64
	- Added new public methods openRead, openReadWrite, openReadAppend, close, readBlock and write
	- Added new private methods _checkPath and _open
- Removed the libraries/FilesystemLib
- Adapted model content/DmsFS_model to make use of the changed core/FS_Model
- Changed libraries/DmsLib:
	- Does not extend the FHC_Controller anymore
	- removed private propery UPLOAD_PATH
	- Cleaned code, make use of the standards
	- Adapted to use the Base64 suffixed methods from core/FS_Model
	- Deprecated old methods
	- Refactored public methods download and getFileInfo
2021-12-03 15:56:39 +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
ma0068 23f335e6a5 BT: Ausbildungsvertrag wird bei Abgewiesenen bei nicht vorhandener offener Bewerbung nicht mehr angezeigt 2021-10-04 12:00:51 +02:00
1116 changed files with 29694 additions and 100930 deletions
+1
View File
@@ -24,6 +24,7 @@ application/logs/
application/models/extensions/
application/views/extensions/
application/widgets/extensions/
application/components/extensions/
public/extensions/
@@ -0,0 +1,19 @@
<?php
$filterCmptArray = array(
'app' => 'core',
'datasetName' => 'logs',
//'filterKurzbz' => 'jobs48hours', // REMOVE ME
'query' => '
SELECT wsl.webservicelog_id AS "LogId",
wsl.request_id AS "RequestId",
wsl.execute_time AS "ExecutionTime",
wsl.execute_user AS "ExecutedBy",
wsl.beschreibung AS "Description",
wsl.request_data AS "Data",
wsl.webservicetyp_kurzbz AS "WebserviceType"
FROM system.tbl_webservicelog wsl
ORDER BY wsl.execute_time DESC
',
'requiredPermissions' => 'admin'
);
+2 -2
View File
@@ -7,8 +7,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
$config['interval_blocking_application'] = 'P1M';
// Application submission period given by start- and enddate.
$config['submit_application_start'] = '01.02.2021';
$config['submit_application_end'] = '22.02.2021';
$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(
+29 -28
View File
@@ -10,26 +10,26 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
| Used to indicate the conditions under which the script is exit()ing.
|
*/
define('EXIT_SUCCESS', 0); // no errors
define('EXIT_ERROR', 1); // generic error
define('EXIT_MODEL', 2); // model error
define('EXIT_CONFIG', 3); // configuration error
define('EXIT_UNKNOWN_FILE', 4); // file not found
define('EXIT_UNKNOWN_CLASS', 5); // unknown class
define('EXIT_UNKNOWN_METHOD', 6); // unknown class method
define('EXIT_USER_INPUT', 7); // invalid user input
define('EXIT_DATABASE', 8); // database error
define('EXIT_VALIDATION_UDF', 10); // UDF validation has been failed
define('EXIT_SUCCESS', 0); // no errors
define('EXIT_ERROR', 1); // generic error
define('EXIT_MODEL', 2); // model error
define('EXIT_CONFIG', 3); // configuration error
define('EXIT_UNKNOWN_FILE', 4); // file not found
define('EXIT_UNKNOWN_CLASS', 5); // unknown class
define('EXIT_UNKNOWN_METHOD', 6); // unknown class method
define('EXIT_USER_INPUT', 7); // invalid user input
define('EXIT_DATABASE', 8); // database error
define('EXIT_VALIDATION_UDF', 10); // UDF validation has been failed
define('EXIT_VALIDATION_UDF_MIN_VALUE', 11); // UDF validation has been failed -> MIN VALUE
define('EXIT_VALIDATION_UDF_MAX_VALUE', 12); // UDF validation has been failed -> MAX VALUE
define('EXIT_VALIDATION_UDF_MIN_LENGTH', 13); // UDF validation has been failed -> MIN LENGTH
define('EXIT_VALIDATION_UDF_MAX_LENGTH', 14); // UDF validation has been failed -> MAX LENGTH
define('EXIT_VALIDATION_UDF_REGEX', 15); // UDF validation has been failed -> REGEX
define('EXIT_VALIDATION_UDF_REGEX', 15); // UDF validation has been failed -> REGEX
define('EXIT_VALIDATION_UDF_REQUIRED', 16); // UDF validation has been failed -> REQUIRED
define('EXIT_VALIDATION_UDF_NOT_VALID_VAL', 17); // UDF validation has been failed -> Not valid value, object or array
define('EXIT_AUTO_MIN', 1000); // lowest automatically-assigned error code
define('EXIT_AUTO_MAX', 2000); // highest automatically-assigned error code
define('EXIT_AUTO_MIN', 1000); // lowest automatically-assigned error code
define('EXIT_AUTO_MAX', 2000); // highest automatically-assigned error code
/*
|--------------------------------------------------------------------------
@@ -45,7 +45,7 @@ define('BEGINNING_OF_TIME', '1970-01-01');
*/
// Foreign authentication methods
define('AUTH_HBALDAP', 'httpBasicAuthLDAP');
define('AUTH_BT', 'bewerbung');
define('AUTH_BT', 'bewerbung');
// Login methods
define('AUTH_LDAP', 'ldap');
@@ -53,7 +53,7 @@ define('AUTH_DB', 'database');
define('AUTH_SSO', 'sso');
// Authentication return codes
define('AUTH_SUCCESS', 0);
define('AUTH_SUCCESS', 0);
define('AUTH_NOT_AUTHENTICATED', 1);
define('AUTH_INVALID_CREDENTIALS', 2);
@@ -112,7 +112,7 @@ define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
| of this setting
|
*/
define('SHOW_DEBUG_BACKTRACE', TRUE);
define('SHOW_DEBUG_BACKTRACE', true);
/*
|--------------------------------------------------------------------------
@@ -127,24 +127,25 @@ define('EMAIL_CONFIG_INDEX', 'mail');
|--------------------------------------------------------------------------
*/
// Message statuses
define('MSG_STATUS_UNREAD', 0);
define('MSG_STATUS_READ', 1);
define('MSG_STATUS_UNREAD', 0);
define('MSG_STATUS_READ', 1);
define('MSG_STATUS_ARCHIVED', 2);
define('MSG_STATUS_DELETED', 3);
// Message priorities
define('MSG_PRIORITY_LOW', 1);
define('MSG_PRIORITY_LOW', 1);
define('MSG_PRIORITY_NORMAL', 2);
define('MSG_PRIORITY_HIGH', 3);
define('MSG_PRIORITY_HIGH', 3);
define('MSG_PRIORITY_URGENT', 4);
// Message error status
define('MSG_ERR_INVALID_SUBJECT', 40);
define('MSG_ERR_INVALID_BODY', 41);
define('MSG_ERR_INVALID_TEMPLATE', 42);
define('MSG_ERR_INVALID_MSG_ID', 43);
define('MSG_ERR_INVALID_STATUS_ID', 44);
define('MSG_ERR_INVALID_SENDER', 45);
define('MSG_ERR_INVALID_SUBJECT', 40);
define('MSG_ERR_INVALID_BODY', 41);
define('MSG_ERR_INVALID_TEMPLATE', 42);
define('MSG_ERR_INVALID_MSG_ID', 43);
define('MSG_ERR_INVALID_STATUS_ID', 44);
define('MSG_ERR_INVALID_SENDER', 45);
define('MSG_ERR_INVALID_RECIPIENTS', 46);
define('MSG_ERR_INVALID_OU', 47);
define('MSG_ERR_INVALID_TOKEN', 48);
define('MSG_ERR_INVALID_OU', 47);
define('MSG_ERR_INVALID_TOKEN', 48);
+45 -16
View File
@@ -15,7 +15,7 @@ $config['navigation_header'] = array(
'description' => 'Organisation',
'sort' => 20,
'requiredPermissions' => 'basis/vilesci:r',
'children'=> array(
'children' => array(
'vilesci' => array(
'link' => base_url('vilesci'),
'icon' => '',
@@ -40,7 +40,7 @@ $config['navigation_header'] = array(
'description' => 'Lehre',
'sort' => 30,
'requiredPermissions' => 'basis/vilesci:r',
'children'=> array(
'children' => array(
'cis' => array(
'link' => CIS_ROOT,
'icon' => '',
@@ -71,16 +71,16 @@ $config['navigation_header'] = array(
'lehre/lehrauftrag_erteilen:r'
)
),
'zverfueg' => array(
'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'),
'description' => 'Zeitverf&uuml;gbarkeit',
'expand' => true,
'sort' => 45,
'requiredPermissions' => array(
'lehre/zeitverfuegbarkeit:rw',
'lehre/zeitverfuegbarkeit:rw'
)
),
'zverfueg' => array(
'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'),
'description' => 'Zeitverf&uuml;gbarkeit',
'expand' => true,
'sort' => 45,
'requiredPermissions' => array(
'lehre/zeitverfuegbarkeit:rw',
'lehre/zeitverfuegbarkeit:rw'
)
),
'zgvueberpruefung' => array(
'link' => site_url('system/infocenter/ZGVUeberpruefung'),
'description' => 'ZGV Überprüfung',
@@ -98,7 +98,7 @@ $config['navigation_header'] = array(
'description' => 'Personen',
'sort' => 40,
'requiredPermissions' => 'basis/vilesci:r',
'children'=> array(
'children' => array(
'messages' => array(
'link' => site_url('system/messages/MessageClient/read'),
'icon' => '',
@@ -119,6 +119,20 @@ $config['navigation_header'] = array(
'expand' => true,
'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' => 50,
'requiredPermissions' => 'lehre/gruppenmanager:r'
)
)
),
@@ -129,7 +143,7 @@ $config['navigation_header'] = array(
'expand' => false,
'sort' => 50,
'requiredPermissions' => 'admin:r',
'children'=> array(
'children' => array(
'extensions' => array(
'link' => site_url('system/extensions/Manager'),
'description' => 'Extensions Manager',
@@ -194,7 +208,8 @@ $config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array(
'icon' => 'dashboard',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r')
),'lehrauftragBestellen' => array(
),
'lehrauftragBestellen' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag'),
'description' => 'Lehrauftrag bestellen',
'icon' => '',
@@ -216,6 +231,7 @@ $config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array(
'requiredPermissions' => array('lehre/lehrauftrag_erteilen:r')
)
);
$config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
'lehrauftragDashboard' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
@@ -223,7 +239,8 @@ $config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
'icon' => 'dashboard',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r')
),'lehrauftragBestellen' => array(
),
'lehrauftragBestellen' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag'),
'description' => 'Lehrauftrag bestellen',
'icon' => '',
@@ -245,3 +262,15 @@ $config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
'requiredPermissions' => array('lehre/lehrauftrag_erteilen:r')
)
);
$config['navigation_menu']['system/issues/Issues/*'] = array(
'fehlerzustaendigkeiten' => array(
'link' => site_url('system/issues/IssuesZustaendigkeiten'),
'description' => 'Fehler Zuständigkeiten',
'icon' => 'cogs',
'sort' => 100,
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
)
);
+23
View File
@@ -60,3 +60,26 @@ $route['api/v1/organisation/[G|g]eschaeftsjahr/(:any)'] = 'api/v1/organisation/g
$route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisation/organisationseinheit2/$1';
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1';
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
// load routes from extensions
$subdir = 'application/config/extensions';
$dirlist = scandir($subdir);
if ($dirlist)
{
$files = array_diff($dirlist, array('.','..'));
foreach ($files as &$item)
{
if (is_dir($subdir . DIRECTORY_SEPARATOR . $item))
{
$routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php';
if (file_exists($routes_file))
{
require($routes_file);
}
}
}
}
@@ -0,0 +1,207 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the FilterCmptLib (back-end)
* Provides data to the ajax get calls about the filter component
* Listens to ajax post calls to change the filter data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
* NOTE: extends the FHC_Controller instead of the Auth_Controller because the FilterCmpt has its
* own permissions check
*/
class Filter extends FHC_Controller
{
const FILTER_UNIQUE_ID = 'filterUniqueId'; // Name of the filter cmpt unique id (mandatory)
const FILTER_TYPE = 'filterType'; // The filter type (PHP filter definition) used (mandatory)
const FILTER_ID = 'filterId'; // The id of the used filter (optional)
/**
* Calls the parent's constructor and loads the FilterCmptLib
*/
public function __construct()
{
parent::__construct();
// Loads authentication library and starts authentication
$this->load->library('AuthLib');
// Loads the FilterCmptLib with HTTP GET/POST parameters
$this->_startFilterCmptLib();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves data about the current filter from the session and will be written on the output in JSON format
*/
public function getFilter()
{
$this->outputJsonSuccess($this->filtercmptlib->getSession());
}
/**
* Remove an applied filter (SQL where condition) from the current filter
*/
public function removeFilterField()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterField')
&& $this->filtercmptlib->removeFilterField($request->filterField) == true)
{
$this->outputJsonSuccess('Field removed');
}
else
{
$this->outputJsonError('Error occurred');
}
}
/**
* Add a filter (SQL where clause) to be applied to the current filter
*/
public function addFilterField()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterField')
&& $this->filtercmptlib->addFilterField($request->filterField) == true)
{
$this->outputJsonSuccess('Field added');
}
else
{
$this->outputJsonError('Error occurred');
}
}
/**
* Apply the filter changes
*/
public function applyFilterFields()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterFields')
&& $this->filtercmptlib->applyFilterFields($request->filterFields) == true)
{
$this->outputJsonSuccess('Applied');
}
else
{
$this->outputJsonError('Error occurred');
}
}
/**
* Save the current filter as a custom filter for this user with the given description
*/
public function saveCustomFilter()
{
$request = $this->getPostJSON();
if (property_exists($request, 'customFilterName')
&& $this->filtercmptlib->saveCustomFilter($request->customFilterName) == true)
{
$this->outputJsonSuccess('Saved');
}
else
{
$this->outputJsonError('An error occurred while saving a custom filter');
}
}
/**
* Remove a custom filter by its filterId
*/
public function removeCustomFilter()
{
$request = $this->getPostJSON();
if (property_exists($request, 'filterId')
&& $this->filtercmptlib->removeCustomFilter($request->filterId) == true)
{
$this->outputJsonSuccess('Removed');
}
else
{
$this->outputJsonError('Wrong parameter');
}
}
/**
* Reloads the dataset
*/
public function reloadDataset()
{
$this->filtercmptlib->reloadDataset();
$this->outputJsonSuccess('Success');
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Loads the FilterCmptLib with the FILTER_UNIQUE_ID parameter
* If the parameter FILTER_UNIQUE_ID is not given then the execution of the controller is terminated and
* an error message is printed
*/
private function _startFilterCmptLib()
{
$filterUniqueId = null;
$filterType = null;
$filterId = null;
// Try to get the POSTed JSON
$postJSON = $this->getPostJSON();
// POSTed JSON
if ($postJSON != null)
{
// If the mandatory parameters FILTER_UNIQUE_ID and FILTER_TYPE have been provided
if (property_exists($postJSON, self::FILTER_UNIQUE_ID) && property_exists($postJSON, self::FILTER_TYPE))
{
// Retrives them from the POSTed JSON
$filterUniqueId = $postJSON->{self::FILTER_UNIQUE_ID};
$filterType = $postJSON->{self::FILTER_TYPE};
}
// If the optional parameter FILTER_ID has been provided
if (property_exists($postJSON, self::FILTER_ID)) $filterId = $postJSON->{self::FILTER_ID};
}
else // otherwise it is an HTTP GET call
{
// If the mandatory parameters FILTER_UNIQUE_ID and FILTER_TYPE have been provided
if (isset($_GET[self::FILTER_UNIQUE_ID]) && isset($_GET[self::FILTER_TYPE]))
{
// Retrives them from the HTTP GET
$filterUniqueId = $this->input->get(self::FILTER_UNIQUE_ID);
$filterType = $this->input->get(self::FILTER_TYPE);
}
// If the optional parameter FILTER_ID has been provided
if (isset($_GET[self::FILTER_ID])) $filterId = $filterId = $this->input->get(self::FILTER_ID);
}
// If the mandatory parameters have _not_ been provided, then terminate the execution and return an error
if ($filterUniqueId == null) $this->terminateWithJsonError('Parameter "'.self::FILTER_UNIQUE_ID.'" not provided!');
if ($filterType == null) $this->terminateWithJsonError('Parameter "'.self::FILTER_TYPE.'" not provided!');
// Loads the FilterCmptLib that contains all the used logic
$this->load->library(
'FilterCmptLib',
array(
'filterUniqueId' => $filterUniqueId,
'filterType' => $filterType,
'filterId' => $filterId
)
);
// Start the component
$this->filtercmptlib->start();
}
}
@@ -0,0 +1,51 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class SearchBar extends FHC_Controller
{
const SEARCHSTR_PARAM = 'searchstr';
const TYPES_PARAM = 'types';
/**
* Object initialization
*/
public function __construct()
{
parent::__construct();
// Load the library SearchBarLib
$this->load->library('SearchBarLib');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function search()
{
$json = json_decode($this->input->raw_input_stream);
// Checks if the searchstr and the types parameters are in the POSTed JSON
if (isset($json->{self::SEARCHSTR_PARAM}) && isset($json->{self::TYPES_PARAM}))
{
// Convert to json the result from searchbarlib->search
$this->outputJson(
$this->searchbarlib->search(
$json->{self::SEARCHSTR_PARAM},
$json->{self::TYPES_PARAM}
)
);
}
else // otherwise return an error in JSON format
{
$this->outputJsonError(SearchBarLib::ERROR_WRONG_JSON);
}
}
}
@@ -16,9 +16,11 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
class AnrechnungJob extends JOB_Controller
{
const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht';
const REVIEW_ANRECHNUNG_URI = '/lehre/anrechnung/ReviewAnrechnungUebersicht';
const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor';
const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL';
/**
@@ -33,6 +35,8 @@ class AnrechnungJob extends JOB_Controller
$this->load->helper('url');
$this->load->helper('hlp_sancho_helper');
$this->load->library('AnrechnungLib');
}
/**
@@ -342,6 +346,79 @@ html;
}
/**
* Send Sancho mail to remind lecturers to provide their recommendation if not done until one week after request.
*/
public function sendMailRemindRecommendation(){
$this->logInfo('Start AnrechnungJob sendMailRemindRecommendation to remind lecturers to provide their recommendation.');
// Get Anrechnungen with pending recommendations, that were requested 1 week before today.
// Restrict query for Anrechnungen of actual semester.
$this->AnrechnungModel->addSelect('astat.anrechnung_id, astat.datum, astat.insertamum');
$this->AnrechnungModel->addDistinct('astat.anrechnung_id');
$this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus astat', 'anrechnung_id');
$result = $this->AnrechnungModel->loadWhere('
studiensemester_kurzbz = (
SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende)
)
AND genehmigt_von IS NULL
AND empfehlung_anrechnung IS NULL
AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor
AND NOW()::date = (astat.datum + interval \'1 week\') -- eine Woche nach Empfehlungsanfrage
ORDER BY astat.anrechnung_id, astat.datum DESC, astat.insertamum DESC -- nur letzten status dabei prüfen
');
// Exit if there are no pending recommendations
if (!hasData($result))
{
$this->logInfo('End AnrechnungJob sendMailRemindRecommendation, because no recommendations to be done.');
exit;
}
$anrechnung_id_arr = array_column(getData($result), 'anrechnung_id');
$arr_lvLector_arr = array();
foreach ($anrechnung_id_arr as $anrechnung_id)
{
$arr_lvLector_arr[]= $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV.
}
// Unique lector array to send only one mail per lector
$arr_lvLector_arr = array_unique($arr_lvLector_arr, SORT_REGULAR);
// Link to 'Anrechnungen prüfen' dashboard
$url =
CIS_ROOT. 'cis/index.php?menu='.
CIS_ROOT. 'cis/menu.php?content_id=&content='.
CIS_ROOT. index_page(). self::REVIEW_ANRECHNUNG_URI;
foreach ($arr_lvLector_arr as $lvLector_arr)
{
foreach ($lvLector_arr as $lector)
{
// Prepare mail content
$fields = array(
'vorname' => $lector->vorname,
'stgl_name' => 'Die Studiengangsleitung',
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
// Send mail
sendSanchoMail(
'AnrechnungEmpfehlungAnfordern',
$fields,
$lector->uid. '@'. DOMAIN,
'Erinnerung: Deine Empfehlung wird benötigt zur Anerkennung nachgewiesener Kenntnisse'
);
}
}
$this->logInfo('SUCCEDED AnrechnungJob sendMailRemindRecommendation');
}
// Get STGL mail address
private function _getSTGLMailAddress($studiengang_kz)
{
+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'
);
}
}
@@ -240,11 +240,13 @@ class LVPlanJob extends JOB_Controller
}
// Send mail to STG Assistenz
/*
$result = $this->_sendMailToStg($uidByStg_arr);
if (isError($result))
{
$this->logError(getError($result));
}
*/
// Send mail to Kompetenzfeld Leitung
$result = $this->_sendMailToKF($uidByOe_arr);
@@ -359,7 +359,7 @@ class LehrauftragJob extends JOB_Controller
for ($i = 0; $i < $data_len; $i++)
{
// Get all users entitled by organisational unit
$result = $this->BenutzerrolleModel->getBenutzerByBerechtigung(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN, $data[$i]['oe_kurzbz']);
$result = $this->BenutzerrolleModel->getBenutzerByBerechtigung(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN, $data[$i]['oe_kurzbz'], 'suid');
if ($berechtigung_arr = getData($result))
{
@@ -0,0 +1,62 @@
<?php
/**
* Job for producing Plausicheck issues
*/
class PlausiIssueProducer extends JOB_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('issues/PlausicheckProducerLib');
$this->load->library('IssuesLib');
}
/**
* 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)
{
$fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz();
$this->logInfo("Plausicheck issue producer job started");
// get the data returned by Plausicheck
foreach ($fehlerKurzbz as $fehler_kurzbz)
{
// execute the check
$this->logInfo("Checking " . $fehler_kurzbz . "...");
$plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz);
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");
}
}
+136 -77
View File
@@ -1,8 +1,32 @@
<?php
/**
* Copyright (C) 2023 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
use \DateTime as DateTime;
use \DB_Model as DB_Model;
class ReihungstestJob extends JOB_Controller
{
// OE used to as sender for the test deadline reminder
const OU_SENDER_TEST_REMINDER = 'infocenter';
/**
* Constructor
*/
@@ -21,6 +45,9 @@ class ReihungstestJob extends JOB_Controller
// Load helpers
$this->load->helper('hlp_sancho_helper');
// Loads CLMessagesModel
$this->load->model('CL/Messages_model', 'CLMessagesModel');
}
/**
@@ -64,7 +91,8 @@ class ReihungstestJob extends JOB_Controller
'ReihungstestJob',
$content_data_arr,
MAIL_INFOCENTER,
'Support für die Reihungstest-Verwaltung');
'Support für die Reihungstest-Verwaltung'
);
}
}
@@ -113,6 +141,8 @@ class ReihungstestJob extends JOB_Controller
foreach ($reachedRegistration_rt_arr as $reihungstest)
{
$reihungstestDatum = date_format(date_create($reihungstest->datum), 'd.m.Y');
$applicants = $this->ReihungstestModel->getApplicantsOfPlacementTestForCronjob($reihungstest->reihungstest_id);
if (hasData($applicants))
@@ -153,14 +183,22 @@ class ReihungstestJob extends JOB_Controller
}
if ($applicantCounter == 0)
{
$mailcontent = '<p style="font-family: verdana, sans-serif;">Der Anmeldeschluss für den zentralen Reihungstest am ' . date_format(date_create($reihungstest->datum), 'd.m.Y') . ' um ' . $reihungstest->uhrzeit . ' Uhr wurde gestern erreicht.</p>';
$mailcontent .= '<p style="font-family: verdana, sans-serif;"><b>Für den Studiengang '.$studiengang_kuerzel.' nehmen keine InteressentInnen an diesem Reihungstest teil</b></p>';
$mailcontent = '<p style="font-family: verdana, sans-serif;">Der Anmeldeschluss für den zentralen Reihungstest am ' .
$reihungstestDatum . ' um ' . $reihungstest->uhrzeit . ' Uhr wurde gestern erreicht.</p>';
$mailcontent .= '<p style="font-family: verdana, sans-serif;"><b>Für den Studiengang '.
$studiengang_kuerzel.
' nehmen keine InteressentInnen an diesem Reihungstest teil</b></p>';
}
else
{
$mailcontent = '<p style="font-family: verdana, sans-serif;">Der Anmeldeschluss für den zentralen Reihungstest am ' . date_format(date_create($reihungstest->datum), 'd.m.Y') . ' um ' . $reihungstest->uhrzeit . ' Uhr wurde gestern erreicht.</p>';
$mailcontent = '<p style="font-family: verdana, sans-serif;">Der Anmeldeschluss für den zentralen Reihungstest am ' .
$reihungstestDatum .
' um ' . $reihungstest->uhrzeit . ' Uhr wurde gestern erreicht.</p>';
$mailcontent .= '
<p style="font-family: verdana, sans-serif;"><b>' . $applicantCounter . '</b> InteressentIn(nen) des Studiengangs ' . $studiengang_kuerzel . ' nehmen daran teil:</p>
<p style="font-family: verdana, sans-serif;"><b>' . $applicantCounter . '</b> InteressentIn(nen) des Studiengangs ' .
$studiengang_kuerzel . ' nehmen daran teil:</p>
<p style="font-family: verdana, sans-serif;">
<a href="'.APP_ROOT.'vilesci/stammdaten/auswertung_fhtw.php?reihungstest='.$reihungstest->reihungstest_id.'&studiengang='.$bachelorStudiengang->studiengang_kz.'" target="_blank">
Liste der Anmeldungen
@@ -176,12 +214,13 @@ class ReihungstestJob extends JOB_Controller
'Sancho_ReihungstestteilnehmerJob',
$mailcontent_data_arr,
$bachelorStudiengang->email,
'Anmeldeschluss Reihungstest ' . date_format(date_create($reihungstest->datum), 'd.m.Y') . ' ' . $reihungstest->uhrzeit . ' Uhr',
'Anmeldeschluss Reihungstest ' . $reihungstestDatum . ' ' . $reihungstest->uhrzeit . ' Uhr',
'sancho_header_min_bw.jpg',
'sancho_footer_min_bw.jpg',
$from,
'',
$bcc);
$bcc
);
}
}
}
@@ -229,7 +268,6 @@ class ReihungstestJob extends JOB_Controller
}
$studiengang = '';
$mailReceipients = ''; // String with all mailadresses
$mailcontent_data_arr = array();
$headerstyle = 'style="background: #DCE4EF; border: 1px solid #FFF; padding: 4px; text-align: left;"';
$rowstyle = 'style="background-color: #EEEEEE; padding: 4px;"';
@@ -248,10 +286,10 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= $applicants_list;
$mailcontent .= '</tbody></table>';
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
<a href="'.APP_ROOT.'vilesci/stammdaten/auswertung_fhtw.php?reihungstest='.$applicant->reihungstest_id.'&studiengang='.$studiengang.'" target="_blank">
Liste der Anmeldungen
</a>
</p>';
<a href="'.APP_ROOT.'vilesci/stammdaten/auswertung_fhtw.php?reihungstest='.$applicant->reihungstest_id.'&studiengang='.$studiengang.'" target="_blank">
Liste der Anmeldungen
</a>
</p>';
$mailcontent_data_arr['table'] = $mailcontent;
sendSanchoMail(
'Sancho_ReihungstestteilnehmerJob',
@@ -262,12 +300,15 @@ class ReihungstestJob extends JOB_Controller
'sancho_footer_min_bw.jpg',
$from,
'',
$bcc);
$bcc
);
$applicants_list = '';
$mailcontent_data_arr = array();
}
$mailcontent = '<p style="font-family: verdana, sans-serif;">Folgende InteressentInnen wurden <b>nach</b> der Anmeldefrist zu einem Reihungstest hinzugefügt.<br>Details siehe Link</p>';
$mailcontent = '<p style="font-family: verdana, sans-serif;">
Folgende InteressentInnen wurden <b>nach</b> der Anmeldefrist zu einem Reihungstest hinzugefügt.<br>Details siehe Link
</p>';
$mailcontent .= '
<table width="100%" style="cellpadding: 3px; font-family: verdana, sans-serif; border: 1px solid #000000;">
<thead>
@@ -283,7 +324,6 @@ class ReihungstestJob extends JOB_Controller
}
$studiengang = $applicant->studiengang_kz;
$mailReceipients .= $applicant->email . ';';
$applicants_list .= '
<tr ' . $rowstyle . '>
<td>' . date_format(date_create($applicant->datum), 'd.m.Y') . '</td>
@@ -299,10 +339,10 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= $applicants_list;
$mailcontent .= '</tbody></table>';
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
<a href="'.APP_ROOT.'vilesci/stammdaten/auswertung_fhtw.php?reihungstest='.$applicant->reihungstest_id.'&studiengang='.$studiengang.'" target="_blank">
Liste der Anmeldungen
</a>
</p>';
<a href="'.APP_ROOT.'vilesci/stammdaten/auswertung_fhtw.php?reihungstest='.$applicant->reihungstest_id.'&studiengang='.$studiengang.'" target="_blank">
Liste der Anmeldungen
</a>
</p>';
$mailcontent_data_arr['table'] = $mailcontent;
sendSanchoMail(
'Sancho_ReihungstestteilnehmerJob',
@@ -313,7 +353,8 @@ class ReihungstestJob extends JOB_Controller
'sancho_footer_min_bw.jpg',
$from,
'',
$bcc);
$bcc
);
}
}
@@ -346,6 +387,7 @@ class ReihungstestJob extends JOB_Controller
// Get placement tests with testdate within the next 2 weeks
$resultNextTestDates = $this->ReihungstestModel->getNextPlacementtests($degreeProgram, 14);
if (hasData($resultNextTestDates))
{
$nextTestDates = $resultNextTestDates->retval;
@@ -357,7 +399,8 @@ class ReihungstestJob extends JOB_Controller
$testsOndate = array();
// Deduct days till 2 working days are reached
for ($i = 1; ; $i++)
// NOTE: the condition is to avoid a never ending loop
for ($i = 1; $workingdays < 10; $i++)
{
if (isDateWorkingDay($testDates->datum, $i) === true)
{
@@ -393,7 +436,8 @@ class ReihungstestJob extends JOB_Controller
{
foreach ($testsOndate as $reihungstest)
{
// Loads applicants of a test
// Loads applicants of a test with prestudent ID
$applicants_arr = '';
$applicants = $this->ReihungstestModel->getApplicantsOfPlacementTest($reihungstest->reihungstest_id);
if (hasData($applicants))
@@ -405,34 +449,35 @@ class ReihungstestJob extends JOB_Controller
show_error(getError($applicants));
}
foreach ($applicants_arr as $applicant)
if (!empty($applicants_arr))
{
$mailcontent_data_arr = array();
$mailcontent_data_arr['anrede'] = $applicant->anrede;
$mailcontent_data_arr['nachname'] = $applicant->nachname;
$mailcontent_data_arr['vorname'] = $applicant->vorname;
$mailcontent_data_arr['rt_datum'] = date_format(date_create($reihungstest->datum), 'd.m.Y');
$mailcontent_data_arr['rt_uhrzeit'] = date_format(date_create($reihungstest->uhrzeit), 'H:i');
$mailcontent_data_arr['rt_raum'] = $applicant->planbezeichnung;
if ($applicant->lageplan == '')
foreach ($applicants_arr as $applicant)
{
$mailcontent_data_arr['wegbeschreibung'] = 'Für diesen Raum liegt noch keine Wegbeschreibung vor.<br><br>No directions were found for this room';
}
else
{
$mailcontent_data_arr['wegbeschreibung'] = $applicant->lageplan;
}
$mailcontent_data_arr = array();
$mailcontent_data_arr['anrede'] = $applicant->anrede;
$mailcontent_data_arr['nachname'] = $applicant->nachname;
$mailcontent_data_arr['vorname'] = $applicant->vorname;
$mailcontent_data_arr['rt_datum'] = date_format(date_create($reihungstest->datum), 'd.m.Y');
$mailcontent_data_arr['rt_uhrzeit'] = date_format(date_create($reihungstest->uhrzeit), 'H:i');
$mailcontent_data_arr['rt_raum'] = $applicant->planbezeichnung;
if ($applicant->lageplan == '')
{
$mailcontent_data_arr['wegbeschreibung'] = 'Für diesen Raum liegt noch keine Wegbeschreibung vor.
<br><br>No directions were found for this room';
}
else
{
$mailcontent_data_arr['wegbeschreibung'] = $applicant->lageplan;
}
sendSanchoMail(
'Sancho_RemindApplicantsOfTest',
$mailcontent_data_arr,
$applicant->email,
'Ihre Anmeldung zum Reihungstest - Reminder / Your registration for the placement test - Reminder',
DEFAULT_SANCHO_HEADER_IMG,
DEFAULT_SANCHO_FOOTER_IMG,
$from,
'',
$bcc);
$this->CLMessagesModel->sendExplicitTemplateSenderId(
$this->config->item(MessageLib::CFG_SYSTEM_PERSON_ID),
$applicant->prestudent_id,
self::OU_SENDER_TEST_REMINDER,
'Sancho_RemindApplicantsOfTest',
$mailcontent_data_arr
);
}
}
}
}
@@ -494,7 +539,7 @@ class ReihungstestJob extends JOB_Controller
person_id,
tbl_reihungstest.studiensemester_kurzbz,
tbl_reihungstest.reihungstest_id,
(SELECT(tbl_reihungstest.datum::text || \' \' || tbl_reihungstest.uhrzeit::text)::timestamp) AS reihungstest_timestamp
(SELECT(tbl_reihungstest.datum::text || \' \' || tbl_reihungstest.uhrzeit::text)::timestamp) as reihungstest_timestamp
');
$this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->PrestudentModel->addJoin('public.tbl_studiengangstyp', 'typ');
@@ -540,11 +585,9 @@ class ReihungstestJob extends JOB_Controller
}
// Sort by STG. This is important to send the mails clustered by STG to the different STG assistances.
usort($result_arr, function ($a, $b)
{
if ($a->studiengang_kz == $b->studiengang_kz) {
return 0;
}
usort($result_arr, function ($a, $b) {
if ($a->studiengang_kz == $b->studiengang_kz) return 0;
return ($a->studiengang_kz < $b->studiengang_kz) ? -1 : 1;
});
@@ -687,6 +730,7 @@ class ReihungstestJob extends JOB_Controller
}
// Set associative array with the prepared HTML tables and URL be used by the template's variables
$content_data_arr = array();
$content_data_arr['studienplan_list'] = $studienplan_list;
$content_data_arr['freie_plaetze_list'] = $freie_plaetze_list;
$content_data_arr['link'] = site_url('/organisation/Reihungstest');
@@ -709,7 +753,9 @@ class ReihungstestJob extends JOB_Controller
$counter++;
}
$content_data_arr = array();
$content_data_arr['link'] = $content;
return $content_data_arr;
}
@@ -808,13 +854,13 @@ class ReihungstestJob extends JOB_Controller
return;
}
$qry = "WITH prst AS (
$qry = "WITH prst as (
SELECT DISTINCT
get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) AS laststatus,
get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) as laststatus,
tbl_prestudentstatus.studiensemester_kurzbz,
tbl_prestudentstatus.datum AS prestudenstatus_datum,
tbl_prestudentstatus.datum as prestudenstatus_datum,
tbl_prestudent.*,
tbl_studiengang.typ AS studiengang_typ
tbl_studiengang.typ as studiengang_typ
FROM PUBLIC.tbl_person
JOIN PUBLIC.tbl_prestudent USING (person_id)
JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id)
@@ -822,16 +868,26 @@ class ReihungstestJob extends JOB_Controller
JOIN lehre.tbl_studienordnung USING (studienordnung_id)
JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz)
WHERE get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) IN ('Aufgenommener','Bewerber','Wartender','Abgewiesener')
AND studiensemester_kurzbz = ?
AND studiensemester_kurzbz = ?
AND tbl_studiengang.typ IN ('b', 'm')
)
SELECT * FROM prst
WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - 1)
AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */
FROM prst prstb
WHERE studiengang_typ = 'b'
AND laststatus != 'Abgewiesener'
AND prstb.person_id = prst.person_id )))
AND (
studiengang_typ = 'b'
OR
(
studiengang_typ = 'm'
AND
EXISTS (
SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */
FROM prst prstb
WHERE studiengang_typ = 'b'
AND laststatus != 'Abgewiesener'
AND prstb.person_id = prst.person_id
)
)
)
ORDER BY studiengang_kz, laststatus";
// Encode Params
@@ -863,12 +919,12 @@ class ReihungstestJob extends JOB_Controller
// Alle niedrigeren Prios laden
$qryNiedrPrios = "
SELECT DISTINCT
get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') AS laststatus,
get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') as laststatus,
tbl_studienplan.orgform_kurzbz,
tbl_person.nachname,
tbl_person.vorname,
tbl_prestudent.*,
tbl_studiengang.typ AS studiengang_typ
tbl_studiengang.typ as studiengang_typ
FROM PUBLIC.tbl_person
JOIN PUBLIC.tbl_prestudent USING (person_id)
JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id)
@@ -876,7 +932,10 @@ class ReihungstestJob extends JOB_Controller
JOIN PUBLIC.tbl_studiengang ON (tbl_prestudent.studiengang_kz = tbl_studiengang.studiengang_kz)
WHERE tbl_prestudent.person_id = ".$row_ps->person_id."
AND tbl_prestudent.prestudent_id != ".$row_ps->prestudent_id."
AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender')
AND get_rolle_prestudent(
tbl_prestudent.prestudent_id,
'".$row_ps->studiensemester_kurzbz."'
) IN ('Aufgenommener','Bewerber','Wartender')
AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."'
AND tbl_studiengang.typ IN ('b', 'm')
AND priorisierung > ".$row_ps->priorisierung."
@@ -1019,12 +1078,12 @@ class ReihungstestJob extends JOB_Controller
// Mails senden
if (!isEmptyArray($mailArray))
{
foreach ($mailArray AS $stg=>$orgform)
foreach ($mailArray as $stg => $orgform)
{
$studiengang = $this->StudiengangModel->load($stg);
$mailcontent = '';
foreach ($orgform AS $art=>$value)
foreach ($orgform as $art => $value)
{
// Orgform nur dazu schreiben, wenn es mehr als Eine gibt
if (count($orgform) > 1)
@@ -1034,12 +1093,12 @@ class ReihungstestJob extends JOB_Controller
if (isset($value['AbgewiesenGesetztWartender']) && !isEmptyArray($value['AbgewiesenGesetztWartender']))
{
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
Folgende Personen auf der Warteliste wurden in einem höher priorisierten Studiengang aufgenommen und haben deshalb einen Status "Abgewiesen" erhalten:</p>';
Folgende Personen auf der Warteliste wurden in einem höher priorisierten Studiengang aufgenommen und haben deshalb einen Status "Abgewiesen" erhalten:
</p>';
$mailcontent .= '<table style="border-collapse: collapse; border: 1px solid grey;">';
//$mailcontent .= '<thead><th style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px; text-align: left">Zuvor Warteliste</th></thead>';
$mailcontent .= ' <tbody>';
sort($value['AbgewiesenGesetztWartender']);
foreach ($value['AbgewiesenGesetztWartender'] AS $key=>$bewerber)
foreach ($value['AbgewiesenGesetztWartender'] as $key => $bewerber)
{
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
@@ -1050,10 +1109,9 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
Folgende Aufgenommene wurden in einem höher priorisierten Studiengang aufgenommen:</p>';
$mailcontent .= '<table style="border-collapse: collapse; border: 1px solid grey;">';
//$mailcontent .= '<thead><th style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px; text-align: left">Aufgenommene</th></thead>';
$mailcontent .= ' <tbody>';
sort($value['AufnahmeHoeherePrio']);
foreach ($value['AufnahmeHoeherePrio'] AS $key=>$bewerber)
foreach ($value['AufnahmeHoeherePrio'] as $key => $bewerber)
{
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
@@ -1066,7 +1124,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<table style="border-collapse: collapse; border: 1px solid grey;">';
$mailcontent .= ' <tbody>';
sort($value['AbgewiesenHoeherePrio']);
foreach ($value['AbgewiesenHoeherePrio'] AS $key=>$bewerber)
foreach ($value['AbgewiesenHoeherePrio'] as $key => $bewerber)
{
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
@@ -1077,10 +1135,9 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
Folgende BewerberInnen wurden zu Abgewiesenen gemacht:</p>';
$mailcontent .= '<table style="border-collapse: collapse; border: 1px solid grey;">';
//$mailcontent .= '<thead><th style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px; text-align: left">Aufgenommene</th></thead>';
$mailcontent .= ' <tbody>';
sort($value['AbgewiesenWeilBewerber']);
foreach ($value['AbgewiesenWeilBewerber'] AS $key => $bewerber)
foreach ($value['AbgewiesenWeilBewerber'] as $key => $bewerber)
{
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
@@ -1088,6 +1145,7 @@ class ReihungstestJob extends JOB_Controller
}
}
$mailcontent_data_arr = array();
$mailcontent_data_arr['table'] = $mailcontent;
// Send email in Sancho design
@@ -1102,7 +1160,8 @@ class ReihungstestJob extends JOB_Controller
'sancho_footer_min_bw.jpg',
$from,
'',
$bcc);
$bcc
);
}
}
}
@@ -395,8 +395,12 @@ class approveAnrechnungDetail extends Auth_Controller
// Set filename to be used on downlaod
$filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
// Get file to be downloaded from DMS
$download = $this->dmslib->download($dms_id, $filename);
if (isError($download)) return $download;
// Download file
$this->dmslib->download($dms_id, $filename);
$this->outputFile(getData($download));
}
/**
@@ -8,13 +8,13 @@ class approveAnrechnungUebersicht extends Auth_Controller
const BERECHTIGUNG_ANRECHNUNG_ANLEGEN = 'lehre/anrechnung_anlegen';
const REVIEW_ANRECHNUNG_URI = '/lehre/anrechnung/ReviewAnrechnungUebersicht';
const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP';
const ANRECHNUNGSTATUS_PROGRESSED_BY_KF = 'inProgressKF';
const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor';
const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
public function __construct()
{
// Set required permissions
@@ -27,23 +27,23 @@ class approveAnrechnungUebersicht extends Auth_Controller
'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw'
)
);
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
$this->load->model('content/DmsVersion_model', 'DmsVersionModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
$this->load->library('AnrechnungLib');
$this->load->library('DmsLib');
// Load helpers
$this->load->helper('form');
$this->load->helper('url');
$this->load->helper('hlp_sancho_helper');
// Load language phrases
$this->loadPhrases(
array(
@@ -55,23 +55,23 @@ class approveAnrechnungUebersicht extends Auth_Controller
'table'
)
);
$this->_setAuthUID();
$this->setControllerId();
}
public function index()
{
// Get study semester
$studiensemester_kurzbz = $this->input->get('studiensemester');
if (isEmptyString($studiensemester_kurzbz))
{
$result = $this->StudiensemesterModel->getNearest();
$studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz;
}
// Get studiengaenge the user is entitled for
if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN))
{
@@ -91,10 +91,10 @@ class approveAnrechnungUebersicht extends Auth_Controller
'hasReadOnlyAccess' => $hasReadOnlyAccess,
'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess
);
$this->load->view('lehre/anrechnung/approveAnrechnungUebersicht.php', $viewData);
}
/**
* Approve Anrechnungen.
*/
@@ -107,22 +107,30 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$json = array(
'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED),
'prestudenten' => []
);
// Approve Anrechnung
foreach ($data as $item)
{
if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))
// Get Prestudent
$this->AnrechnungModel->addSelect('prestudent_id');
$result = $this->AnrechnungModel->load($item['anrechnung_id']);
$prestudent_id = getData($result)[0]->prestudent_id;
// Approve
if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED)
);
$json['prestudenten'][$prestudent_id][] = $item['anrechnung_id'];
}
}
// Output json to ajax
if (isset($json) && !isEmptyArray($json))
if (isset($json) && !isEmptyArray($json['prestudenten']))
{
return $this->outputJsonSuccess($json);
}
@@ -131,20 +139,20 @@ class approveAnrechnungUebersicht extends Auth_Controller
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
}
}
/**
* Reject Anrechnungen.
*/
public function reject()
{
$data = $this->input->post('data');
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
// Reject Anrechnung
foreach ($data as $item)
{
@@ -157,7 +165,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
);
}
}
// Output json to ajax
if (isset($json) && !isEmptyArray($json))
{
@@ -168,22 +176,22 @@ class approveAnrechnungUebersicht extends Auth_Controller
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
}
}
/**
* Request recommendation for Anrechnungen.
*/
public function requestRecommendation()
{
$data = $this->input->post('data');
if(isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$retval = array();
$counter = 0;
foreach ($data as $item)
{
// Check if Anrechnungs-LV has lector
@@ -191,7 +199,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
// Count up LV with no lector
$counter++;
// Continue loop, if LV has no lector
continue;
}
@@ -205,7 +213,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
$empfehlungsanfrage_an = !isEmptyArray($lector_arr)
? implode(', ', array_column($lector_arr, 'fullname'))
: '';
$retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
@@ -216,7 +224,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
);
}
}
/**
* Send mails to lectors
* NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
@@ -226,16 +234,16 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
self::_sendSanchoMailToLectors($retval);
}
// Output json to ajax
if (isEmptyArray($retval) && $counter == 0)
{
return $this->outputJsonError('Es wurden keine Empfehlungen angefordert');
}
return $this->outputJsonSuccess($retval);
}
/**
* Download and open uploaded document (Nachweisdokument).
*/
@@ -250,25 +258,28 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Check if user is entitled to read dms doc
$this->_checkIfEntitledToReadDMSDoc($dms_id);
// Set filename to be used on downlaod
$filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
// Get file to be downloaded from DMS
$download = $this->dmslib->download($dms_id, $filename);
if (isError($download)) return $download;
// Download file
$this->dmslib->download($dms_id, $filename);
$this->outputFile(getData($download));
}
/**
* 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');
}
/**
* Check if user is entitled to read dms doc
* @param $dms_id
@@ -276,31 +287,30 @@ class approveAnrechnungUebersicht extends Auth_Controller
private function _checkIfEntitledToReadDMSDoc($dms_id)
{
$result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id));
if(!$result = getData($result)[0])
{
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => $result->lehrveranstaltung_id
));
if(!$result = getData($result)[0])
{
show_error('Failed loading Lehrveranstaltung');
}
$studiengang_kz = $result->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
{
show_error('You are not entitled to read this document');
}
}
/**
* Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv)
* @param $mail_params
@@ -310,7 +320,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
// Get Lehrveranstaltungen
$anrechnung_arr = array();
foreach ($mail_params as $item)
{
$this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz');
@@ -319,10 +329,10 @@ class approveAnrechnungUebersicht extends Auth_Controller
'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz
);
}
$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.
@@ -334,27 +344,27 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
$to = $lector->uid;
$vorname = $lector->vorname;
// Get full name of stgl
$this->load->model('person/Person_model', 'PersonModel');
if (!$stgl_name = getData($this->PersonModel->getFullName($this->_uid)))
{
show_error ('Failed retrieving person');
}
// Link to Antrag genehmigen
$url =
CIS_ROOT. 'cis/index.php?menu='.
CIS_ROOT. 'cis/menu.php?content_id=&content='.
CIS_ROOT. index_page(). self::REVIEW_ANRECHNUNG_URI;
// Prepare mail content
$body_fields = array(
'vorname' => $vorname,
'stgl_name' => $stgl_name,
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
sendSanchoMail(
'AnrechnungEmpfehlungAnfordern',
$body_fields,
@@ -364,7 +374,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
return true;
}
/**
* 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.
@@ -374,18 +384,18 @@ class approveAnrechnungUebersicht extends Auth_Controller
private function _getLectors($anrechnung_arr)
{
$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']);
if (!hasData($result))
{
show_error('Failed retrieving lectors of Lehrveranstaltung');
}
$lecturersByLv = getData($result);
// Check if lv has LV-Leitung
@@ -401,7 +411,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
$lector_arr = array_merge($lector_arr, $lecturersByLv);
}
}
/**
* NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step
* (e.g. if same lector is ones LV-Leitung and another time not, then array_unique would leave both.
@@ -411,10 +421,10 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
unset($lector->lvleiter);
}
// Now make the lector array aka mail receivers unique
$lector_arr = array_unique($lector_arr, SORT_REGULAR);
return $lector_arr;
}
}
}
@@ -6,13 +6,13 @@ class requestAnrechnung extends Auth_Controller
{
const REQUEST_ANRECHNUNG_URI = '/lehre/anrechnung/RequestAnrechnung';
const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht';
const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP';
const ANRECHNUNGSTATUS_PROGRESSED_BY_KF = 'inProgressKF';
const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor';
const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
public function __construct()
{
// Set required permissions
@@ -23,22 +23,22 @@ class requestAnrechnung extends Auth_Controller
'download' => 'student/anrechnung_beantragen:rw',
)
);
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('content/DmsVersion_model', 'DmsVersionModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
$this->load->library('AnrechnungLib');
$this->load->library('DmsLib');
// Load helpers
$this->load->helper('form');
$this->load->helper('url');
$this->load->helper('hlp_sancho_helper');
// Load configs
$this->load->config('anrechnung');
@@ -205,9 +205,14 @@ class requestAnrechnung extends Auth_Controller
}
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
$this->_checkIfEntitledToReadDMSDoc($dms_id);
$this->dmslib->download($dms_id);
// Get file to be downloaded from DMS
$download = $this->dmslib->download($dms_id);
if (isError($download)) return $download;
// Download file
$this->outputFile(getData($download));
}
/**
@@ -216,10 +221,10 @@ class requestAnrechnung extends Auth_Controller
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
/**
* Check if application deadline is expired.
*
@@ -232,7 +237,7 @@ class requestAnrechnung extends Auth_Controller
private function _isExpired($start, $ende, $studiensemester_kurzbz)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// If start is not given, set to Semesterstart.
if (!isset($start) || isEmptyString($start))
{
@@ -240,7 +245,7 @@ class requestAnrechnung extends Auth_Controller
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$start = getData($result)[0]->start;
}
// If ende is not given, set to Semesterende.
if (!isset($ende) || isEmptyString($ende))
{
@@ -248,15 +253,15 @@ class requestAnrechnung extends Auth_Controller
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$ende = getData($result)[0]->ende;
}
$today = new DateTime('today midnight');
$start = new DateTime($start);
$ende = new DateTime($ende);
// True if expired
return ($today < $start || $today > $ende);
}
/**
* Check if user is entitled to read dms doc.
*
@@ -268,9 +273,9 @@ class requestAnrechnung extends Auth_Controller
{
show_error('Failed loading Student');
}
$result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id));
if($result = getData($result)[0])
{
if ($result->prestudent_id == $student->prestudent_id)
@@ -278,10 +283,10 @@ class requestAnrechnung extends Auth_Controller
return;
}
}
show_error('You are not entitled to read this document');
}
/**
* Check if application already exists.
*
@@ -297,15 +302,15 @@ class requestAnrechnung extends Auth_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'prestudent_id' => $prestudent_id
));
if (isError($result))
{
show_error(getError($result));
}
return hasData($result);
}
/**
* Check if applications' study semester is actual study semester.
*
@@ -317,10 +322,10 @@ class requestAnrechnung extends Auth_Controller
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->getNearest();
$actual_ss = getData($result)[0]->studiensemester_kurzbz;
return $studiensemester_kurzbz == $actual_ss;
}
private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id)
{
// Get Note of Lehrveranstaltung
@@ -331,12 +336,12 @@ class requestAnrechnung extends Auth_Controller
'lehrveranstaltung_id' => $lehrveranstaltung_id
)
);
// If Lehrveranstaltung has Note
if (hasData($result))
{
$note = getData($result)[0]->note;
// Check if Note is a blocking grade
if (in_array($note, $this->config->item('grades_blocking_application')))
{
@@ -345,7 +350,7 @@ class requestAnrechnung extends Auth_Controller
}
return false;
}
/**
* Upload file via DMS library.
*
@@ -362,8 +367,8 @@ class requestAnrechnung extends Auth_Controller
'insertamum' => (new DateTime())->format('Y-m-d H:i:s'),
'insertvon' => $this->_uid
);
// Upload document
return $this->dmslib->upload($dms, 'uploadfile', array('pdf'));
}
}
}
@@ -217,15 +217,18 @@ class reviewAnrechnungDetail extends Auth_Controller
}
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
$this->_checkIfEntitledToReadDMSDoc($dms_id);
// Set filename to be used on downlaod
$filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
// Download file
$this->dmslib->download($dms_id, $filename);
}
// Get file to be downloaded from DMS
$download = $this->dmslib->download($dms_id, $filename);
if (isError($download)) return $download;
// Download file
$this->outputFile(getData($download));
}
/**
* Retrieve the UID of the logged user and checks if it is valid
@@ -319,20 +322,10 @@ class reviewAnrechnungDetail extends Auth_Controller
// Send mail to STGL of each studiengang
foreach ($studiengang_kz_arr as $studiengang_kz)
{
// Get STGL mail address, if available, otherwise get assistance mail address
$stgmail = $this->_getSTGLMailAddress($studiengang_kz);
if(isSuccess($stgmail) && hasData($stgmail))
list ($to, $vorname) = getData($stgmail)[0];
else
show_error ('Failed retrieving DegreeProgram Mail');
// Get full name of lector
$this->load->model('person/Person_model', 'PersonModel');
if (!$lector_name = getData($this->PersonModel->getFullName($this->_uid)))
{
show_error ('Failed retrieving person');
}
$result = $this->PersonModel->getFullName($this->_uid);
$lector_name = hasData($result) ? getData($result) : 'Ein Lektor';
// Link to Antrag genehmigen
$url =
@@ -340,22 +333,26 @@ class reviewAnrechnungDetail extends Auth_Controller
CIS_ROOT. 'cis/menu.php?content_id=&content='.
CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI;
// Prepare mail content
$body_fields = array(
'vorname' => $vorname,
'lektor_name' => $lector_name,
'empfehlung' => $empfehlung ? 'positive' : 'negative',
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
// Get STGL mail address, if available, otherwise get assistance mail address
if( !$result = $this->_getSTGLMailAddress($studiengang_kz)) return false;
foreach ($result as $stgl)
{
// Prepare mail content
$body_fields = array(
'vorname' => $stgl['vorname'],
'lektor_name' => $lector_name,
'empfehlung' => $empfehlung ? 'positive' : 'negative',
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
sendSanchoMail(
'AnrechnungEmpfehlungAbgeben',
$body_fields,
$to,
'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben'
);
sendSanchoMail(
'AnrechnungEmpfehlungAbgeben',
$body_fields,
$stgl['to'],
'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben'
);
}
}
return true;
}
@@ -366,28 +363,33 @@ class reviewAnrechnungDetail extends Auth_Controller
$result = $this->StudiengangModel->getLeitung($stg_kz);
// Get STGL mail address, if available
if (isSuccess($result) && hasData($result))
{
return success(array(
$result->retval[0]->uid. '@'. DOMAIN,
$result->retval[0]->vorname
));
}
if (hasData($result))
{
foreach (getData($result) as $stgl)
{
$stglMailAdress_arr[]= array(
'to' => $stgl->uid. '@'. DOMAIN,
'vorname' => $stgl->vorname
);
}
return $stglMailAdress_arr;
}
// ...otherwise get assistance mail address
else
{
$result = $this->StudiengangModel->load($stg_kz);
if (isSuccess($result) && hasData($result))
if (hasData($result))
{
return success(array(
return array(
$result->retval[0]->email,
''
));
);
}
else
{
return error('Keine E-Mail für diesen Stg gefunden');
return false;
}
}
}
@@ -180,13 +180,17 @@ class reviewAnrechnungUebersicht extends Auth_Controller
}
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
$this->_checkIfEntitledToReadDMSDoc($dms_id);
// Set filename to be used on downlaod
$filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
// Get file to be downloaded from DMS
$download = $this->dmslib->download($dms_id, $filename);
if (isError($download)) return $download;
// Download file
$this->dmslib->download($dms_id, $filename);
$this->outputFile(getData($download));
}
@@ -253,20 +257,10 @@ class reviewAnrechnungUebersicht extends Auth_Controller
// Send mail to STGL of each studiengang
foreach ($studiengang_kz_arr as $studiengang_kz)
{
// Get STGL mail address, if available, otherwise get assistance mail address
$stgmail = $this->_getSTGLMailAddress($studiengang_kz);
if(isSuccess($stgmail) && hasData($stgmail))
list ($to, $vorname) = getData($stgmail)[0];
else
show_error ('Failed retrieving DegreeProgram Mail');
// Get full name of lector
$this->load->model('person/Person_model', 'PersonModel');
if (!$lector_name = getData($this->PersonModel->getFullName($this->_uid)))
{
show_error ('Failed retrieving person');
}
$result = $this->PersonModel->getFullName($this->_uid);
$lector_name = hasData($result) ? getData($result) : 'Ein Lektor';
// Link to Antrag genehmigen
$url =
@@ -274,22 +268,26 @@ class reviewAnrechnungUebersicht extends Auth_Controller
CIS_ROOT. 'cis/menu.php?content_id=&content='.
CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI;
// Prepare mail content
$body_fields = array(
'vorname' => $vorname,
'lektor_name' => $lector_name,
'empfehlung' => $empfehlung ? 'positive' : 'negative',
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
// Get STGL mail address, if available, otherwise get assistance mail address
if (!$result = $this->_getSTGLMailAddress($studiengang_kz)) return false;
foreach ($result as $stgl)
{
// Prepare mail content
$body_fields = array(
'vorname' => $stgl['vorname'],
'lektor_name' => $lector_name,
'empfehlung' => $empfehlung ? 'positive' : 'negative',
'link' => anchor($url, 'Anrechnungsanträge Übersicht')
);
sendSanchoMail(
'AnrechnungEmpfehlungAbgeben',
$body_fields,
$to,
'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben'
);
sendSanchoMail(
'AnrechnungEmpfehlungAbgeben',
$body_fields,
$stgl['to'],
'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben'
);
}
}
return true;
}
@@ -300,28 +298,33 @@ class reviewAnrechnungUebersicht extends Auth_Controller
$result = $this->StudiengangModel->getLeitung($stg_kz);
// Get STGL mail address, if available
if (isSuccess($result) && hasData($result))
{
return success(array(
$result->retval[0]->uid. '@'. DOMAIN,
$result->retval[0]->vorname
));
}
if (hasData($result))
{
foreach (getData($result) as $stgl)
{
$stglMailAdress_arr[]= array(
'to' => $stgl->uid. '@'. DOMAIN,
'vorname' => $stgl->vorname
);
}
return $stglMailAdress_arr;
}
// ...otherwise get assistance mail address
else
{
$result = $this->StudiengangModel->load($stg_kz);
if (isSuccess($result) && hasData($result))
if (hasData($result))
{
return success(array(
return array(
$result->retval[0]->email,
''
));
);
}
else
{
return error('Keine E-Mail für diesen Stg gefunden');
return false;
}
}
}
@@ -138,7 +138,7 @@ class Studiensemester extends Auth_Controller
$start = $this->input->post("semstart");
$ende = $this->input->post("semende");
$studienjahr_kurzbz = $this->input->post("studienjahrkurzbz");
$beschreibung = $this->input->post("beschreibung");
$beschreibung = isEmptyString($this->input->post("beschreibung")) ? null : $this->input->post("beschreibung");
$onlinebewerbung = $this->input->post("onlinebewerbung");
$onlinebewerbung = isset($onlinebewerbung);
@@ -7,8 +7,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
*/
class BPKWartung extends Auth_Controller
{
private $_uid; // contains the UID of the logged user
/**
* Constructor
*/
@@ -46,7 +44,7 @@ class BPKWartung extends Auth_Controller
// Public methods
/**
* Main page of the InfoCenter tool
* Main page of the bPK Wartung.
*/
public function index()
{
@@ -56,9 +54,7 @@ class BPKWartung extends Auth_Controller
}
/**
* Personal details page of the InfoCenter tool
* Initialization function, gets person and prestudent data and loads the view with the data
* @param $person_id
* bPK Details initialization function, gets person data and loads the view with the data.
*/
public function showDetails()
{
@@ -85,8 +81,7 @@ class BPKWartung extends Auth_Controller
}
/**
* Saves a ZGV for a prestudent, includes Ort, Datum, Nation for bachelor and master
* @param $prestudent_id
* Saves a bPK for a person.
*/
public function saveBPK()
{
@@ -112,7 +107,7 @@ class BPKWartung extends Auth_Controller
// Private methods
/**
* Loads all necessary Person data: Stammdaten (name, svnr, contact, ...), Dokumente, Logs and Notizen
* Loads all necessary Person data.
* @param $person_id
* @return array
*/
@@ -0,0 +1,254 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Page for managing groups of which user is the manager
*/
class Gruppenmanagement extends Auth_Controller
{
private $_uid; // contains the UID of the logged user
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'lehre/gruppenmanager:r',
'showBenutzergruppe' => 'lehre/gruppenmanager:r',
'getBenutzer' => 'lehre/gruppenmanager:r',
'getAllBenutzer' => 'lehre/gruppenmanager:r',
'addBenutzer' => 'lehre/gruppenmanager:rw',
'removeBenutzer' => 'lehre/gruppenmanager:rw'
)
);
// Loads models
$this->load->model('person/benutzer_model', 'BenutzerModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel');
$this->load->model('system/Log_model', 'LogModel');
$this->load->library('WidgetLib');
$this->loadPhrases(
array(
'global',
'person',
'lehre',
'ui',
'filter',
'gruppenmanagement'
)
);
$this->setControllerId(); // sets the controller id
$this->_setAuthUID(); // sets property uid
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Main page
*/
public function index()
{
$this->load->view(
'person/gruppenmanagement/gruppenmanagement.php',
array('uid' => $this->_uid)
);
}
/**
* Shows Benutzergruppe overview page.
*/
public function showBenutzergruppe()
{
$this->_setNavigationMenuShowDetails();
$gruppe_kurzbz = $this->input->get('gruppe_kurzbz');
$data[self::FHC_CONTROLLER_ID] = $this->getControllerId();
$this->load->view(
'person/gruppenmanagement/benutzergruppe.php',
array('gruppe_kurzbz' => $gruppe_kurzbz)
);
}
/**
* Gets Benutzer assigned to a Gruppe
*/
public function getBenutzer()
{
$gruppe_kurzbz = $this->input->get('gruppe_kurzbz');
$this->BenutzergruppeModel->addSelect('uid, vorname, nachname, ben.aktiv');
$this->BenutzergruppeModel->addJoin('public.tbl_benutzer ben', 'uid');
$this->BenutzergruppeModel->addJoin('public.tbl_person', 'person_id');
$benutzerRes = $this->BenutzergruppeModel->loadWhere(array('gruppe_kurzbz' => $gruppe_kurzbz));
$this->outputJson($benutzerRes);
}
/**
* Gets all Benutzer for assignment to Gruppe
*/
public function getAllBenutzer()
{
$this->BenutzerModel->addSelect('uid, vorname, nachname');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id');
$benutzerRes = $this->BenutzerModel->loadWhere(
array('tbl_benutzer.aktiv' => true)
);
$this->outputJson($benutzerRes);
}
/**
* Adds a Benutzer to Gruppe
*/
public function addBenutzer()
{
$uid = $this->input->post('uid');
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
if (isEmptyString($uid))
$result = error('Uid missing');
else
{
$benutzerExistsRes = $this->BenutzergruppeModel->loadWhere(
array(
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz
)
);
if (isError($benutzerExistsRes))
{
$this->outputJsonError(getError($benutzerExistsRes));
return;
}
if (hasData($benutzerExistsRes))
{
$this->outputJsonError($this->p->t('gruppenmanagement', 'benutzerSchonZugewiesen'));
return;
}
$result = $this->BenutzergruppeModel->insert(
array(
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => $this->_uid
)
);
// log the group add
$lastQry = $this->db->last_query();
if (isSuccess($result))
{
$beschreibung = 'Gruppenmanagement: Nutzer zu Gruppe hinzugefügt';
$this->_writeLog($this->_uid, $beschreibung, $lastQry);
}
}
$this->outputJson($result);
}
/**
* Removes Benutzer from Gruppe
*/
public function removeBenutzer()
{
$uid = $this->input->post('uid');
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
if (isEmptyString($uid))
$result = error('Uid missing');
else
{
$result = $this->BenutzergruppeModel->delete(
array(
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz
)
);
}
// log the group remove
$lastQry = $this->db->last_query();
if (isSuccess($result))
{
$beschreibung = 'Gruppenmanagement: Nutzer aus Gruppe entfernt';
$this->_writeLog($this->_uid, $beschreibung, $lastQry);
}
$this->outputJson($result);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Define the navigation menu for the showDetails page
*/
private function _setNavigationMenuShowDetails()
{
$this->load->library('NavigationLib', array('navigation_page' => 'person/Gruppenmanagement/showBenutzergruppe'));
$link = site_url('person/Gruppenmanagement');
$this->navigationlib->setSessionMenu(
array(
'back' => $this->navigationlib->oneLevel(
'Zurück', // description
$link, // link
array(), // children
'angle-left', // icon
true, // expand
null, // subscriptDescription
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
1 // sort
)
)
);
}
/**
* Set uid of authentificated user
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
/**
* Writes an entry in the log table
*/
private function _writeLog($uid, $beschreibung, $lastQry)
{
$mitarbeiterResult = $this->MitarbeiterModel->load(array('mitarbeiter_uid'=>$this->_uid));
if(!isSuccess($mitarbeiterResult) || !hasData($mitarbeiterResult))
{
$uid = DUMMY_LEKTOR_UID;
$beschreibung .= ': '.$this->_uid;
$beschreibung = mb_substr($beschreibung, 0, 64);
}
$this->LogModel->insert(array(
'mitarbeiter_uid' => $uid,
'beschreibung' => $beschreibung,
'sql' => $lastQry
));
}
}
@@ -1,4 +1,20 @@
<?php
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Test Search Vue Component
*/
class TestSearch extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'system/developer:r'
)
);
// Loads WidgetLib
$this->load->library('WidgetLib');
// Loads phrases system
$this->loadPhrases(
array(
'global',
'ui',
'filter'
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
*/
public function index()
{
$this->load->view('system/logs/testSearch.php');
}
}
+4 -4
View File
@@ -18,10 +18,10 @@ class Variables extends Auth_Controller
{
parent::__construct(
array(
'setVar' => 'basis/variable:rw',
'getVar' => 'basis/variable:rw',
'changeStudiensemesterVar' => 'basis/variable:rw',
'changeStudengangsTypVar' => 'basis/variable:rw'
'setVar' => array('basis/variable:rw','basis/variable_persoenlich:rw'),
'getVar' => array('basis/variable:rw','basis/variable_persoenlich:rw'),
'changeStudiensemesterVar' => array('basis/variable:rw','basis/variable_persoenlich:rw'),
'changeStudengangsTypVar' => array('basis/variable:rw','basis/variable_persoenlich:rw')
)
);
@@ -88,6 +88,12 @@ class InfoCenter extends Auth_Controller
'message' => 'Type of Document %s was updated, set to %s',
'success' => null
),
'deletedoc' => array(
'logtype' => 'Action',
'name' => 'Document deleted',
'message' => 'Document %s deleted',
'success' => null
),
);
// Name of Interessentenstatus
@@ -103,8 +109,8 @@ class InfoCenter extends Auth_Controller
* Constructor
*/
public function __construct()
{
parent::__construct(
{
parent::__construct(
array(
'index' => 'infocenter:r',
'freigegeben' => 'infocenter:r',
@@ -115,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',
@@ -131,6 +138,7 @@ class InfoCenter extends Auth_Controller
'reloadZgvPruefungen' => 'infocenter:r',
'reloadMessages' => 'infocenter:r',
'reloadDoks' => 'infocenter:r',
'reloadUebersichtDoks' => 'infocenter:r',
'reloadNotizen' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'reloadLogs' => 'infocenter:r',
'outputAkteContent' => array('infocenter:r', 'lehre/zgvpruefung:r'),
@@ -142,7 +150,9 @@ class InfoCenter extends Auth_Controller
'getStudienjahrEnd' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'setNavigationMenuArrayJson' => 'infocenter:r',
'getAbsageData' => 'infocenter:r',
'saveAbsageForAll' => 'infocenter:rw'
'saveAbsageForAll' => 'infocenter:rw',
'deleteDoc' => 'infocenter:rw',
'getStudienartData' => 'infocenter:rw'
)
);
@@ -156,14 +166,23 @@ class InfoCenter extends Auth_Controller
$this->load->model('crm/ZGVPruefungStatus_model', 'ZGVPruefungStatusModel');
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('system/Message_model', 'MessageModel');
$this->load->model('system/Filters_model', 'FiltersModel');
$this->load->model('system/PersonLock_model', 'PersonLockModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$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');
$this->load->model('CL/Messages_model', 'CLMessagesModel');
// Loads libraries
$this->load->library('PersonLogLib');
$this->load->library('WidgetLib');
$this->load->config('infocenter');
$this->loadPhrases(
array(
'global',
@@ -180,7 +199,7 @@ class InfoCenter extends Auth_Controller
$this->load->library('VariableLib', array('uid' => $this->_uid));
$this->setControllerId(); // sets the controller id
}
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
@@ -388,7 +407,7 @@ class InfoCenter extends Auth_Controller
'saveformalgep',
array(
isEmptyString($akte->retval[0]->titel) ? $akte->retval[0]->bezeichnung : $akte->retval[0]->titel,
is_null($timestamp) ? 'NULL' : $timestamp
is_null($timestamp) ? 'null' : $timestamp
)
);
}
@@ -398,6 +417,35 @@ class InfoCenter extends Auth_Controller
$this->outputJsonSuccess(array($json));
}
public function deleteDoc($person_id)
{
$akte_id = $this->input->post('akteid');
if (isset($akte_id) && isset($person_id))
{
$this->load->library('AkteLib');
$akte = $this->aktelib->get($akte_id);
if (hasData($akte))
{
$akte = getData($akte);
if ($akte->person_id === (int)$person_id)
{
$result = $this->aktelib->remove($akte_id);
if (isError($result))
{
$this->terminateWithJsonError('Error deleting document');
}
$this->_log($person_id, 'deletedoc', array($akte->bezeichnung));
$this->outputJsonSuccess('success');
}
}
}
}
/**
* Gets prestudent data for a person in json format
* @param $person_id
@@ -560,7 +608,8 @@ class InfoCenter extends Auth_Controller
/**
* Sendet bei einer neuen ZGV Prüfung die Mail raus an den Studiengang
*/
private function sendZgvMail($mail, $typ, $person){
private function sendZgvMail($mail, $typ, $person)
{
$data = array(
'vorname' => $person->vorname,
'nachname' => $person->nachname,
@@ -644,7 +693,6 @@ class InfoCenter extends Auth_Controller
'openZgv' => $openZgv
)
);
}
/**
@@ -818,7 +866,7 @@ class InfoCenter extends Auth_Controller
$person_id = $logdata['person_id'];
$akteresult = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'formal_geprueft_amum !=' => NULL));
$akteresult = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'formal_geprueft_amum !=' => null));
if (hasData($lastStatus) && isSuccess($akteresult))
{
@@ -1037,8 +1085,23 @@ class InfoCenter extends Auth_Controller
*/
public function reloadMessages($person_id)
{
$messages = $this->MessageModel->getMessagesOfPerson($person_id, 1);
$this->load->view('system/infocenter/messageList.php', array('messages' => $messages->retval));
$messages = $this->CLMessagesModel->getReceivedAndSentMessages($person_id);
// If there are messages
if (hasData($messages))
{
$personexists = $this->PersonModel->load($person_id);
if (isError($personexists)) show_error(getError($personexists));
if (!hasData($personexists)) show_error('Person does not exist!');
$this->load->view('system/infocenter/messageList.php', getData($messages));
}
elseif (isError($messages)) // Otherwise if an error occurred
{
show_error(getError($messages));
}
}
/**
@@ -1069,11 +1132,22 @@ 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, false);
$this->DokumentModel->addOrder('bezeichnung');
$dokumentdata = array('dokumententypen' => (getData($this->DokumentModel->load())));
$data = array_merge($dokumentdata, ['dokumente' => $dokumente->retval]);
$this->load->view('system/infocenter/dokpruefung.php', $data);
}
/**
* Outputs content of an Akte, sends appropriate headers (so the document can be downloaded)
* @param $akte_id
@@ -1169,7 +1243,9 @@ class InfoCenter extends Auth_Controller
$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);
$result = $this->personloglib->setOnHold(
$person_id, date_format(date_create($date), 'Y-m-d'), self::TAETIGKEIT, self::APP, null, $this->_uid
);
$this->outputJson($result);
}
@@ -1267,10 +1343,129 @@ 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');
$nachreichungAnmerkung = empty($this->input->post('nachreichungAnmerkung')) ? NULL : $this->input->post('nachreichungAnmerkung');
$nachreichungAnmerkung = empty($this->input->post('nachreichungAnmerkung')) ? null : $this->input->post('nachreichungAnmerkung');
$typ = $this->input->post('typ');
$allowedTypes = [
@@ -1327,14 +1522,14 @@ class InfoCenter extends Auth_Controller
array(
'dokument_kurzbz' => $allowedTypes[$typ],
'person_id' => $person_id,
'erstelltam' => NULL,
'erstelltam' => null,
'gedruckt' => false,
'anmerkung' => $nachreichungAnmerkung,
'updateamum' => $today,
'updatevon' => get_uid(),
'insertamum' => $today,
'insertvon' => get_uid(),
'uid' => NULL,
'uid' => null,
'nachgereicht' => true,
'nachgereicht_am' => $nachreichungAm
)
@@ -1343,6 +1538,78 @@ class InfoCenter extends Auth_Controller
$this->outputJsonSuccess("Done!");
}
/**
* One day I'll be given some nice comment
*/
public function getAbsageData()
{
$stg_typ = $this->getStudienArtBerechtigung(['b', 'm']);
if (!is_null($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);
$data = array (
'statusgruende' => $statusgruende,
'studiengaenge' => $studiengaenge->retval
);
$this->outputJsonSuccess($data);
}
else
$this->outputJsonSuccess(null);
}
/**
* One day I'll be given some nice comment
*/
public function getStudienArtBerechtigung($typ = null)
{
$studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter');
$stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, $typ);
return getData($stg_typ);
}
/**
* One day I'll be given some nice comment
*/
public function getStudienartData()
{
$this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l']));
}
/**
* One day I'll be given some nice comment
*/
public function saveAbsageForAll()
{
$statusgrund = $this->input->post('statusgrund');
$studiengang = $this->input->post('studiengang');
$abgeschickt = $this->input->post('abgeschickt');
$personen = $this->input->post('personen');
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen))
$this->terminateWithJsonError("Bitte füllen Sie alle Felder aus");
foreach($personen as $person)
{
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt);
if (!hasData($prestudent))
continue;
$prestudentData = getData($prestudent);
$this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
}
$this->outputJsonSuccess("Success");
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
@@ -1741,21 +2008,21 @@ 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))
{
show_error(getError($dokumente_nachgereicht));
}
$messages = $this->MessageModel->getMessagesOfPerson($person_id, 1);
$messages = $this->CLMessagesModel->getReceivedAndSentMessages($person_id);
if (isError($messages))
{
@@ -1788,13 +2055,13 @@ class InfoCenter extends Auth_Controller
$data = array (
'lockedby' => $lockedby,
'lockedbyother' => $lockedbyother,
'stammdaten' => $stammdaten->retval,
'dokumente' => $dokumente->retval,
'dokumente_nachgereicht' => $dokumente_nachgereicht->retval,
'messages' => $messages->retval,
'stammdaten' => getData($stammdaten),
'dokumente' => getData($dokumente),
'dokumente_nachgereicht' => getData($dokumente_nachgereicht),
'messages' => getData($messages) == null ? array() : getData($messages),
'logs' => $logs,
'notizen' => $notizen->retval,
'notizenbewerbung' => $notizen_bewerbung->retval
'notizen' => getData($notizen),
'notizenbewerbung' => getData($notizen_bewerbung)
);
return $data;
@@ -1832,15 +2099,21 @@ class InfoCenter extends Auth_Controller
//get orgform for german and english
if (isset($zgvpruefung->prestudentstatus->bezeichnung_orgform) && is_array($zgvpruefung->prestudentstatus->bezeichnung_orgform))
{
$zgvpruefung->prestudentstatus->bezeichnung_orgform_german = getPhraseByLanguage($zgvpruefung->prestudentstatus->bezeichnung_orgform, 'German');
$zgvpruefung->prestudentstatus->bezeichnung_orgform_english = getPhraseByLanguage($zgvpruefung->prestudentstatus->bezeichnung_orgform, 'English');
$zgvpruefung->prestudentstatus->bezeichnung_orgform_german = getPhraseByLanguage(
$zgvpruefung->prestudentstatus->bezeichnung_orgform, 'German'
);
$zgvpruefung->prestudentstatus->bezeichnung_orgform_english = getPhraseByLanguage(
$zgvpruefung->prestudentstatus->bezeichnung_orgform, 'English'
);
}
$position = strpos($zgvpruefung->prestudentstatus->anmerkung, 'Alt:');
//parse Anmerkung for Alternative (Prio is given in orgform and sprache anyway)
$zgvpruefung->prestudentstatus->alternative = is_numeric($position) ? substr($zgvpruefung->prestudentstatus->anmerkung, $position) : null;
$zgvpruefung->prestudentstatus->alternative = is_numeric($position) ?
substr($zgvpruefung->prestudentstatus->anmerkung, $position) : null;
}
//if prestudent is not interessent or is already bestaetigt, then show only as information, non-editable
$zgvpruefung->infoonly = !isset($zgvpruefung->prestudentstatus)
|| isset($zgvpruefung->prestudentstatus->bestaetigtam)
@@ -1851,15 +2124,21 @@ class InfoCenter extends Auth_Controller
//wether prestudent was freigegeben for RT/Stg
$zgvpruefung->isRtFreigegeben = false;
$zgvpruefung->isStgFreigegeben = false;
$zgvpruefung->sendStgFreigabeMsg = true;//wether Stgudiengangfreigabemessage can be sent (for "exceptions", Studiengänge with no message sending)
// Wether Stgudiengangfreigabemessage can be sent (for "exceptions", Studiengänge with no message sending)
$zgvpruefung->sendStgFreigabeMsg = true;
$isFreigegeben = null;
if (isset($zgvpruefung->prestudentstatus->studiensemester_kurzbz))
{
$this->PrestudentstatusModel->addSelect('bestaetigtam, statusgrund_id, tbl_status_grund.bezeichnung_mehrsprachig AS bezeichnung_statusgrund');
$this->PrestudentstatusModel->addSelect(
'bestaetigtam, statusgrund_id, tbl_status_grund.bezeichnung_mehrsprachig AS bezeichnung_statusgrund'
);
$this->PrestudentstatusModel->addJoin('public.tbl_status_grund', 'statusgrund_id', 'LEFT');
$isFreigegeben = $this->PrestudentstatusModel->loadWhere(array('studiensemester_kurzbz' => $zgvpruefung->prestudentstatus->studiensemester_kurzbz,
'tbl_prestudentstatus.status_kurzbz' => self::INTERESSENTSTATUS, 'prestudent_id' => $prestudent->prestudent_id));
$isFreigegeben = $this->PrestudentstatusModel->loadWhere(array(
'studiensemester_kurzbz' => $zgvpruefung->prestudentstatus->studiensemester_kurzbz,
'tbl_prestudentstatus.status_kurzbz' => self::INTERESSENTSTATUS,
'prestudent_id' => $prestudent->prestudent_id)
);
}
if (hasData($isFreigegeben))
@@ -1868,11 +2147,14 @@ class InfoCenter extends Auth_Controller
{
if (isset($prestudentstatus->bestaetigtam))
{
//if statusgrund set - freigegeben for Studiengang, otherwise freigegeben for RT
// If statusgrund set - freigegeben for Studiengang, otherwise freigegeben for RT
if (isset($prestudentstatus->statusgrund_id))
{
if (isset($prestudentstatus->bezeichnung_statusgrund[0])
&& in_array($prestudentstatus->bezeichnung_statusgrund[0], $this->_statusgruendeNoStgFreigabeMessage))
&& in_array(
$prestudentstatus->bezeichnung_statusgrund[0],
$this->_statusgruendeNoStgFreigabeMessage)
)
$zgvpruefung->sendStgFreigabeMsg = false;
else
$zgvpruefung->isStgFreigegeben = true;
@@ -1882,43 +2164,52 @@ class InfoCenter extends Auth_Controller
$zgvpruefung->isRtFreigegeben = true;
}
}
}
}
//application priority change possible?
$zgvpruefung->changeup = false;
$zgvpruefung->changedown = false;
$zgvpruefung->hasBewerber = false;
if (isset($zgvpruefung->prestudentstatus->status_kurzbz) && $zgvpruefung->prestudentstatus->status_kurzbz == self::INTERESSENTSTATUS)
{
if (isset($zgvpruefung->prestudentstatus->studiensemester_kurzbz))
{
$studiensemester = $zgvpruefung->prestudentstatus->studiensemester_kurzbz;
//show warning if there is already another bewerber (RT result already exists)
$bewerber = $this->PersonModel->hasBewerber($person_id, $studiensemester, 'b');
if (hasData($bewerber))
{
$bewerbercnt = getData($bewerber);
if (is_numeric($bewerbercnt[0]->anzahl_bewerber) && $bewerbercnt[0]->anzahl_bewerber > 0)
{
$zgvpruefung->hasBewerber = true;
}
}
$zgvpruefung->changeup = $this->PrestudentModel->checkPrioChange($zgvpruefung->prestudent_id, $studiensemester, -1);
$zgvpruefung->changedown = $this->PrestudentModel->checkPrioChange($zgvpruefung->prestudent_id, $studiensemester, 1);
}
}
// Application priority change possible?
$zgvpruefung->changeup = false;
$zgvpruefung->changedown = false;
$zgvpruefung->hasBewerber = false;
if (isset($zgvpruefung->prestudentstatus->status_kurzbz)
&& $zgvpruefung->prestudentstatus->status_kurzbz == self::INTERESSENTSTATUS)
{
if (isset($zgvpruefung->prestudentstatus->studiensemester_kurzbz))
{
$studiensemester = $zgvpruefung->prestudentstatus->studiensemester_kurzbz;
//show warning if there is already another bewerber (RT result already exists)
$bewerber = $this->PersonModel->hasBewerber($person_id, $studiensemester, 'b');
if (hasData($bewerber))
{
$bewerbercnt = getData($bewerber);
if (is_numeric($bewerbercnt[0]->anzahl_bewerber) && $bewerbercnt[0]->anzahl_bewerber > 0)
{
$zgvpruefung->hasBewerber = true;
}
}
$zgvpruefung->changeup = $this->PrestudentModel->checkPrioChange(
$zgvpruefung->prestudent_id, $studiensemester, -1
);
$zgvpruefung->changedown = $this->PrestudentModel->checkPrioChange(
$zgvpruefung->prestudent_id, $studiensemester, 1
);
}
}
$zgvExist = $this->ZGVPruefungModel->loadWhere(array('prestudent_id' => $zgvpruefung->prestudent_id));
if (isSuccess($zgvExist) && hasData($zgvExist))
if (isSuccess($zgvExist) && hasData($zgvExist))
{
$this->ZGVPruefungStatusModel->addOrder('datum', 'DESC');
$this->ZGVPruefungStatusModel->addLimit(1);
$statusZGV = $this->ZGVPruefungStatusModel->loadWhere(array('zgvpruefung_id' => $zgvExist->retval[0]->zgvpruefung_id));
$statusZGV = $this->ZGVPruefungStatusModel->loadWhere(
array(
'zgvpruefung_id' => $zgvExist->retval[0]->zgvpruefung_id
)
);
if (isSuccess($statusZGV) && hasData($statusZGV))
$zgvpruefung->statusZGV = $statusZGV->retval[0]->status;
@@ -1932,10 +2223,33 @@ class InfoCenter extends Auth_Controller
$abwstatusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval;
$intstatusgruende = $this->StatusgrundModel->getStatus(self::INTERESSENTSTATUS)->retval;
$data = array (
$studienArtBerechtigung = array_column($this->getStudienArtBerechtigung(), 'typ');
$this->ZgvModel->addOrder('zgv_bez');
$allZGVs = getData($this->ZgvModel->load());
$this->ZgvModel->addOrder('zgvmas_bez');
$allZGVsMaster = getData($this->ZgvmasterModel->load());
$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,
'intstatusgruende' => $intstatusgruende
'intstatusgruende' => $intstatusgruende,
'studienArtBerechtigung' => $studienArtBerechtigung,
'all_zgvs' => $allZGVs,
'all_zgvs_master' => $allZGVsMaster,
'all_nations' => $allNations,
'additional_stg' => $additional_stg,
'all_genders' => $allGenders
);
return $data;
@@ -1949,7 +2263,7 @@ class InfoCenter extends Auth_Controller
{
$this->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
@usort($zgvpruefungen, function ($a, $b) {
@usort($zgvpruefungen, function($a, $b) {
//sort:
// 1: Studiensemester
if (isset($a->prestudentstatus->studiensemester_kurzbz) || isset($b->prestudentstatus->studiensemester_kurzbz))
@@ -2050,7 +2364,13 @@ class InfoCenter extends Auth_Controller
$studiengang_mail = $prestudentdata->studiengangmail;
$studiengang_typ = $prestudentdata->studiengangtyp;
return array('person_id' => $person_id, 'studiengang_kurzbz' => $studiengang_kurzbz, 'studiengang_bezeichnung' => $studiengang_bezeichnung, 'studiengang_mail' => $studiengang_mail, 'studiengang_typ' => $studiengang_typ);
return array(
'person_id' => $person_id,
'studiengang_kurzbz' => $studiengang_kurzbz,
'studiengang_bezeichnung' => $studiengang_bezeichnung,
'studiengang_mail' => $studiengang_mail,
'studiengang_typ' => $studiengang_typ
);
}
/**
@@ -2096,8 +2416,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';
@@ -2126,8 +2446,13 @@ class InfoCenter extends Auth_Controller
foreach ($dokumenteNachzureichen as $dokument)
{
$anmerkung = !isEmptyString($dokument->anmerkung) ? ' | Anmerkung: '.$dokument->anmerkung : '';
$nachgereichtam = !isEmptyString($dokument->nachgereicht_am) ? ' | wird nachgereicht bis '.date_format(date_create($dokument->nachgereicht_am), 'd.m.Y') : '';
$dokumenteNachzureichenMail[] = array('dokument_bezeichnung' => $dokument->dokument_bezeichnung, 'anmerkung' => $anmerkung, 'nachgereicht_am' => $nachgereichtam);
$nachgereichtam = !isEmptyString($dokument->nachgereicht_am) ?
' | wird nachgereicht bis '.date_format(date_create($dokument->nachgereicht_am), 'd.m.Y') : '';
$dokumenteNachzureichenMail[] = array(
'dokument_bezeichnung' => $dokument->dokument_bezeichnung,
'anmerkung' => $anmerkung,
'nachgereicht_am' => $nachgereichtam
);
}
$notizenBewerbung = $this->NotizModel->getNotizByTitel($person_id, 'Anmerkung zur Bewerbung')->retval;
@@ -2156,11 +2481,6 @@ class InfoCenter extends Auth_Controller
'nachname' => $person->nachname,
'prestudentid' => $prestudent_id,
'statusgrund' => $statusgrund,
/*'zgvbez' => $prestudent->zgv_bez,
'zgvort' => $zgvort,
'zgvdatum' => $zgvdatum,
'zgvnation' => $zgvnation,
*/
'notizentext' => $notizentext,
'dokumente' => $dokumenteMail,
'dokumente_nachgereicht' => $dokumenteNachzureichenMail,
@@ -2170,7 +2490,11 @@ class InfoCenter extends Auth_Controller
$this->load->library('LogLib');
$this->load->helper('hlp_sancho');
$subject = ($person->geschlecht == 'm' ? 'Interessent ' : 'Interessentin ').$person->vorname.' '.$person->nachname.' für '.$prestudentstatus->studiengangbezeichnung.$orgform.' freigegeben';
$subject = ($person->geschlecht == 'm' ? 'Interessent ' : 'Interessentin ').
$person->vorname.' '.
$person->nachname.' für '.
$prestudentstatus->studiengangbezeichnung.
$orgform.' freigegeben';
$receiver = $prestudent->studiengangmail;
@@ -2191,46 +2515,5 @@ class InfoCenter extends Auth_Controller
$this->loglib->logError('Studiengang has no mail for sending Freigabe mail');
}
}
public function getAbsageData()
{
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$statusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval;
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
$studiengaenge = $this->StudiengangModel->getStudiengaengeWithOrgForm(['b', 'm'], $studienSemester);
$data = array (
'statusgruende' => $statusgruende,
'studiengaenge' => $studiengaenge->retval
);
$this->outputJsonSuccess($data);
}
public function saveAbsageForAll()
{
$statusgrund = $this->input->post('statusgrund');
$studiengang = $this->input->post('studiengang');
$abgeschickt = $this->input->post('abgeschickt');
$personen = $this->input->post('personen');
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen))
$this->terminateWithJsonError("Bitte füllen Sie alle Felder aus");
foreach($personen as $person)
{
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt);
if (!hasData($prestudent))
continue;
$prestudentData = getData($prestudent);
$this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
}
$this->outputJsonSuccess("Success");
}
}
@@ -6,7 +6,7 @@ class Issues extends Auth_Controller
{
private $_uid;
const FUNKTION_KURZBZ = 'ass'; // // user having this funktion can see issues for oes assigned with this funktion
const FUNKTION_KURZBZ = 'ass'; // user having this funktion can see issues for oes assigned with this funktion
const BERECHTIGUNG_KURZBZ = 'system/issues_verwalten'; // user having this permission can see issues for oes assigned with this permission
public function __construct()
@@ -39,6 +39,7 @@ class Issues extends Auth_Controller
);
$this->_setAuthUID(); // sets property uid
$this->setControllerId(); // sets the controller id
}
public function index()
@@ -80,7 +81,7 @@ class Issues extends Auth_Controller
}
if (isEmptyString($changeIssueMethod))
$errors[] = error("Invalid issue status given");
$errors[] = "Invalid issue status given";
else
{
$issueRes = $this->issueslib->{$changeIssueMethod}($issue_id, $user);
@@ -127,7 +128,7 @@ class Issues extends Auth_Controller
{
$all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz;
// separate oes for the funktion needed for displaying issues
// separate oes for the additional funktion which enables displaying issues
if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ)
{
$oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz;
@@ -153,7 +154,9 @@ class Issues extends Auth_Controller
}
// add oes for which there is the "manage issues" Berechtigung
if (!$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ))
$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ);
if (!$oe_kurzbz_berechtigt)
show_error('No permission or error when checking permissions');
$all_oe_kurzbz_berechtigt = array_unique(array_merge($oe_kurzbz_for_funktion, $oe_kurzbz_berechtigt));
@@ -0,0 +1,217 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class IssuesZustaendigkeiten extends Auth_Controller
{
private $_uid;
public function __construct()
{
parent::__construct(
array(
'index' => 'admin:r',
'getApps' => 'admin:r',
'getFehlercodes' => 'admin:r',
'getNonAssignedZustaendigkeiten' => 'admin:r',
'addZustaendigkeit' => 'admin:rw',
'deleteZustaendigkeit' => 'admin:rw'
)
);
// Load libraries
$this->load->library('IssuesLib');
$this->load->library('WidgetLib');
// 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(
array(
'global',
'ui',
'filter',
'lehre',
'person',
'fehlermonitoring'
)
);
$this->_setAuthUID(); // sets property uid
$this->setControllerId(); // sets the controller id
}
public function index()
{
$this->load->view("system/issues/issuesZustaendigkeiten.php");
}
/**
* Loads all Apps to which Fehler exist.
*/
public function getApps()
{
$this->FehlerModel->addDistinct();
$this->FehlerModel->addSelect('app');
$this->FehlerModel->addOrder('app');
$appRes = $this->FehlerModel->load();
$this->outputJson($appRes);
}
/**
* Gets all fehlercodes, optionally by app.
*/
public function getFehlercodes()
{
$app = $this->input->get('app');
//$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz');
$this->FehlerModel->addOrder('fehlercode');
$fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load();
$this->outputJson($fehlerRes);
}
/**
* Gets all Mitarbeiter, Organisationseinheiten, Funktionen not assigned to a Fehler yet.
*/
public function getNonAssignedZustaendigkeiten()
{
$fehlercode = $this->input->get('fehlercode');
$mitarbeiterRes = $this->FehlerzustaendigkeitenModel->getNonAssignedMitarbeiter($fehlercode);
if (isError($mitarbeiterRes))
{
$this->outputJsonError(getError($mitarbeiterRes));
return;
}
$this->OrganisationseinheitModel->addSelect('oe_kurzbz, bezeichnung, organisationseinheittyp_kurzbz');
$this->OrganisationseinheitModel->addOrder('organisationseinheittyp_kurzbz, bezeichnung');
$oeRes = $this->OrganisationseinheitModel->loadWhere(array('aktiv' => true));
if (isError($oeRes))
{
$this->outputJsonError(getError($oeRes));
return;
}
$oe_funktionen = array();
if (hasData($oeRes))
{
$oes = getData($oeRes);
foreach ($oes as $oe)
{
$oe->funktionen = array();
$funktionRes = $this->FehlerzustaendigkeitenModel->getNonAssignedFunktionen($fehlercode, $oe->oe_kurzbz);
if (isError($funktionRes))
{
$this->outputJsonError(getError($oeRes));
return;
}
$funktionData = getData($funktionRes);
$oe->funktionen = $funktionData;
$oe_funktionen[] = $oe;
}
}
if (isError($funktionRes))
{
$this->outputJsonError(getError($funktionRes));
return;
}
$result = array(
'mitarbeiter' => getData($mitarbeiterRes),
'oe_funktionen' => $oe_funktionen
);
$this->outputJsonSuccess($result);
}
/**
* Adds a Zuständigkeit after performing error checks.
*/
public function addZustaendigkeit()
{
$fehlercode = $this->input->post('fehlercode');
$mitarbeiter_person_id = $this->input->post('mitarbeiter_person_id');
$oe_kurzbz = $this->input->post('oe_kurzbz');
$funktion_kurzbz = $this->input->post('funktion_kurzbz');
if (isEmptyString($fehlercode))
$this->outputJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt'));
elseif (isEmptyString($mitarbeiter_person_id) && isEmptyString($oe_kurzbz))
$this->outputJsonError($this->p->t('fehlermonitoring', 'mitarbeiterUndOeFehlt'));
elseif (!isEmptyString($mitarbeiter_person_id) && !isEmptyString($oe_kurzbz))
$this->outputJsonError($this->p->t('fehlermonitoring', 'nurOeOderMitarbeiterSetzen'));
elseif (isset($mitarbeiter_person_id) && !is_numeric($mitarbeiter_person_id))
$this->outputJsonError($this->p->t('fehlermonitoring', 'ungueltigeMitarbeiterId'));
else
{
$data = array(
'fehlercode' => $fehlercode
);
if (!isEmptyString($mitarbeiter_person_id))
$data['person_id'] = $mitarbeiter_person_id;
if (!isEmptyString($oe_kurzbz))
$data['oe_kurzbz'] = $oe_kurzbz;
if (!isEmptyString($funktion_kurzbz))
$data['funktion_kurzbz'] = $funktion_kurzbz;
$zustaendigkeitExistsRes = $this->FehlerzustaendigkeitenModel->loadWhere($data);
if (isError($zustaendigkeitExistsRes))
$this->outputJsonError(getError($zustaendigkeitExistsRes));
elseif (hasData($zustaendigkeitExistsRes))
$this->outputJsonError($this->p->t('fehlermonitoring', 'zustaendigkeitExistiert'));
else
{
$data['insertvon'] = $this->_uid;
$this->outputJson($this->FehlerzustaendigkeitenModel->insert($data));
}
}
}
/**
* Deletes a Zuständigkeit.
*/
public function deleteZustaendigkeit()
{
$fehlerzustaendigkeiten_id = $this->input->post('fehlerzustaendigkeiten_id');
// check if Id correctly passed
if (!isset($fehlerzustaendigkeiten_id) || !is_numeric($fehlerzustaendigkeiten_id))
{
$this->outputJsonError($this->p->t('fehlermonitoring', 'ungueltigeZustaendigkeitenId'));
return;
}
$this->outputJson($this->FehlerzustaendigkeitenModel->delete($fehlerzustaendigkeiten_id));
}
/**
* 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');
}
}
@@ -0,0 +1,142 @@
<?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');
$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
$issueTexts = array();
// all fehler kurzbz which are going to be checked
$fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckproducerlib->getFehlerKurzbz();
// 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)
{
// execute the check
$issueTexts[$fehler_kurzbz] = array();
$plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $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;
$resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null;
// get Text of the Fehler
$this->FehlerModel->addSelect('fehlertext');
$fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz));
if (isError($fehlerRes)) $this->outputJsonError(getError($fehlerRes));
// optionally replace fehler parameters in text, output the fehlertext
if (hasData($fehlerRes))
{
// use issue fehler text from database if present
$fehlerText = getData($fehlerRes)[0]->fehlertext;
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);
}
}
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";
$issueTexts[$fehler_kurzbz][] = $fehlerText;
}
}
}
$this->outputJsonSuccess($issueTexts);
}
/**
* 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->plausicheckproducerlib->getFehlerKurzbz();
return array(
'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(),
'currsemester' => hasData($currSemRes) ? getData($currSemRes) : array(),
'studiengaenge' => hasData($studiengaengeRes) ? getData($studiengaengeRes) : array(),
'fehler' => $fehlerKurzbz
);
}
}
+47 -7
View File
@@ -22,11 +22,16 @@ class DB_Model extends CI_Model
const PGSQL_BOOLEAN_FALSE = 'f';
const PGSQL_BOOLEAN_TYPE = 'bool';
const PGSQL_BOOLEAN_ARRAY_TYPE = '_bool';
const PGSQL_INT2_TYPE = 'int2';
const PGSQL_INT4_TYPE = 'int4';
const PGSQL_INT8_TYPE = 'int8';
const PGSQL_FLOAT4_TYPE = 'float4';
const PGSQL_FLOAT8_TYPE = 'float8';
protected $dbTable; // Name of the DB-Table for CI-Insert, -Update, ...
protected $pk; // Name of the PrimaryKey for DB-Update, Load, ...
protected $pk; // Name of the PrimaryKey for DB-Update, Load, ...
protected $hasSequence; // False if this table has a composite primary key that is not using a sequence
// True if this table has a primary key that uses a sequence
// True if this table has a primary key that uses a sequence
private $executedQueryMetaData;
private $executedQueryListFields;
@@ -271,11 +276,6 @@ class DB_Model extends CI_Model
/**
* Load data and convert a record into a list of data from the main table,
* and linked to every element, the data from the side tables
*
* TODO:
* - Adding support for composed primary key
* - Adding support for cascading side tables (useful?)
*
* NOTE: sub queries are not supported in the from clause
*
* @return array
@@ -598,6 +598,28 @@ class DB_Model extends CI_Model
return $val;
}
/**
* Convert PG-Int* to PHP-Integer
*/
public function pgIntPhp($val)
{
// If it is null, let it be null
if ($val == null) return $val;
return intval($val);
}
/**
* Convert PG-Float* to PHP-Float
*/
public function pgFloatPhp($val)
{
// If it is null, let it be null
if ($val == null) return $val;
return floatval($val);
}
/**
* Converts from PostgreSQL array to php array
* It also takes care about array of booleans
@@ -892,6 +914,11 @@ class DB_Model extends CI_Model
// If array type, boolean type OR a UDF
if (strpos($eqmd->type, DB_Model::PGSQL_ARRAY_TYPE) !== false
|| $eqmd->type == DB_Model::PGSQL_BOOLEAN_TYPE
|| $eqmd->type == DB_Model::PGSQL_INT2_TYPE
|| $eqmd->type == DB_Model::PGSQL_INT4_TYPE
|| $eqmd->type == DB_Model::PGSQL_INT8_TYPE
|| $eqmd->type == DB_Model::PGSQL_FLOAT4_TYPE
|| $eqmd->type == DB_Model::PGSQL_FLOAT8_TYPE
|| $this->udflib->isUDFColumn($eqmd->name, $eqmd->type))
{
// If UDFs are inside this result set
@@ -941,6 +968,19 @@ class DB_Model extends CI_Model
{
$resultElement->{$toBeConverted->name} = $this->pgBoolPhp($resultElement->{$toBeConverted->name});
}
// Integer type
elseif ($toBeConverted->type == DB_Model::PGSQL_INT2_TYPE
|| $toBeConverted->type == DB_Model::PGSQL_INT4_TYPE
|| $toBeConverted->type == DB_Model::PGSQL_INT8_TYPE)
{
$resultElement->{$toBeConverted->name} = $this->pgIntPhp($resultElement->{$toBeConverted->name});
}
// Float type
elseif ($toBeConverted->type == DB_Model::PGSQL_FLOAT4_TYPE
|| $toBeConverted->type == DB_Model::PGSQL_FLOAT8_TYPE)
{
$resultElement->{$toBeConverted->name} = $this->pgFloatPhp($resultElement->{$toBeConverted->name});
}
}
}
}
+34 -14
View File
@@ -121,7 +121,7 @@ abstract class FHC_Controller extends CI_Controller
protected function terminateWithJsonError($message)
{
header('Content-Type: application/json');
echo json_encode(error($message));
echo json_encode(error($message)); // KEEP IT!!!
exit;
}
@@ -132,31 +132,50 @@ abstract class FHC_Controller extends CI_Controller
{
$this->output->set_content_type('application/json')->set_output(json_encode($mixed));
}
/**
* To download the given file represented by the fileObj parameter.
* fileObj has the following structure:
* $fileObj->filename
* $fileObj->file
* $fileObj->name
* $fileObj->mimetype
* $fileObj->disposition
*/
protected function outputFile($fileObj)
{
if (file_exists($fileObj->file))
// If the file exists
if (isset($fileObj->file) && !isEmptyString($fileObj->file) && file_exists($fileObj->file))
{
$finfo = new finfo(FILEINFO_MIME);
header('Content-Description: File Transfer');
header('Content-Type: '. $finfo->file($fileObj->file));
header('Content-Type: '. $fileObj->mimetype);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fileObj->file));
if (isset($fileObj->disposition) && ($fileObj->disposition == 'inline' || $fileObj->disposition == 'attachment'))
if (isset($fileObj->disposition)
&& ($fileObj->disposition == 'inline' || $fileObj->disposition == 'attachment'))
{
header('Content-Disposition: '. $fileObj->disposition. '; filename="'. $fileObj->name. '"');
}
readfile($fileObj->file);
exit;
readfile($fileObj->file); // reads the file content to the output buffer
}
return false;
else
{
// Otherwise print an error
show_error('The provided file does not exist: '.(isset($fileObj->file) ? $fileObj->file : 'file not given'));
}
}
/**
* Return the JSON decoded HTTP POST request
* If the request is not in JSON format then a null value is returned
*/
protected function getPostJSON()
{
return json_decode($this->input->raw_input_stream);
}
//------------------------------------------------------------------------------------------------------------------
@@ -175,3 +194,4 @@ abstract class FHC_Controller extends CI_Controller
}
}
}
+249 -60
View File
@@ -3,113 +3,238 @@
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
*
* Model to work with the filesystem, it represents a directory
* It could be extended or could be used directly to work on the given path
*/
abstract class FS_Model extends CI_Model
class FS_Model extends CI_Model
{
protected $filepath; // Path of the file
const READ_MODE = 'r';
const READ_WRITE_MODE = 'w+';
const READ_APPEND_MODE = 'a+';
const BLOCK_SIZE = 8192;
const META_URI = 'uri';
private $_path; // Directory where this model can operate
/**
* Loads FilesystemLib and set properties
* Set properties
*/
public function __construct($filepath = null)
public function __construct($path)
{
parent::__construct();
// Load the filesystem library
$this->load->library('FilesystemLib');
$this->_path = $path;
}
$this->filepath = $filepath;
// ------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Opens a file in read mode and returns its file handle
*/
public function openRead($filename)
{
return $this->_open($filename, self::READ_MODE);
}
/**
* Read data from file system
*
* @return array
* Opens a file in read and write mode and returns its file handle
* If the file does not exist then it is created
*/
public function read($filename)
public function openReadWrite($filename)
{
// Check Class-Attributes
if (is_null($this->filepath)) return error('The given filepath in not valid', EXIT_ERROR);
// Check method parameters
if (is_null($filename)) return error('The given filename is not valid', EXIT_ERROR);
if (!is_null($data = $this->filesystemlib->read($this->filepath, $filename)))
{
return success(base64_encode($data));
}
else
{
return error('An error occurred while reading a file', EXIT_ERROR);
}
return $this->_open($filename, self::READ_WRITE_MODE);
}
/**
* Writing data to file system
*
* @param string $fileContent File content
* @return object
* Opens a file in read and append mode and returns its file handle
* If the file does not exist then it is created
*/
public function write($filename, $content)
public function openReadAppend($filename)
{
// Check Class-Attributes
if (is_null($this->filepath)) return error('The given filepath in not valid', EXIT_ERROR);
return $this->_open($filename, self::READ_APPEND_MODE);
}
// Check method parameters
if (is_null($content)) return error('The given file content is not valid', EXIT_ERROR);
if (is_null($filename)) return error('The given filename is not valid', EXIT_ERROR);
/**
* Closes a file handle
*/
public function close($fileHandle)
{
return fclose($fileHandle) === true ? success() : error('Error while closing the file handler');
}
if ($this->filesystemlib->write($this->filepath, $filename, base64_decode($content)) === true)
/**
* Reads a block of bytes from the given file
* Returns a success that contains the block
* On failure returns an error
*/
public function readBlock($fileHandle)
{
// Reads a block of bytes from the file
$block = fread($fileHandle, self::BLOCK_SIZE);
// If an error occurred
if ($block === false)
{
// Prepare the error message
$errorMsg = 'An error occurred while reading a file';
// Tries to get the file name and to concatenate it to the error message
$fileMetaData = stream_get_meta_data($fileHandle);
if (isset($fileMetaData[self::META_URI])) $errorMsg .= ': '.$fileMetaData[self::META_URI];
return error($errorMsg); // returns the error
}
return success($block); // return success if everything was fine
}
/**
* Writes/appends (depending on how the file was opened) a content into a file
* Returns a success that contains the written number of bytes
* On failure returns an error
*/
public function write($fileHandle, $content)
{
// Writes the provided content to the file
$writeResult = fwrite($fileHandle, $content);
// If an error occurred
if ($writeResult === false)
{
$errorMsg = 'An error occurred while writing a file';
// Tries to get the file name and to concatenate it to the error message
$fileMetaData = stream_get_meta_data($fileHandle);
if (isset($fileMetaData[self::META_URI])) $errorMsg .= ': '.$fileMetaData[self::META_URI];
return error($errorMsg); // returns the error
}
return success($writeResult);
}
/**
* Removes a given file
*/
public function remove($filename)
{
// Check if the property _path represents a valid directory
$checkResult = $this->_checkPath();
if (isError($checkResult)) return $checkResult; // If not then return the error
// Check filename
if (isEmptyString($filename)) return error('The given filename is not valid');
// remove file
if (unlink($this->_path.DIRECTORY_SEPARATOR.$filename) === true)
{
return success();
}
else
{
return error('An error occurred while writing a file', EXIT_ERROR);
return error('An error occurred while removing a file');
}
}
// ------------------------------------------------------------------------------------------------------------------
// Old public methods that work with the base64 encoding, not to be used!
/**
* Append data to a file
*
* @param array $data File content
* @return array
* Read data from the given file and encode its content to base64
*/
public function append($filename, $content)
public function readBase64($filename)
{
// Check Class-Attributes
if (is_null($this->filepath)) return error('The given filepath in not valid', EXIT_ERROR);
// Open the file in read mode
$openReadResult = $this->openRead($filename);
if (isError($openReadResult)) return $openReadResult; // if an error occurred then return it
// Check method parameters
if (is_null($content)) return error('The given file content is not valid', EXIT_ERROR);
if (is_null($filename)) return error('The given filename is not valid', EXIT_ERROR);
$fileContent = ''; // to store the file content
$fileHandle = getData($openReadResult); // get the file handle
if ($this->filesystemlib->append($this->filepath, $filename, base64_decode($content)) === true)
// While the end of the file is not reached and the read does not fail
while (!feof($fileHandle) && isSuccess($readBlockResult = $this->readBlock($fileHandle)))
{
return success();
}
else
{
return error('An error occurred while appending to a file', EXIT_ERROR);
// Concatenate the content of the file
$fileContent .= getData($readBlockResult);
}
// If an error occurred while reading then return it
if (isError($readBlockResult)) return $readBlockResult;
// Close the file handler
$closeResult = $this->close($fileHandle);
if (isError($closeResult)) return $closeResult; // if it fails then return the error
// If everything was fine encode the file content into base64 and return it as a success
return success(base64_encode($fileContent));
}
/**
* Writes the given content into the given file. The content is base64 encoded
*/
public function writeBase64($filename, $content)
{
// Open the file in read and write mode
$openWriteResult = $this->openReadWrite($filename);
if (isError($openWriteResult)) return $openWriteResult; // if an error occurred then return it
$fileHandle = getData($openWriteResult); // get the file handle
// Writes the given base64 encoded content into to given file
$writeResult = $this->write($fileHandle, base64_decode($content));
// If an error occurred while writing then return it
if (isError($writeResult)) return $writeResult;
// Close the file handler
$closeResult = $this->close($fileHandle);
if (isError($closeResult)) return $closeResult; // if it fails then return the error
// If everything was fine
return success();
}
/**
* Appends the given content into the given file. The content is base64 encoded
*/
public function appendBase64($filename, $content)
{
// Open the file in read and append mode
$openWriteResult = $this->openReadAppend($filename);
if (isError($openWriteResult)) return $openWriteResult; // if an error occurred then return it
$fileHandle = getData($openWriteResult); // get the file handle
// Writes the given base64 encoded content into to given file
$writeResult = $this->write($fileHandle, base64_decode($content));
// If an error occurred while writing then return it
if (isError($writeResult)) return $writeResult;
// Close the file handler
$closeResult = $this->close($fileHandle);
if (isError($closeResult)) return $closeResult; // if it fails then return the error
// If everything was fine
return success();
}
/**
* Delete data from file system
* NOTE: it does not work with the base64 encoding but it has been kept for retro compatibility
*
* @param string $id Primary Key for DELETE
* @return array
*/
public function remove($filename)
public function removeBase64($filename)
{
// Check Class-Attributes
if (is_null($this->filepath)) return error('The given filepath in not valid', EXIT_ERROR);
if (is_null($this->_path)) return error('The given _path in not valid', EXIT_ERROR);
// Check method parameters
if (is_null($filename)) return error('The given filename is not valid', EXIT_ERROR);
if ($this->filesystemlib->remove($this->filepath, $filename) === true)
if (unlink($this->_path.DIRECTORY_SEPARATOR.$filename) === true)
{
return success();
}
@@ -121,20 +246,21 @@ abstract class FS_Model extends CI_Model
/**
* Rename a file
* NOTE: it does not work with the base64 encoding but it has been kept for retro compatibility
*
* @param string $id Primary Key for DELETE
* @return array
*/
public function rename($filename, $newFilename)
public function renameBase64($filename, $newFilename)
{
// Check Class-Attributes
if (is_null($this->filepath)) return error('The given filepath in not valid', EXIT_ERROR);
if (is_null($this->_path)) return error('The given _path in not valid', EXIT_ERROR);
// Check method parameters
if (is_null($filename)) return error('The given filename is not valid', EXIT_ERROR);
if (is_null($newFilename)) return error('The given new filename is not valid', EXIT_ERROR);
if ($this->filesystemlib->rename($this->filepath, $filename, $this->filepath, $newFilename) === true)
if (rename($this->_path.DIRECTORY_SEPARATOR.$filename, $this->_path.DIRECTORY_SEPARATOR.$newFilename) === true)
{
return success();
}
@@ -143,4 +269,67 @@ abstract class FS_Model extends CI_Model
return error('An error occurred while renaming a file', EXIT_ERROR);
}
}
// ------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Checks if the given $this->_path is a valid directory
*/
private function _checkPath()
{
// If _path...
if (!isEmptyString($this->_path) // ...is a not empty string...
&& file_exists($this->_path) && is_dir($this->_path)) // ...exists on the file system and it is a directory...
{
return success(); // return a success
}
// If not a valid path return an error
return error('The given path is not valid: '.$this->_path);
}
/**
* Open a file using the provided mode
* It returns a file handle
* Or write and append if the file does not exist then creates it
*/
private function _open($filename, $mode)
{
// Check if the property _path represents a valid directory
$checkResult = $this->_checkPath();
if (isError($checkResult)) return $checkResult; // If not then return the error
// Full file path: path + filename
$fileFullPath = $this->_path.DIRECTORY_SEPARATOR.$filename;
// If needed then check if the file exists and really it is a file
if ($mode == self::READ_MODE && (!file_exists($fileFullPath) || !is_file($fileFullPath)))
{
return error('Trying to read a not existing file');
}
// If needed then check if it is possible to read from the path and the file
if ($mode == self::READ_MODE && (!is_readable($this->_path) || !is_readable($fileFullPath)))
{
return error('The given path or filename are not readable: '.$fileFullPath);
}
// If needed then check if the path and the filename are writable
if (($mode == self::READ_WRITE_MODE || $mode == self::READ_APPEND_MODE)
&& (!is_writable($this->_path) || (file_exists($fileFullPath) && !is_writable($fileFullPath))))
{
return error('The given path or filename are not writable: '.$fileFullPath);
}
// Open the file in read mode
$fileHandle = fopen($fileFullPath, $mode);
// If it was a failure the return the error
if ($fileHandle === false) return error('An error occurred while opening a file in '.$mode.' mode');
// Otherwise return the file handle
return success($fileHandle);
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
/**
* Interface defining method to implement for issue producer (from core and extensions)
*/
interface IIssueExistsChecker
{
/**
* Checks if an issue exists.
* @param array $params parameters needed for issue detection
* @return object with success(true) if issue exists, success(false) otherwise
*/
public function checkIfIssueExists($paramsForChecking);
/**
* Produces an issue.
* @param array $params parameters needed for issue detection
* @return object with success(true) if issue exists, success(false) otherwise
*/
//public function produceIssue($person_id, $oe_kurzbz, $paramsForProducing);
}
+54 -56
View File
@@ -5,7 +5,8 @@
*/
abstract class IssueResolver_Controller extends JOB_Controller
{
const ISSUES_FOLDER = 'issues';
const CI_PATH = 'application';
const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers';
const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved';
protected $_codeLibMappings;
@@ -43,71 +44,68 @@ 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, otherwise it is the core library folder
$libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : '';
$issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
$issuesLibFilePath = DOC_ROOT . self::CI_PATH . '/' . $libRootPath . 'libraries/' . 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");
}
}
}
+93 -39
View File
@@ -1,20 +1,19 @@
<?php
/**
* FH-Complete
* Copyright (C) 2022 fhcomplete.org
*
* @package FHC-Helper
* @author FHC-Team
* @copyright Copyright (c) 2016 fhcomplete.org
* @license GPLv3
* @since Version 1.0.0
*/
/**
* FHC Helper
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @subpackage Helpers
* @category Helpers
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
@@ -42,15 +41,19 @@ function generateToken($length = 64)
{
$firstGeneratedToken = random_bytes($length); // try to generates cryptographically secure pseudo-random bytes...
}
catch (Exception $e) { $firstGeneratedToken = null; } // if fails $firstGeneratedToken is set to null
catch (Exception $e)
{
// If fails $firstGeneratedToken is set to null
$firstGeneratedToken = null;
}
}
// For PHP >= 5.3 and < 7 and openssl is available
elseif (function_exists('openssl_random_pseudo_bytes'))
{
$firstGeneratedToken = openssl_random_pseudo_bytes($length, $strong);
// If the token generation ended with errors OR the generated token is NOT strong enough
if ($firstGeneratedToken == false || $strong == false) $firstGeneratedToken = null; // $firstGeneratedToken is set to null
}
if ($firstGeneratedToken == false || $strong == false) $firstGeneratedToken = null; // $firstGeneratedToken is set to null
}
if ($firstGeneratedToken != null) // If everything was fine
{
@@ -107,10 +110,7 @@ function var_dump_to_error_log($parameter)
function loadResource($path, $resources = null, $subdir = false)
{
// Place a / character at the and of the string if not present
if (strrpos($path, '/') < strlen($path) - 1)
{
$path .= '/';
}
if (strrpos($path, '/') < strlen($path) - 1) $path .= '/';
// Loads in $tmpResources all the given resources
$tmpResources = $resources;
@@ -125,28 +125,36 @@ function loadResource($path, $resources = null, $subdir = false)
// Loads in $tmpPaths path and eventually the subdirectories
$tmpPaths = array($path);
// NOTE: Used @ to prevent ugly error messages
if (is_dir($path) && ($dirHandler = @opendir($path)) !== false)
// If path is a directory
if (is_dir($path))
{
// Reads all file system entries present in path
while (($entry = readdir($dirHandler)) !== false)
// NOTE: Used @ to prevent ugly error messages
$dirHandler = @opendir($path);
// Successfully opened
if ($dirHandler !== false)
{
// If entry is a directory but not the current and subdirectories should be loaded
if ($subdir === true && $entry != '.' && $entry != '..' && is_dir($entry))
// Reads all file system entries present in path
while (($entry = readdir($dirHandler)) !== false)
{
$tmpPaths[] = $entry;
}
// If no resources are specified and the current file system entry is a file
if ($resources == null && is_file($path.$entry))
{
// If the current entry is a php file store the name without extension
if ($entry != ($tmpName = str_replace('.php', '', $entry)))
// If entry is a directory but not the current and subdirectories should be loaded
if ($subdir === true && $entry != '.' && $entry != '..' && is_dir($path.$entry))
{
$tmpResources[] = $tmpName;
$tmpPaths[] = $path.$entry.'/';
}
// If no resources are specified and the current file system entry is a file
if ($resources == null && is_file($path.$entry))
{
// Name without php extension
$tmpName = str_replace('.php', '', $entry);
// If the current entry is a php file store the name without extension
if ($entry != $tmpName) $tmpResources[] = $tmpName;
}
}
closedir($dirHandler);
}
closedir($dirHandler);
}
// Loops through the resources
@@ -156,10 +164,7 @@ function loadResource($path, $resources = null, $subdir = false)
foreach ($tmpPaths as $tmpPath)
{
$fileName = $tmpPath.$tmpResource.'.php'; // Php extension
if (file_exists($fileName))
{
include_once($fileName);
}
if (file_exists($fileName)) include_once($fileName);
}
}
}
@@ -351,3 +356,52 @@ function sanitizeProblemChars($str)
return preg_replace($acentos, array_keys($acentos), htmlentities($str, ENT_NOQUOTES | ENT_HTML5, $enc));
}
/**
*
*/
function findResource($path, $resource, $subdir = false, $extraDir = null)
{
// Place a / character at the and of the string if not present
if (strrpos($path, '/') < strlen($path) - 1) $path .= '/';
// Loads in $tmpPaths path and eventually the subdirectories
$tmpPaths = array($path);
if (is_dir($path))
{
// NOTE: Used @ to prevent ugly error messages
$dirHandler = @opendir($path);
// Successfully opened
if ($dirHandler !== false)
{
// Reads all file system entries present in path
while (($entry = readdir($dirHandler)) !== false)
{
// If entry is a directory but not the current and subdirectories should be loaded
if ($subdir === true && $entry != '.' && $entry != '..' && is_dir($path.$entry))
{
if ($extraDir == null)
{
$tmpPaths[] = $path.$entry.'/';
}
else
{
$tmpPaths[] = $path.$entry.'/'.$extraDir.'/';
}
}
}
closedir($dirHandler);
}
}
// Loops through the paths
foreach ($tmpPaths as $tmpPath)
{
$fileName = $tmpPath.$resource.'.php'; // Php extension
if (file_exists($fileName)) return $fileName;
}
return null;
}
+37 -1
View File
@@ -149,6 +149,31 @@ function generateJSsInclude($JSs)
}
}
/**
* Generates tags for the javascript modules you want to include, the parameter could by a string or an array of strings
*/
function generateJSModulesInclude($JSModules)
{
$jsInclude = '<script type="module" src="%s"></script>';
$ci =& get_instance();
$cachetoken = '?'.$ci->config->item('fhcomplete_build_version');
if (isset($JSModules))
{
$tmpJSs = is_array($JSModules) ? $JSModules : array($JSModules);
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
{
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
echo $toPrint;
}
}
}
/**
* Generates all the includes needed by the Addons
*/
@@ -156,16 +181,26 @@ function generateAddonsJSsInclude($calledFrom)
{
$aktive_addons = array_filter(explode(";", ACTIVE_ADDONS));
// For each active addon
foreach ($aktive_addons as $addon)
{
// Build the path to the hook file
$hookfile = DOC_ROOT.'addons/'.$addon.'/hooks.config.inc.php';
// If the hook file exists
if (file_exists($hookfile))
{
include($hookfile);
$js_hooks = array(); // default value
include($hookfile); // include the hook file where the array js_hooks should be setup
// If it contains the provided key calledFrom
if (key_exists($calledFrom, $js_hooks))
{
foreach ($js_hooks[$calledFrom] as $js_file)
{
generateJSsInclude('addons/'.$addon.'/'.$js_file);
}
}
}
}
@@ -180,3 +215,4 @@ function generateBackwardCompatibleJSMsIe($js)
echo ' <script type="text/javascript" src="'.$js.'"></script>'."\n";
echo "<![endif]-->\n";
}
+268
View File
@@ -0,0 +1,268 @@
<?php
/**
* FH-Complete
*
* @package FHC-Helper
* @author FHC-Team
* @copyright Copyright (c) 2022 fhcomplete.net
* @license GPLv3
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class AkteLib
{
const AKTE_KATEGORIE_KURZBZ = 'Akte'; // kategorie_kurzbz of dms when inserting for akte
private $_ci; // Code igniter instance
private $_who; // who added this document
/**
* Object initialization
*/
public function __construct($params = null)
{
$this->_ci =& get_instance();
// Set the the _who property
$this->_who = 'Akte system'; // default
// It is possible to set it using the who parameter
if (!isEmptyArray($params) && isset($params['who']) && !isEmptyString($params['who'])) $this->_who = $params['who'];
$this->_ci->load->model('crm/Akte_model', 'AkteModel');
$this->_ci->load->model('content/DmsFS_model', 'DmsFSModel');
$this->_ci->load->library('DmsLib');
}
/**
* Writes a new file, adds a new dms entry with given akte data,
* adds a new dms version 0 for the written file, and adds Akte if dms add was successfull
* Returns success with inserted akte id or error
*/
public function add(
$person_id, $dokument_kurzbz, $titel, $mimetype, $fileHandle, // Required parameters
$bezeichnung = null, $archiv = false, $signiert = false, $stud_selfservice = false
)
{
// add new dms entry and new dms version for the Akte, using Akte data (title, mimetype, file content as handle)
$dmsAddResult = $this->_ci->dmslib->add($titel, $mimetype, $fileHandle, self::AKTE_KATEGORIE_KURZBZ, $dokument_kurzbz, $bezeichnung);
if (isError($dmsAddResult)) return $dmsAddResult;
if (!hasData($dmsAddResult)) return error("Dms document could not be added");
$dmsAddData = getData($dmsAddResult);
// insert the Akte
return $this->_ci->AkteModel->insert(
array(
'person_id' => $person_id,
'dokument_kurzbz' => $dokument_kurzbz,
'titel' => $titel,
'mimetype' => $mimetype,
'bezeichnung' => $bezeichnung,
'erstelltam' => date('Y-m-d'),
'dms_id' => $dmsAddData->dms_id,
'archiv' => $archiv,
'signiert' => $signiert,
'stud_selfservice' => $stud_selfservice,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => $this->_who
)
);
}
/**
* Writes a new file, adds a new dms version 0 for the written file, and updates Akte if dms version add was successfull
* Returns success with updated akte id or error
*/
public function update($akte_id, $titel, $mimetype, $fileHandle, $bezeichnung = null, $archiv = false, $signiert = false, $stud_selfservice = false)
{
// check if Akte with dms exists
$this->_ci->AkteModel->addSelect('dms_id');
$akteResult = $this->_ci->AkteModel->load($akte_id);
if (isError($akteResult)) return $akteResult;
if (!hasData($akteResult)) return error("Akte not found");
$dms_id = getData($akteResult)[0]->dms_id;
if (isEmptyString($dms_id)) return error("Akte has no dms document");
// if Akte with dms found, update the last dms version
$dmsUpdateResult = $this->_ci->dmslib->updateLastVersion($dms_id, $fileHandle, $titel, $mimetype, $bezeichnung);
if (isError($dmsUpdateResult)) return $dmsUpdateResult;
if (!hasData($dmsUpdateResult)) return error("Dms document could not be updated");
// update the Akte
return $this->_ci->AkteModel->update(
$akte_id,
array(
'titel' => $titel,
'mimetype' => $mimetype,
'bezeichnung' => $bezeichnung,
'erstelltam' => date('Y-m-d'),
'dms_id' => $dms_id,
'archiv' => $archiv,
'signiert' => $signiert,
'stud_selfservice' => $stud_selfservice,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_who
)
);
}
/**
* Gets akte data and associated dms data by akte Id
* Returns success with akte and dms data or error
*/
public function get($akte_id)
{
// get Akte data
$this->_ci->AkteModel->addSelect('person_id, dokument_kurzbz, mimetype, erstelltam, titel, bezeichnung,
gedruckt, uid, dms_id, nachgereicht, nachgereicht_am, anmerkung,
ausstellungsnation, formal_geprueft_amum, archiv, signiert,
stud_selfservice, akzeptiertamum, insertvon, insertamum, updatevon, updateamum');
$this->_ci->AkteModel->load($akte_id);
$akteResult = $this->_ci->AkteModel->load($akte_id);
if (isError($akteResult)) return $akteResult;
if (!hasData($akteResult)) return error("Akte not found");
$resultObject = getData($akteResult)[0];
// set properties with same name in Akte and Dms table
$resultObject->akte_mimetype = $resultObject->mimetype;
// get dms data
$dmsResult = $this->_ci->dmslib->getLastVersion($resultObject->dms_id);
if (isError($dmsResult)) return $dmsResult;
// properties to retrieve from dms
$dmsProperties = array('version', 'filename', 'mimetype', 'name', 'beschreibung', 'cis_suche', 'schlagworte', DmsLib::FILE_CONTENT_PROPERTY);
// set dms properties
if (hasData($dmsResult))
{
$dmsData = getData($dmsResult);
foreach ($dmsProperties as $dmsProperty)
{
$resultObject->{$dmsProperty} = $dmsData->{$dmsProperty};
}
}
else
{
// set null if no dms result found
foreach ($dmsProperties as $dmsProperty)
{
$resultObject->{$dmsProperty} = null;
}
}
// return the object containing akte and dms data
return success($resultObject);
}
/**
* Gets Akte data and associated dms data by person Id and dokument_kurzbz
* Returns success with result array with akte and dms data or error
*/
public function getByPersonIdAndDocumentType($person_id, $dokument_kurzbz)
{
// load all Akte entries for given person and dokument_kurzbz
$this->_ci->AkteModel->addSelect('akte_id');
$akteResult = $this->_ci->AkteModel->loadWhere(
array(
'person_id' => $person_id,
'dokument_kurzbz' => $dokument_kurzbz
)
);
if (!hasData($akteResult)) return error("Akte not found");
$akteData = getData($akteResult);
$resultArr = array();
// for each found akte entry
foreach ($akteData as $akte)
{
// get dms and akte data from akte Id
$getAkteDmsResult = $this->get($akte->akte_id);
if (isError($getAkteDmsResult)) return $getAkteDmsResult;
$resultArr[] = getData($getAkteDmsResult);
}
// return all found entries
return success($resultArr);
}
/**
* Removes Akte by akte Id, removes all associated dms entries and versions, and deletes all associated files
* Returns success with removed version numbers or error
*/
public function remove($akte_id)
{
// get dms_id for akte
$this->_ci->AkteModel->addSelect('dms_id');
$akteResult = $this->_ci->AkteModel->load($akte_id);
if (isError($akteResult)) return $akteResult;
if (!hasData($akteResult)) return error("Akte not found");
$dms_id = getData($akteResult)[0]->dms_id;
$error = null;
// Start DB transaction to avoid deleting only part of the data
$this->_ci->db->trans_begin();
// delete Akte
$deleteResult = $this->_ci->AkteModel->delete($akte_id);
if (isError($deleteResult))
{
$error = $deleteResult;
}
else
{
// remove all dms entry for dms of the akte
$removeAllResult = $this->_ci->dmslib->removeAll($dms_id);
if (isError($removeAllResult))
$error = $removeAllResult;
}
// Transaction complete!
$this->_ci->db->trans_complete();
// Check if everything went ok during the transaction
if ($this->_ci->db->trans_status() === false || isset($error))
{
$this->_ci->db->trans_rollback();
// return occured error
if (isset($error))
return $error;
else
return error("Error occured when deleting, rolled back");
}
else
{
$this->_ci->db->trans_commit();
// return removed dms entry data
return $removeAllResult;
}
}
}
+121 -1
View File
@@ -80,14 +80,24 @@ class AnrechnungLib
// Get latest ZGV
$result = $this->ci->PrestudentModel->getLatestZGVBezeichnung($prestudent_id);
$latest_zgv_bezeichnung = hasData($result) ? getData($result)[0]->bezeichnung : '';
// Get Sum of berufliche and schulische ECTS
$result = $this->ci->LehrveranstaltungModel->getEctsSumSchulisch($uid, $prestudent_id, $lv->studiengang_kz);
$sumEctsSchulisch = getData($result)[0]->ectssumschulisch;
$result = $this->ci->LehrveranstaltungModel->getEctsSumBeruflich($uid);
$sumEctsBeruflich = getData($result)[0]->ectssumberuflich;
// Set the given studiensemester
$antrag_data->lv_id = $lv_id;
$antrag_data->lv_bezeichnung = $lv->bezeichnung;
$antrag_data->ects = $lv->ects;
$antrag_data->sumEctsSchulisch = $sumEctsSchulisch;
$antrag_data->sumEctsBeruflich = $sumEctsBeruflich;
$antrag_data->studiensemester_kurzbz = $studiensemester_kurzbz;
$antrag_data->vorname = $person->vorname;
$antrag_data->nachname = $person->nachname;
$antrag_data->student_uid = $uid;
$antrag_data->matrikelnr = $student->matrikelnr;
$antrag_data->studiengang_kz = $studiengang->studiengang_kz;
$antrag_data->stg_bezeichnung = $studiengang->bezeichnung;
@@ -112,6 +122,7 @@ class AnrechnungLib
$anrechnung_data = new StdClass();
$this->ci->AnrechnungModel->addJoin('lehre.tbl_anrechnung_begruendung', 'begruendung_id');
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
if (isError($result))
@@ -145,6 +156,7 @@ class AnrechnungLib
$anrechnung_data->prestudent_id = '';
$anrechnung_data->lehrveranstaltung = '';
$anrechnung_data->begruendung_id = '';
$anrechnung_data->begruendung = '';
$anrechnung_data->anmerkung = '';
$anrechnung_data->dms_id = '';
$anrechnung_data->insertamum = '';
@@ -155,6 +167,7 @@ class AnrechnungLib
$anrechnung_data->status = getUserLanguage() == 'German' ? 'neu' : 'new';
$anrechnung_data->dokumentname = '';
$this->ci->AnrechnungModel->addJoin('lehre.tbl_anrechnung_begruendung', 'begruendung_id');
$result = $this->ci->AnrechnungModel->loadWhere(
array(
'lehrveranstaltung_id' => $lehrveranstaltung_id,
@@ -800,6 +813,7 @@ class AnrechnungLib
$anrechnung_data->prestudent_id = $anrechnung->prestudent_id;
$anrechnung_data->lehrveranstaltung_id = $anrechnung->lehrveranstaltung_id;
$anrechnung_data->begruendung_id = $anrechnung->begruendung_id;
$anrechnung_data->begruendung = $anrechnung->bezeichnung;
$anrechnung_data->anmerkung = $anrechnung->anmerkung_student;
$anrechnung_data->dms_id = $anrechnung->dms_id;
$anrechnung_data->insertamum = (new DateTime($anrechnung->insertamum))->format('d.m.Y');
@@ -823,4 +837,110 @@ class AnrechnungLib
return $anrechnung_data;
}
/**
* If Student is a Quereinsteiger, get ECTS Summe of all angerechnete Studiensemester.
*
* @param $prestudent_id
* @param $studiengang_kz Studiengang_kz der LV
* @return int|mixed
*/
public function getQuereinsteigerEctsSumme($prestudent_id, $studiengang_kz)
{
$sumEctsQuereinsteiger = 0;
// Check, if student is Quereinsteiger
$this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$result = $this->ci->PrestudentstatusModel->getFirstStatus($prestudent_id, 'Student');
$prestudentFirstStudentStatus = getData($result)[0];
// If Prestudent is not a Quereinsteiger
if ($prestudentFirstStudentStatus->ausbildungssemester == 1)
{
return $sumEctsQuereinsteiger; // return 0
}
$anzahlAngerechneteStudiensemester = $prestudentFirstStudentStatus->ausbildungssemester - 1;
// If Prestudent is a Quereinsteiger
if ($prestudentFirstStudentStatus->ausbildungssemester > 1)
{
// Get the 'angerechnete Studiensemester'
$this->ci->load->model('organisations/Studiensemester_model', 'StudiensemesterModel');
$result = $this->ci->StudiensemesterModel->getPreviousFrom(
$prestudentFirstStudentStatus->studiensemester_kurzbz,
$anzahlAngerechneteStudiensemester
);
// Get ECTS Summe of each 'angerechnetes Studiensemester'
foreach (getData($result) as $studiensemester)
{
$result = $this->ci->LehrveranstaltungModel->getSumQuereinstiegsECTSProSemester(
$studiengang_kz,
$studiensemester->studiensemester_kurzbz,
$anzahlAngerechneteStudiensemester--,
$prestudentFirstStudentStatus->orgform_kurzbz
);
if (hasData($result))
{
$sumEctsQuereinsteiger = $sumEctsQuereinsteiger + getData($result)[0]->sum_ects;
}
}
}
return $sumEctsQuereinsteiger; // return sum of ects of all 'angerechnete Studiensemester'
}
/**
* Get ECTS Summe of all Anrechnungen based on schulische Kenntnisse.
*
* @param $student_uid
* @return int|mixed
*/
public function getSchulischeAnrechnungenEctsSumme($student_uid)
{
$sumEctsSchule = 0;
$result = $this->ci->LehrveranstaltungModel->getSumAngerechneteECTSByBegruendung($student_uid);
if (hasData($result))
{
foreach (getData($result) as $ects)
{
if ($ects->begruendung_id != 4)
{
$sumEctsSchule = $sumEctsSchule + $ects->sum;
}
}
}
return $sumEctsSchule;
}
/**
* Get ECTS Summe of all Anrechnungen based on berufliche Kenntnisse.
*
* @param $student_uid
* @return int
*/
public function getBeruflicheAnrechnungenEctsSumme($student_uid)
{
$sumEctsBeruflich = 0;
$result = $this->ci->LehrveranstaltungModel->getSumAngerechneteECTSByBegruendung($student_uid);
if (hasData($result))
{
foreach (getData($result) as $ects)
{
if ($ects->begruendung_id == 4)
{
$sumEctsBeruflich = $ects->sum;
}
}
}
return $sumEctsBeruflich;
}
}
+588 -147
View File
@@ -1,26 +1,483 @@
<?php
/**
* FH-Complete
*
* @package FHC-Helper
* @author FHC-Team
* @copyright Copyright (c) 2022 fhcomplete.net
* @license GPLv3
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class DmsLib extends FHC_Controller
use \stdClass as stdClass;
class DmsLib
{
const FILE_CONTENT_PROPERTY = 'file_content';
private $UPLOAD_PATH = DMS_PATH; // temporary directory to store the upload file
const FILE_CONTENT_PROPERTY = 'file_content'; // property name for file content
private $_ci; // code igniter instance
private $_who; // who added this document
/**
* Object initialization
*/
public function __construct()
public function __construct($params = null)
{
$this->ci =& get_instance();
$this->_ci =& get_instance();
$this->ci->load->model('crm/Akte_model', 'AkteModel');
$this->ci->load->model('content/Dms_model', 'DmsModel');
$this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel');
$this->ci->load->model('content/DmsFS_model', 'DmsFSModel');
// Set the the _who property
$this->_who = 'DMS system'; // default
// It is possible to set it using the who parameter
if (!isEmptyArray($params) && isset($params['who']) && !isEmptyString($params['who'])) $this->_who = $params['who'];
$this->_ci->load->model('crm/Akte_model', 'AkteModel'); // deprecated, should not be used here!
$this->_ci->load->model('content/Dms_model', 'DmsModel');
$this->_ci->load->model('content/DmsVersion_model', 'DmsVersionModel');
$this->_ci->load->model('content/DmsFS_model', 'DmsFSModel');
}
// -----------------------------------------------------------------------------------------------------------
// Public methods
/**
* Writes a new file, adds a new dms entry and a new dms version 0 for the written file
* Returns success info of added dms entry (dms_id, version, filename) or error
*/
public function add(
$name, $mimetype, $fileHandle, // Required parameters
$kategorie_kurzbz = null, $dokument_kurzbz = null, $beschreibung = null, $cis_suche = false, $schlagworte = null
)
{
// create unique filename, using original document name to detect file extension
$filename = $this->_getUniqueFilename($name);
// copy file from fileHandle to dms folder
$copyFileResult = $this->_copyFile($fileHandle, $filename);
if (isError($copyFileResult)) return $copyFileResult;
// if file written successful, insert dms
$dmsResult = $this->_ci->DmsModel->insert(
array(
'kategorie_kurzbz' => $kategorie_kurzbz,
'dokument_kurzbz' => $dokument_kurzbz
)
);
if (isError($dmsResult)) return $dmsResult;
if (hasData($dmsResult))
{
$dms_id = getData($dmsResult);
$version = 0;
// insert dms version
$dmsVersion = array(
'dms_id' => $dms_id,
'version' => $version,
'filename' => $filename,
'mimetype' => $mimetype,
'name' => $name,
'beschreibung' => $beschreibung,
'cis_suche' => $cis_suche,
'schlagworte' => $schlagworte,
'insertvon' => $this->_who,
'insertamum' => date('Y-m-d H:i:s')
);
$dmsVersionResult = $this->_ci->DmsVersionModel->insert($dmsVersion);
if (isError($dmsVersionResult)) return $dmsVersionResult;
// return dms info
$resObj = new stdClass();
$resObj->dms_id = $dms_id;
$resObj->version = $version;
$resObj->filename = $filename;
return success($resObj);
}
else
return error("error when inserting DMS");
}
/**
* Writes a new file with content of fileHandle, adds a new dms version (max version number + 1) for the written file
* Returns success with info of added dms version (version, filename) or error
*/
public function addNewVersion($dms_id, $fileHandle, $name = null, $mimetype = null, $beschreibung = null, $cis_suche = false, $schlagworte = null)
{
// get the latest version
$lastVersionResult = $this->getLastVersion($dms_id);
if (isError($lastVersionResult)) return $lastVersionResult;
if (hasData($lastVersionResult))
{
$lastVersion = getData($lastVersionResult);
$originalName = isset($name) ? $name : $lastVersion->name;
// create unique filename, using original document name to detect file extension
$filename = $this->_getUniqueFilename($originalName);
// copy file from fileHandle to dms folder
$copyFileResult = $this->_copyFile($fileHandle, $filename);
if (isError($copyFileResult)) return $copyFileResult;
// insert new version
$newVersionNumber = $lastVersion->version + 1;
// if new parameters given, use them, otherwise use parameters from last version
$newVersion = array(
'dms_id' => $dms_id,
'name' => $originalName,
'filename' => $filename,
'version' => $newVersionNumber,
'mimetype' => isset($mimetype) ? $mimetype : $lastVersion->mimetype,
'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung,
'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche,
'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte,
'insertvon' => $this->_who,
'insertamum' => date('Y-m-d H:i:s')
);
$addVersionResult = $this->_ci->DmsVersionModel->insert($newVersion);
if (isError($addVersionResult)) return $addVersionResult;
// return dms info
$resObj = new stdClass();
$resObj->version = $newVersionNumber;
$resObj->filename = $filename;
return success($resObj);
}
else
return error("last version not found");
}
/**
* Updates the last version (max version number) of a dms entry
* Overwrites the file associated with this version with content read from fileHandle
* Returns success with info of added dms version (version, filename) or error
*/
public function updateLastVersion($dms_id, $fileHandle, $name = null, $mimetype = null, $beschreibung = null, $cis_suche = false, $schlagworte = null)
{
// get the latest version
$lastVersionResult = $this->getLastVersion($dms_id);
if (isError($lastVersionResult)) return $lastVersionResult;
if (hasData($lastVersionResult))
{
$lastVersion = getData($lastVersionResult);
$filename = $lastVersion->filename;
// update file in filesystem
$copyFileResult = $this->_copyFile($fileHandle, $filename);
if (isError($copyFileResult)) return $copyFileResult;
// if new parameters given, use them, otherwise use parameters from last version
$newVersion = array(
'name' => isset($name) ? $name : $lastVersion->name,
'filename' => $filename,
'mimetype' => isset($mimetype) ? $mimetype : $lastVersion->mimetype,
'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung,
'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche,
'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte,
);
// update last dms version
$addVersionResult = $this->_ci->DmsVersionModel->update(
array($dms_id, $lastVersion->version),
$newVersion
);
if (isError($addVersionResult)) return $addVersionResult;
// return dms info
$resObj = new stdClass();
$resObj->version = $lastVersion->version;
$resObj->filename = $filename;
return success($resObj);
}
else
return error("last version not found");
}
/**
* Gets dms version with highest number
* Returns success with dms data and fileHandle with file content or error
*/
public function getLastVersion($dms_id)
{
// get the latest version number
$this->_ci->DmsVersionModel->addSelect('version');
$this->_ci->DmsVersionModel->addOrder('version', 'DESC');
$this->_ci->DmsVersionModel->addOrder('insertamum', 'DESC');
$this->_ci->DmsVersionModel->addLimit(1);
$lastDmsVersionResult = $this->_ci->DmsVersionModel->loadWhere(
array('dms_id' => $dms_id)
);
if (isError($lastDmsVersionResult)) return $lastDmsVersionResult;
if (hasData($lastDmsVersionResult))
{
$lastDmsVersionData = getData($lastDmsVersionResult)[0];
$lastDmsVersion = $lastDmsVersionData->version;
// call get Version with last version number
return $this->getVersion($dms_id, $lastDmsVersion);
}
else
return error("Dms last version not found");
}
/**
* Gets specified dms version
* Returns success with dms data and fileHandle with file content or error
*/
public function getVersion($dms_id, $version)
{
$this->_ci->DmsVersionModel->addSelect('dms_id, version, filename, mimetype, name, beschreibung, cis_suche, schlagworte');
$dmsVersionResult = $this->_ci->DmsVersionModel->loadWhere(
array(
'dms_id' => $dms_id,
'version' => $version
)
);
if (isError($dmsVersionResult)) return $dmsVersionResult;
if (hasData($dmsVersionResult))
{
$dmsVersion = getData($dmsVersionResult)[0];
// get file content as file pointer
$fileHandleResult = $this->_ci->DmsFSModel->openRead($dmsVersion->filename);
if (isError($fileHandleResult)) return $fileHandleResult;
if (hasData($fileHandleResult))
{
$fileHandle = getData($fileHandleResult);
$dmsVersion->{self::FILE_CONTENT_PROPERTY} = $fileHandle;
// close file pointer
$closeResult = $this->_ci->DmsFSModel->close($fileHandle);
if (isError($closeResult)) return $closeResult;
return success($dmsVersion);
}
else
return error("File could not be opened");
}
else
return error("Dms version not found");
}
/**
* Removes dms entry and all its versions, deletes all associated files
* Returns success with removed version numbers or error
*/
public function removeAll($dms_id)
{
$versionsRemoved = array();
$this->_ci->DmsVersionModel->addSelect('version, filename');
$allVersionsResult = $this->_ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id));
if (hasData($allVersionsResult))
{
$allVersionsData = getData($allVersionsResult);
$error = null;
// Start DB transaction to avoid deleting only part of the data
$this->_ci->db->trans_begin();
// remove all versions of the dms Id
foreach ($allVersionsData as $version)
{
$removeVersionResult = $this->removeVersion($dms_id, $version->version);
if (isError($removeVersionResult))
{
$error = $removeVersionResult;
break;
}
else
$versionsRemoved[] = $version; // return removed versions
}
// Transaction complete!
$this->_ci->db->trans_complete();
// Check if everything went ok during the transaction
if ($this->_ci->db->trans_status() === false || isset($error))
{
$this->_ci->db->trans_rollback();
if (isset($error))
return $error;
else
return error("Error occured when deleting, rolled back");
}
else
{
$this->_ci->db->trans_commit();
}
}
return success($versionsRemoved);
}
/**
* Removes latest version and its associated file
* Returns success with removed dms version data (dms_id, version, filename) or error
*/
public function removeLastVersion($dms_id)
{
$lastVersionNumber = 0;
// get the latest version
$lastVersionResult = $this->getLastVersion($dms_id);
if (isError($lastVersionResult)) return $lastVersionResult;
if (hasData($lastVersionResult))
{
$lastVersion = getData($lastVersionResult);
$lastVersionNumber = $lastVersion->version;
}
// call remove method for latest version
return $this->removeVersion($dms_id, $lastVersionNumber);
}
/**
* Removes latest version and its associated file
* Returns success with removed dms version data (dms_id, version, filename) or error
*/
public function removeVersion($dms_id, $version)
{
$removeVersionResultObj = new stdClass();
$removeVersionResultObj->dms_id = null;
$removeVersionResultObj->version = null;
$removeVersionResultObj->filename = null;
// load dms version and check how many versions there are
$db = new DB_Model();
$checkDeleteResult = $db->execReadOnlyQuery(
"SELECT filename,
(SELECT count(version)
FROM campus.tbl_dms_version dv_anzahl
WHERE dv_anzahl.dms_id = dv.dms_id) AS anzahl_versionen
FROM campus.tbl_dms_version dv
WHERE dms_id=?
AND version=?",
array($dms_id, $version)
);
if (isError($checkDeleteResult)) return $checkDeleteResult;
if (hasData($checkDeleteResult))
{
$checkDeleteData = getData($checkDeleteResult)[0];
// delete version
$deleteVersionResult = $this->_ci->DmsVersionModel->delete(array($dms_id, $version));
if (isError($deleteVersionResult)) return $deleteVersionResult;
$removeVersionResultObj->version = $version;
$removeVersionResultObj->filename = $checkDeleteData->filename;
// delete dms too if no versions left
if ($checkDeleteData->anzahl_versionen <= 1)
{
$deleteDmsResult = $this->_ci->DmsModel->delete($dms_id);
if (isError($deleteDmsResult)) return $deleteDmsResult;
$removeVersionResultObj->dms_id = $dms_id;
}
// delete file from file system
$removeResult = $this->_ci->DmsFSModel->remove($checkDeleteData->filename);
if (isError($removeResult)) return $removeResult;
}
return success($removeVersionResultObj);
}
// -----------------------------------------------------------------------------------------------------------
// Private methods
/**
* Copies file from sourceFileHandle to destinationFilename in DMS folder
* Returns success or error on fail
*/
private function _copyFile($sourceFileHandle, $destinationFilename)
{
// get file location from file handle
$metaData = stream_get_meta_data($sourceFileHandle);
if (isset($metaData['uri']) && !isEmptyString($metaData['uri']))
{
// if file location determined, copy file
$source = $metaData['uri'];
if (copy($source, DMS_PATH.$destinationFilename))
{
return success();
}
else
{
// error if copy returned false
return error('error occured while copying file');
}
}
else
{
// error when source location could not be determined
return error('error occured while getting source file name');
}
return success($resObj);
}
/**
* Generates unique filename, appends file extension from document name
* Returns the filename string
*/
private function _getUniqueFilename($dokname)
{
// create unique id
$uniqueFilename = uniqid();
// getting extension of file from document name
$fileExtension = pathinfo($dokname, PATHINFO_EXTENSION);
// if file extension found, append it
if (!isEmptyString($fileExtension))
$uniqueFilename .= '.'.$fileExtension;
return $uniqueFilename;
}
// -----------------------------------------------------------------------------------------------------------
// Deprecated methods, not to be used
/**
* Load a DMS Document.
* If no version is particularly given, the latest version is loaded.
@@ -33,19 +490,20 @@ class DmsLib extends FHC_Controller
{
if (is_numeric($dms_id))
{
$this->ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
$this->ci->DmsModel->addOrder('version', 'DESC');
$this->ci->DmsModel->addLimit(1);
$this->_ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
$this->_ci->DmsModel->addOrder('version', 'DESC');
$this->_ci->DmsModel->addLimit(1);
if (!is_numeric($version))
{
return $this->ci->DmsModel->load($dms_id);
return $this->_ci->DmsModel->load($dms_id);
}
else
{
return $this->ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version));
return $this->_ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version));
}
}
return error('The parameter DMS ID must be a number');
}
@@ -57,34 +515,30 @@ class DmsLib extends FHC_Controller
*/
public function read($dms_id, $version = null)
{
$result = null;
$result = error('Wrong dms_id parameter');
if (isset($dms_id))
{
$this->ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
$this->ci->DmsModel->addOrder('version', 'DESC');
$this->ci->DmsModel->addLimit(1);
$this->_ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
$this->_ci->DmsModel->addOrder('version', 'DESC');
$this->_ci->DmsModel->addLimit(1);
if (!isset($version))
{
$result = $this->ci->DmsModel->load($dms_id);
$result = $this->_ci->DmsModel->load($dms_id);
}
else
{
$result = $this->ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version));
$result = $this->_ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version));
}
}
if (hasData($result))
{
$resultFS = $this->ci->DmsFSModel->read($result->retval[0]->filename);
if (isSuccess($resultFS))
// If a dms has been found
if (hasData($result))
{
$result->retval[0]->{DmsLib::FILE_CONTENT_PROPERTY} = $resultFS->retval;
}
else
{
$result = $resultFS;
$resultFS = $this->_ci->DmsFSModel->readBase64(getData($result)[0]->filename);
if (isError($resultFS)) return $resultFS; // if an error occurred return it
$result->retval[0]->{self::FILE_CONTENT_PROPERTY} = getData($resultFS);
}
}
@@ -101,28 +555,22 @@ class DmsLib extends FHC_Controller
*/
public function getAktenAcceptedDms($person_id, $dokument_kurzbz = null, $no_file = null)
{
$result = $this->ci->AkteModel->getAktenAcceptedDms($person_id, $dokument_kurzbz);
$result = $this->_ci->AkteModel->getAktenAcceptedDms($person_id, $dokument_kurzbz);
if (hasData($result) && $no_file == null)
{
$cnt = count($result->retval);
for ($i = 0; $i < $cnt; $i++)
for ($i = 0; $i < count(getData($result)); $i++)
{
$resultFS = $this->ci->DmsFSModel->read($result->retval[$i]->filename);
if (isSuccess($resultFS))
{
$result->retval[$i]->{DmsLib::FILE_CONTENT_PROPERTY} = $resultFS->retval;
}
else
{
$result = $resultFS;
}
$resultFS = $this->_ci->DmsFSModel->readBase64(getData($result)[$i]->filename);
if (isError($resultFS)) return $resultFS; // if an error occurred return it
$result->retval[$i]->{self::FILE_CONTENT_PROPERTY} = getData($resultFS);
}
}
return $result;
}
/**
* Uploads a document and saves it to DMS
* @param $dms DMS assoc array
@@ -135,32 +583,33 @@ class DmsLib extends FHC_Controller
// Init upload configs
$this->_loadUploadLibrary($allowed_types);
if (!$this->ci->upload->do_upload($field_name))
if (!$this->_ci->upload->do_upload($field_name))
{
return error($this->ci->upload->display_errors());
return error($this->_ci->upload->display_errors());
}
$upload_data = $this->ci->upload->data(); // data about the uploaded file
$filename = $upload_data['file_name'];
$upload_data = $this->_ci->upload->data(); // data about the uploaded file
// Insert to DMS table
if (!$result = $this->ci->DmsModel->insert($this->ci->DmsModel->filterFields($dms)))
{
return error('Failed inserting to DMS');
}
$upload_data['dms_id'] = $result->retval;
$insDmsResult = $this->_ci->DmsModel->insert($this->_ci->DmsModel->filterFields($dms));
if (isError($insDmsResult)) return $insDmsResult;
$upload_data['dms_id'] = getData($insDmsResult);
// Insert DMS version
if (!$result = $this->ci->DmsVersionModel->insert(
$this->ci->DmsVersionModel->filterFields($dms, $result->retval, $filename)))
{
return error('Failed inserting DMS version');
}
$insVersionResult = $this->_ci->DmsVersionModel->insert(
$this->_ci->DmsVersionModel->filterFields(
$dms,
$upload_data['dms_id'],
$upload_data['file_name']
)
);
if (isError($insVersionResult)) return $insVersionResult;
// return result of uploaded data
return success($upload_data); // data about the uploaded file
// Return result of uploaded data
return success($upload_data);
}
/**
* Download a document.
*
@@ -171,38 +620,31 @@ class DmsLib extends FHC_Controller
*/
public function download($dms_id, $filename = null, $disposition = 'inline')
{
$result = $this->getFileInfo($dms_id);
if (isError($result))
// Retrieves info about the given dms
$fileInfoResult = $this->getFileInfo($dms_id);
if (isError($fileInfoResult)) return error(getError($fileInfoResult));
// If data have been found
if (hasData($fileInfoResult))
{
return error(getError($result));
$fileObj = getData($fileInfoResult);
// Change filename, if filename is provided
if (!isEmptyString($filename)) $fileObj->name = $filename;
// Add file disposition if disposition has a valid value
if ($disposition == 'attachment' || $disposition == 'inline')
{
$fileObj->disposition = $disposition;
}
return success($fileObj);
}
$fileObj = getData($result);
// Change filename, if filename is provided
if (is_string($filename))
{
$fileObj->name = $filename;
}
// Add file disposition
if ($disposition == 'attachment')
{
$fileObj->disposition = 'attachment';
}
else
{
$fileObj->disposition = 'inline';
}
// Output file
if(!$this->outputFile($fileObj))
{
return error('Error on file output');
}
// If no data have been found then return an empty success
return success();
}
/**
* Get file information.
*
@@ -212,28 +654,28 @@ class DmsLib extends FHC_Controller
*/
public function getFileInfo($dms_id, $version = null)
{
if (!is_numeric($dms_id))
{
return error('Wrong parameter');
}
// Load file
// Checks the dms_id parameter
if (!is_numeric($dms_id)) return error('Wrong parameter');
// Load DMS from database
$result = $this->load($dms_id, $version);
if (isError($result)) return error(getError($result));
if (isError($result))
// If data have been found
if (hasData($result))
{
return error(getError($result));
// Store file information in fileObj
$fileObj = new stdClass();
$fileObj->filename = getData($result)[0]->filename;
$fileObj->file = DMS_PATH.getData($result)[0]->filename;
$fileObj->name = DMS_PATH.getData($result)[0]->name; // original user filename
$fileObj->mimetype = getData($result)[0]->mimetype;
return success($fileObj);
}
// Store file information in fileObj
$fileObj = new StdClass();
$fileObj->filename = getData($result)[0]->filename;
$fileObj->file = DMS_PATH. getData($result)[0]->filename;
$fileObj->name = DMS_PATH. getData($result)[0]->name; // original users filename
$fileObj->mimetype = DMS_PATH. getData($result)[0]->mimetype;
return success($fileObj);
// If no data have been found return an empty success
return success();
}
/**
@@ -253,20 +695,20 @@ class DmsLib extends FHC_Controller
$result = $this->_saveFileOnInsert($dms);
if (isSuccess($result))
{
$filename = $result->retval;
$filename = getData($result);
if (isset($dms['dms_id']) && $dms['dms_id'] != '')
{
$result = $this->ci->DmsVersionModel->insert(
$this->ci->DmsVersionModel->filterFields($dms, $dms['dms_id'], $filename)
$result = $this->_ci->DmsVersionModel->insert(
$this->_ci->DmsVersionModel->filterFields($dms, $dms['dms_id'], $filename)
);
}
else
{
$result = $this->ci->DmsModel->insert($this->ci->DmsModel->filterFields($dms));
$result = $this->_ci->DmsModel->insert($this->_ci->DmsModel->filterFields($dms));
if (isSuccess($result))
{
$result = $this->ci->DmsVersionModel->insert(
$this->ci->DmsVersionModel->filterFields($dms, $result->retval, $filename)
$result = $this->_ci->DmsVersionModel->insert(
$this->_ci->DmsVersionModel->filterFields($dms, getData($result), $filename)
);
}
}
@@ -277,15 +719,15 @@ class DmsLib extends FHC_Controller
$result = $this->_saveFileOnUpdate($dms);
if (isSuccess($result))
{
$result = $this->ci->DmsModel->update($dms['dms_id'], $this->ci->DmsModel->filterFields($dms));
$result = $this->_ci->DmsModel->update($dms['dms_id'], $this->_ci->DmsModel->filterFields($dms));
if (isSuccess($result))
{
$result = $this->ci->DmsVersionModel->update(
$result = $this->_ci->DmsVersionModel->update(
array(
$dms['dms_id'],
$dms['version']
),
$this->ci->DmsVersionModel->filterFields($dms)
$this->_ci->DmsVersionModel->filterFields($dms)
);
}
}
@@ -308,56 +750,54 @@ class DmsLib extends FHC_Controller
if (is_numeric($person_id) && is_numeric($dms_id))
{
// Start DB transaction
$this->ci->db->trans_start(false);
$this->_ci->db->trans_start(false);
// Get akte_id from table tbl_akte
$result = $this->ci->AkteModel->loadWhere(array('person_id' => $person_id, 'dms_id' => $dms_id));
$result = $this->_ci->AkteModel->loadWhere(array('person_id' => $person_id, 'dms_id' => $dms_id));
if (isSuccess($result))
{
// Delete all entries in tbl_akte
$cnt = count($result->retval);
for ($i = 0; $i < $cnt; $i++)
for ($i = 0; $i < count(getData($result)); $i++)
{
$this->ci->AkteModel->delete($result->retval[$i]->akte_id);
$this->_ci->AkteModel->delete(getData($result)[$i]->akte_id);
}
// Get all filenames related to this dms
$resultFileNames = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id));
$resultFileNames = $this->_ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id));
if (isSuccess($resultFileNames))
{
// Delete from tbl_dms_version
$result = $this->ci->DmsVersionModel->delete(array('dms_id' => $dms_id));
$result = $this->_ci->DmsVersionModel->delete(array('dms_id' => $dms_id));
if (isSuccess($result))
{
// Delete from tbl_dms
$result = $this->ci->DmsModel->delete($dms_id);
$result = $this->_ci->DmsModel->delete($dms_id);
}
}
}
// Transaction complete!
$this->ci->db->trans_complete();
$this->_ci->db->trans_complete();
// Check if everything went ok during the transaction
if ($this->ci->db->trans_status() === false || isError($result))
if ($this->_ci->db->trans_status() === false || isError($result))
{
$this->ci->db->trans_rollback();
$this->_ci->db->trans_rollback();
$result = error('An error occurred while performing a delete operation', EXIT_ERROR);
}
else
{
$this->ci->db->trans_commit();
$this->_ci->db->trans_commit();
$result = success('Dms successfully removed from DB');
}
// If everything is ok
if (isSuccess($result))
{
$cnt = count($resultFileNames->retval);
// Remove all files related to this person and dms
for ($i = 0; $i < $cnt; $i++)
for ($i = 0; $i < count(getData($resultFileNames)); $i++)
{
$this->ci->DmsFSModel->remove($resultFileNames->retval[$i]->filename);
$this->_ci->DmsFSModel->removeBase64(getData($resultFileNames)[$i]->filename);
}
}
}
@@ -376,19 +816,19 @@ class DmsLib extends FHC_Controller
*/
public function getAkteContent($akte_id)
{
$akte = $this->ci->AkteModel->load($akte_id);
$akte = $this->_ci->AkteModel->load($akte_id);
if (hasData($akte))
{
if ($akte->retval[0]->inhalt != '')
if (getData($akte)[0]->inhalt != '')
{
return success(base64_decode($akte->retval[0]->inhalt));
return success(base64_decode(getData($akte)[0]->inhalt));
}
elseif ($akte->retval[0]->dms_id != '')
elseif (getData($akte)[0]->dms_id != '')
{
$dmscontent = $this->read($akte->retval[0]->dms_id);
$dmscontent = $this->read(getData($akte)[0]->dms_id);
if (isSuccess($dmscontent))
{
return success(base64_decode($dmscontent->retval[0]->file_content));
return success(base64_decode(getData($dmscontent)[0]->file_content));
}
else
{
@@ -415,10 +855,10 @@ class DmsLib extends FHC_Controller
{
$filename = uniqid().'.'.pathinfo($dms['name'], PATHINFO_EXTENSION);
$result = $this->ci->DmsFSModel->write($filename, $dms['file_content']);
$result = $this->_ci->DmsFSModel->writeBase64($filename, $dms['file_content']);
if (isSuccess($result))
{
$result->retval = $filename;
$result = success($filename);
}
return $result;
@@ -439,7 +879,7 @@ class DmsLib extends FHC_Controller
if (hasData($result))
{
$result = $this->ci->DmsFSModel->write($result->retval[0]->filename, $dms['file_content']);
$result = $this->_ci->DmsFSModel->writeBase64(getData($result)[0]->filename, $dms['file_content']);
}
}
@@ -451,12 +891,13 @@ class DmsLib extends FHC_Controller
*/
private function _loadUploadLibrary($allowed_types)
{
$config['upload_path'] = $this->UPLOAD_PATH;
$config['allowed_types'] = implode('|', $allowed_types);
$config['overwrite'] = true;
$config['file_name'] = uniqid().'.pdf';
$config = array();
$config['upload_path'] = DMS_PATH;
$config['allowed_types'] = implode('|', $allowed_types);
$config['overwrite'] = true;
$config['file_name'] = uniqid().'.pdf';
$this->ci->load->library('upload', $config);
$this->ci->upload->initialize($config);
$this->_ci->load->library('upload', $config);
$this->_ci->upload->initialize($config);
}
}
+304
View File
@@ -0,0 +1,304 @@
<?php
/* Copyright (C) 2022 fhcomplete.net
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
*/
require_once(dirname(__FILE__).'/../../vendor/nategood/httpful/bootstrap.php');
use \ZipArchive as ZipArchive;
/**
* Simple client to convert documents using Docsbox
*/
class DocsboxLib
{
const ERROR = 1;
const SUCCESS = 0;
const STATUS_FINISHED = 'finished'; // Docsbox status when a document conversion ended
const STATUS_QUEUED = 'queued'; // Docsbox status when a file has been queued for the conversion
const STATUS_STARTED = 'started'; // Docsbox status when a file has started being worked
const STATUS_WORKING = 'working'; // Docsbox status when a file is being converted
const OUTPUT_FILENAME = 'out.zip.pdf'; // File name used by docsbox to save a converted document
const DEFAULT_FORMAT = 'pdf'; // Default supported format
// -------------------------------------------------------------------------------------------------
// Public static methods
/**
* Static method used to convert a document using a Docsbox installation (local/remote) over the network
* It return 0 on success and any other integer on error
* NOTE: currently format is not supported
*/
public static function convert($inputFileName, $outputFileName, $format)
{
// If a format has not been given
if (($format == null) || ($format != null && ctype_space($format) === true)) $format = self::DEFAULT_FORMAT;
// Posts the file to docsbox
$queueId = self::_postFile($inputFileName);
// If an error occurred
if ($queueId == null) return self::ERROR;
// Checks and waits if the file has been converted
$resultUrl = self::_checkConvertion($queueId);
// If an error occurred
if ($resultUrl == null) return self::ERROR;
// Download and rename the converted file
$downloaded = self::_downloadFile($resultUrl, $outputFileName);
// If an error occurred
if (!$downloaded) return self::ERROR;
return self::SUCCESS;
}
// -------------------------------------------------------------------------------------------------
// Private static methods
/**
* Posts the given file to a Docsboxserver and checks the response to return a valid queue id
* On failure it returns a null value
*/
private static function _postFile($inputFileName)
{
$queueId = null;
try
{
// Posts the given file and expects a response in JSON format
$postFileResponse = \Httpful\Request::post(DOCSBOX_SERVER.DOCSBOX_PATH_API)
->attach(array('file' => $inputFileName))
->expectsJson()
->send();
// Checks that:
// - the response is not empty
// - the reponse body has the property id
// - the property id is a valid string
// - the reponse body has the property status
// - docsbox queued the conversion of the posted file
if (is_object($postFileResponse)
&& isset($postFileResponse->body)
&& isset($postFileResponse->body->id)
&& $postFileResponse->body->id != '' && $postFileResponse->body->id != null
&& isset($postFileResponse->body->status)
&& $postFileResponse->body->status == self::STATUS_QUEUED)
{
$queueId = $postFileResponse->body->id;
}
else
{
// If docsbox refused to convert the posted file
if (isset($postFileResponse->body->status)
&& $postFileResponse->body->status != self::STATUS_QUEUED)
{
error_log(
'Docsbox did not queue the posted file. Returned status: '.
$postFileResponse->body->status
);
}
else // any other generic error
{
error_log(
'An error occurred while posting to docsbox. Response: '.
print_r($postFileResponse, 1)
);
}
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception
{
error_log($cee->getMessage());
}
catch (Exception $e) // any other exception
{
error_log($e->getMessage());
}
return $queueId;
}
/**
* Check the status of the file convertion identified by the given queue element id
* A URL is returned with the path where it is possible to download the converted file
* If an error occurred then a null value is returned
*/
private static function _checkConvertion($queueId)
{
$resultUrl = null;
$startConvertionsTime = time(); // time when the file conversion has started
// Until a timeout has occurred
while (time() - $startConvertionsTime <= DOCSBOX_CONVERSION_TIMEOUT)
{
sleep(DOCSBOX_WAITING_SLEEP_TIME); // takes a nap on every round
try
{
// Calls the docsbox server to check the status of the
// file conversion using the provided queue id
// it expects a response in JSON format
$getStatusResponse = \Httpful\Request::get(DOCSBOX_SERVER.DOCSBOX_PATH_API.$queueId)
->expectsJson()
->send();
// Checks that:
// - the response is not empty
// - the reponse body has the property id
// - the property id is a valid string
// - the reponse body has the property status
// - docsbox is working the conversion of the posted file
if (is_object($getStatusResponse)
&& isset($getStatusResponse->body->id)
&& $getStatusResponse->body->id != '' && $getStatusResponse->body->id != null
&& isset($getStatusResponse->body->status))
{
// Checks that docsbox has finished working on the file conversion
// and that there is a valid resultUrl property
if ($getStatusResponse->body->status == self::STATUS_FINISHED
&& isset($getStatusResponse->body->result_url)
&& $getStatusResponse->body->result_url != ''
&& $getStatusResponse->body->result_url != null)
{
$resultUrl = $getStatusResponse->body->result_url;
break;
}
// Just started or still working on it
elseif ($getStatusResponse->body->status == self::STATUS_WORKING
|| $getStatusResponse->body->status == self::STATUS_STARTED)
{
// go on!
}
else // any other status is abnormal
{
error_log(
'Not valid status for queue element: '.$queueId.'. Response: '.
print_r($getStatusResponse, 1)
);
break; // interrupt the loop on error
}
}
else // if the response from the docsbox server is not valid
{
error_log(
'An error occurred while checking the docsbox activity. Response: '.
print_r($getStatusResponse, 1)
);
break; // interrupt the loop on error
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception
{
error_log($cee->getMessage());
break; // interrupt the loop on error
}
catch (Exception $e) // any other exception
{
error_log($e->getMessage());
break; // interrupt the loop on error
}
}
return $resultUrl;
}
/**
* Download the converted file using the provided URL, unzip it, and renames it into the provided file name
*/
private static function _downloadFile($resultUrl, $outputFileName)
{
$downloaded = false; // pessimistic assumption
try
{
// Download the file
$getFileResponse = \Httpful\Request::get(DOCSBOX_SERVER.$resultUrl)->send();
// If the downloaded file content is valid and not empty
if (isset($getFileResponse->body)
&& $getFileResponse->body != null
&& $getFileResponse->body != '')
{
// Output directory where to unzip the downloaded zip file
$outputDirectory = dirname($outputFileName);
// The path and name of the downloaded zip file
$temporaryDownloadedZip = sys_get_temp_dir().'/'.basename($resultUrl);
// Write the file content into a temporary directory and file
if (file_put_contents($temporaryDownloadedZip, $getFileResponse->body) != false)
{
$zipArchive = new ZipArchive;
// Open and extract the dowloaded zip file into the directory of the output file
if ($zipArchive->open($temporaryDownloadedZip) === true
&& $zipArchive->extractTo($outputDirectory) === true
&& $zipArchive->close() === true)
{
// Opened, extracted and closed!
// Rename the extracted file to the given output file name
if (rename($outputDirectory.'/'.self::OUTPUT_FILENAME, $outputFileName))
{
$downloaded = true;
}
else
{
error_log(
'An error occurred while renaming the extracted file: '.
$outputDirectory.'/'.self::OUTPUT_FILENAME.' into: '.
$outputFileName
);
}
}
else
{
error_log(
'An error occurred while working the dowloaded zip file: '.
$temporaryDownloadedZip
);
}
}
else // if an error occurred while writing
{
error_log(
'An error occurred while writing the file content to: '.
$temporaryDownloadedZip
);
}
}
else // if the downloaded file is not valid
{
error_log(
'An error occurred while downloading the file from the docsbox server: '.
print_r($getFileResponse, 1)
);
}
}
catch(\Httpful\Exception\ConnectionErrorException $cee)
{
error_log($cee->getMessage());
}
catch (Exception $e)
{
error_log($e->getMessage());
}
return $downloaded;
}
}
+50 -20
View File
@@ -14,20 +14,28 @@ class DocumentLib
// Gets CI instance
$this->ci =& get_instance();
exec('unoconv --version', $ret_arr);
if(isset($ret_arr[0]))
// Which document converter has to be used
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
$hlp = explode(' ', $ret_arr[0]);
if(isset($hlp[1]))
{
$this->unoconv_version = $hlp[1];
}
else
show_error('Could not get Unoconv Version');
// Use docsbox!!
}
else
show_error('Unoconv not found - Please install Unoconv');
{
exec('unoconv --version', $ret_arr);
if(isset($ret_arr[0]))
{
$hlp = explode(' ', $ret_arr[0]);
if(isset($hlp[1]))
{
$this->unoconv_version = $hlp[1];
}
else
show_error('Could not get Unoconv Version');
}
else
show_error('Unoconv not found - Please install Unoconv');
}
}
/**
@@ -57,9 +65,16 @@ class DocumentLib
case 'application/vnd.ms-word':
case 'application/vnd.oasis.opendocument.text':
case 'text/plain':
// Unoconv Version 0.6 seems to fail on converting TXT Files
if ($this->unoconv_version == '0.6')
return error();
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
// Use docsbox
}
else
{
// Unoconv Version 0.6 seems to fail on converting TXT Files
if ($this->unoconv_version == '0.6')
return error();
}
$ret = $this->convert($filename, $outFile, 'pdf');
if(isSuccess($ret))
@@ -105,6 +120,7 @@ class DocumentLib
finfo_close($finfo);
$out = null;
exec($cmd, $out, $ret);
if ($ret != 0)
{
@@ -123,13 +139,26 @@ class DocumentLib
*/
public function convert($inFile, $outFile, $format)
{
if ($this->unoconv_version == '0.6')
$command = 'unoconv -f %1$s %3$s > %2$s';
else
$command = 'unoconv -f %s --output %s %s 2>&1';
$command = sprintf($command, $format, $outFile, $inFile);
$ret = 0;
exec($command, $out, $ret);
// If it is set to use docsbox
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
require_once(dirname(__FILE__).'/../application/libraries/DocsboxLib.php');
$ret = DocsboxLib::convert($inFile, $outFile, $format);
}
else // otherwise use unoconv
{
if ($this->unoconv_version == '0.6')
$command = 'unoconv -f %1$s %3$s > %2$s';
else
$command = 'unoconv -f %s --output %s %s 2>&1';
$command = sprintf($command, $format, $outFile, $inFile);
$out = null;
exec($command, $out, $ret);
}
if ($ret != 0)
{
@@ -191,6 +220,7 @@ class DocumentLib
$cmd .= '/countspaces { [ exch { dup 32 ne { pop } if } forall ] length } bind def >> ';
$cmd .= 'setpagedevice viewJPEG"';
$out = null;
exec($cmd, $out, $ret);
if ($ret != 0)
{
+44 -20
View File
@@ -1,7 +1,25 @@
<?php
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
* Library to manage core extensions
*/
@@ -23,7 +41,7 @@ class ExtensionsLib
// Directories that are part of the extension archive
private $SOFTLINK_TARGET_DIRECTORIES = array(
APPPATH => array('config', 'controllers', 'helpers', 'hooks', 'libraries', 'models', 'views', 'widgets'),
APPPATH => array('config', 'components', 'controllers', 'helpers', 'hooks', 'libraries', 'models', 'views', 'widgets'),
DOC_ROOT => array('public')
);
@@ -181,17 +199,15 @@ class ExtensionsLib
// Select all the version of this extension
$this->_ci->ExtensionsModel->addSelect('extension_id');
$result = $this->_ci->ExtensionsModel->loadWhere(array('name' => $extensionName));
if (hasData($result)) // if something was found
// If something was found
if (hasData($result))
{
$extsArray = array();
foreach ($result->retval as $key => $extension) // loops on them
// Loops on them
foreach ($result->retval as $extension)
{
// Remove them all
$result = $this->_ci->ExtensionsModel->delete($extension->extension_id);
if (isSuccess($result))
{
$delExtension = true;
}
if (isSuccess($result)) $delExtension = true;
}
}
}
@@ -432,9 +448,13 @@ class ExtensionsLib
// If no errors occurred
if ($extensionJson != null)
{
// Default value
$fhcomplete_version = 0;
require_once('version.php'); // get the core version
// Checks if the required core version of the extension is the same of this system
if (isset($extensionJson->core_version) && $extensionJson->core_version == $fhcomplete_version)
if (isset($extensionJson->core_version) && version_compare($extensionJson->core_version, $fhcomplete_version,'<='))
{
$this->_printMessage('Required core version: '.$extensionJson->core_version);
$this->_printMessage('Current core version: '.$fhcomplete_version);
@@ -587,18 +607,22 @@ class ExtensionsLib
for ($sqlDir = $startVersion; $sqlDir <= $extensionJson->version; $sqlDir++)
{
// If a directory with the same value of the version is present in the sql scripts directory
if (($files = glob($pkgSQLsPath.'/'.$sqlDir.'/*'.ExtensionsLib::SQL_FILE_EXTENSION)) != false)
{
$files = glob($pkgSQLsPath.'/'.$sqlDir.'/*'.ExtensionsLib::SQL_FILE_EXTENSION);
if ($files != false)
{
// Loads every sql files
foreach ($files as $file)
{
$sql = file_get_contents($file); // gets the entire content of the file
foreach ($files as $file)
{
$sql = file_get_contents($file); // gets the entire content of the file
$this->_printMessage('Executing query:');
$this->_printMessage($sql);
// Try to execute that
if (!isSuccess($result = @$this->_ci->ExtensionsModel->executeQuery($sql)))
$resultQuery = @$this->_ci->ExtensionsModel->executeQuery($sql);
// If _not_ a success
if (!isSuccess($resultQuery))
{
$this->_errorOccurred = true;
$this->_printFailure(' error occurred while executing the query');
@@ -608,11 +632,11 @@ class ExtensionsLib
else
{
$this->_printMessage('Query result:');
var_dump($result->retval); // KEEP IT!!!
var_dump(getData($resultQuery)); // KEEP IT!!!
$this->_ci->eprintflib->printEOL();
}
}
}
}
}
}
$this->_printSuccess(!$this->_errorOccurred);
@@ -673,7 +697,7 @@ class ExtensionsLib
foreach ($this->SOFTLINK_TARGET_DIRECTORIES as $rootPath => $targetDirectories)
{
foreach ($targetDirectories as $key => $targetDirectory)
foreach ($targetDirectories as $targetDirectory)
{
if (file_exists($rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName))
{
@@ -727,7 +751,7 @@ class ExtensionsLib
// For every target directory
foreach ($this->SOFTLINK_TARGET_DIRECTORIES as $rootPath => $targetDirectories)
{
foreach ($targetDirectories as $key => $targetDirectory)
foreach ($targetDirectories as $targetDirectory)
{
// If destination of the symlink does not exist
if (!file_exists($rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName))
-142
View File
@@ -1,142 +0,0 @@
<?php
/***
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
class FilesystemLib
{
/**
* checkParameters
*/
private function checkParameters($filepath, $filename)
{
if (isset($filepath) && isset($filename) &&
$filepath != '' && $filename != '')
{
return true;
}
else
{
return false;
}
}
/**
* read
*/
public function read($filepath, $filename)
{
$result = null;
if ($this->checkParameters($filepath, $filename))
{
$resource = $filepath.DIRECTORY_SEPARATOR.$filename;
if (file_exists($resource) && $fileHandle = fopen($resource, 'r'))
{
$result = '';
while (!feof($fileHandle))
{
$result .= fread($fileHandle, 8192);
}
fclose($fileHandle);
}
}
return $result;
}
/**
* write
*/
public function write($filepath, $filename, $content)
{
$result = null;
if ($this->checkParameters($filepath, $filename) && isset($content))
{
$resource = $filepath.DIRECTORY_SEPARATOR.$filename;
if (is_writable($filepath) && $fileHandle = fopen($resource, 'w'))
{
if (fwrite($fileHandle, $content) !== false)
{
$result = true;
}
fclose($fileHandle);
}
}
return $result;
}
/**
* append
*/
public function append($filepath, $filename, $content)
{
$result = null;
if ($this->checkParameters($filepath, $filename) && isset($content))
{
$resource = $filepath.DIRECTORY_SEPARATOR.$filename;
if (is_writable($resource) && $fileHandle = fopen($resource, 'a'))
{
if (fwrite($fileHandle, $content) !== false)
{
$result = true;
}
fclose($fileHandle);
}
}
return $result;
}
/**
* remove
*/
public function remove($filepath, $filename)
{
$result = null;
if ($this->checkParameters($filepath, $filename))
{
if (is_writable($filepath))
{
$resource = $filepath.DIRECTORY_SEPARATOR.$filename;
$result = unlink($resource);
}
}
return $result;
}
/**
* rename
*/
public function rename($filepath, $filename, $newFilepath, $newFilename)
{
$result = null;
if ($this->checkParameters($filepath, $filename) && $this->checkParameters($newFilepath, $newFilename))
{
$resource = $filepath.DIRECTORY_SEPARATOR.$filename;
if (is_writable($filepath) && is_writable($newFilepath) && file_exists($resource))
{
$destination = $newFilepath.DIRECTORY_SEPARATOR.$newFilename;
$result = rename($resource, $destination);
}
}
return $result;
}
}
File diff suppressed because it is too large Load Diff
+15 -10
View File
@@ -340,20 +340,25 @@ class FilterWidgetLib
{
$filterDefinition = $filters[$filtersCounter]; // definition of one filter
if ($filtersCounter > 0)
$where .= ' AND '; // if it's NOT the last one
if (!isEmptyString($filterDefinition->name)) // if the name of the applied filter is valid
// If the name of the applied filter is valid
if (!isEmptyString($filterDefinition->name))
{
// ...build the condition
$where .= '"'.$filterDefinition->name.'"'.$this->_getDatasetQueryCondition($filterDefinition);
// Build the query conditions
$datasetQueryCondition = $this->_getDatasetQueryCondition($filterDefinition);
// If the built condition is valid then add it to the query clause
if (!isEmptyString($datasetQueryCondition))
{
// // If this is NOT the first one
if ($filtersCounter > 0) $where .= ' AND ';
$where .= '"'.$filterDefinition->name.'"'.$datasetQueryCondition;
}
}
}
if ($where != '') // if the SQL where clause was built
{
$datasetQuery .= ' WHERE '.$where;
}
// If the SQL where clause was built
if ($where != '') $datasetQuery .= ' WHERE '.$where;
}
return $datasetQuery;
+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");
+34 -7
View File
@@ -1,4 +1,20 @@
<?php
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
@@ -37,7 +53,7 @@ class NavigationLib
// Loads library ExtensionsLib
$this->_ci->load->library('ExtensionsLib');
$this->_navigationPage = $this->_getNavigationtPage($params); // sets the id for the related navigation widget
$this->_navigationPage = $this->_getNavigationPage($params); // sets the id for the related navigation widget
}
//------------------------------------------------------------------------------------------------------------------
@@ -67,9 +83,19 @@ class NavigationLib
* Returns the structure for one level of the menu
*/
public function oneLevel(
$description, $link = '#', $children = null, $icon = '', $expand = false,
$subscriptDescription = null, $subscriptLinkClass = null, $subscriptLinkValue = null, $target = '',
$sort = null, $requiredPermissions = null, $subscriptLinkHref = '#')
$description,
$link = '#',
$children = null,
$icon = '',
$expand = false,
$subscriptDescription = null,
$subscriptLinkClass = null,
$subscriptLinkValue = null,
$target = '',
$sort = null,
$requiredPermissions = null,
$subscriptLinkHref = '#'
)
{
return array(
'description' => $description,
@@ -223,7 +249,8 @@ class NavigationLib
$filename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_NAVIGATION_FILENAME;
if (file_exists($filename))
{
unset($config);
$config = array(); // default value
include($filename);
if (isset($config[$configName]) && is_array($config[$configName]))
@@ -278,7 +305,7 @@ class NavigationLib
}
else
{
foreach ($navigationArray as $key=>$row)
foreach ($navigationArray as $key => $row)
{
// Search for * Entries
if (mb_strpos($key, '*') === 0 || mb_strpos($key, '*') === mb_strlen($key) - 1)
@@ -300,7 +327,7 @@ class NavigationLib
* Return an unique string that identify this navigation widget
* NOTE: The default value is the URI where the NavigationWidget is called
*/
private function _getNavigationtPage($params)
private function _getNavigationPage($params)
{
if ($params != null
&& is_array($params)
+298
View File
@@ -0,0 +1,298 @@
<?php
/**
* Copyright (C) 2022 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \stdClass as stdClass;
/**
*
*/
class SearchBarLib
{
// Error constats
const ERROR_WRONG_JSON = 'ERR001';
const ERROR_WRONG_SEARCHSTR = 'ERR002';
const ERROR_NO_TYPES = 'ERR003';
const ERROR_WRONG_TYPES = 'ERR004';
// List of allowed types of search
const ALLOWED_TYPES = ['mitarbeiter', 'organisationunit', 'raum', 'person', 'student', 'prestudent', 'document', 'cms'];
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
private $_ci; // Code igniter instance
/**
* Gets the CI instance and loads model
*/
public function __construct()
{
$this->_ci =& get_instance(); // get code igniter instance
// It is loaded only to have the DB_Model available
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* It performes the search of the given search string using the specified search types
*/
public function search($searchstr, $types)
{
// Checks if the given parameters are fine
$search = $this->_checkParameters($searchstr, $types);
// If the check was successful then perform the search
if (isSuccess($search)) $search = $this->_search($searchstr, $types);
return $search; // return the result
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Checks:
* - The given searchstr is a not empty string
* - The given types is a not empty array and contains allowed search types
*/
private function _checkParameters($searchstr, $types)
{
// If searchstr is empty
if (isEmptyString($searchstr)) return error(self::ERROR_WRONG_SEARCHSTR);
// If types is not an array or it is empty
if (isEmptyArray($types)) return error(self::ERROR_NO_TYPES);
// If all the elements in types are allowed search types
if (!isEmptyArray(array_diff($types, self::ALLOWED_TYPES))) return error(self::ERROR_WRONG_TYPES);
return success(); // The check is fine!
}
/**
* Loops on types and perform the search of that type using searchstr
* Then it collects all the returned data into an array as property of an object
*/
private function _search($searchstr, $types)
{
// Object to be returned
$result = new stdClass();
$result->data = array();
// For each search type
foreach ($types as $type)
{
// Perform the search and then add the result to data
$result->data = array_merge($result->data, $this->{'_'.$type}($searchstr, $type));
}
return $result;
}
/**
* Search for employees
*/
private function _mitarbeiter($searchstr, $type)
{
$dbModel = new DB_Model();
$employees = $dbModel->execReadOnlyQuery('
SELECT
\''.$type.'\' AS type,
b.uid AS uid,
p.person_id AS person_id,
p.vorname || \' \' || p.nachname AS name,
ARRAY_AGG(DISTINCT(org.bezeichnung)) AS organisationunit_name,
COALESCE(b.alias, b.uid) || \''.'@'.DOMAIN.'\' AS email,
TRIM(COALESCE(k.kontakt, \'\') || \' \' || COALESCE(m.telefonklappe, \'\')) AS phone,
\''.base_url(self::PHOTO_IMG_URL).'\' || p.person_id AS photo_url,
ARRAY_AGG(DISTINCT(stdkst.bezeichnung)) AS standardkostenstelle
FROM public.tbl_mitarbeiter m
JOIN public.tbl_benutzer b ON(b.uid = m.mitarbeiter_uid)
JOIN (
SELECT o.bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
WHERE bf.funktion_kurzbz = \'kstzuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, bf.uid
) stdkst ON stdkst.uid = b.uid
JOIN public.tbl_person p USING(person_id)
JOIN (
SELECT o.bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
WHERE bf.funktion_kurzbz = \'oezuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, bf.uid
) org ON org.uid = b.uid
LEFT JOIN (
SELECT kontakt, standort_id
FROM public.tbl_kontakt
WHERE kontakttyp = \'telefon\'
) k ON(k.standort_id = m.standort_id)
WHERE b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR org.bezeichnung ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR stdkst.bezeichnung ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
GROUP BY type, b.uid, p.person_id, name, email, m.telefonklappe, phone
');
// If something has been found then return it
if (hasData($employees)) return getData($employees);
// Otherwise return an empty array
return array();
}
/**
* Seach for organisation units
*/
private function _organisationunit($searchstr, $type)
{
$dbModel = new DB_Model();
$ous = $dbModel->execReadOnlyQuery('
SELECT
\''.$type.'\' AS type,
o.oe_kurzbz AS oe_kurzbz,
o.bezeichnung AS name,
oParent.oe_kurzbz AS parentoe_kurzbz,
oParent.bezeichnung AS parentoe_name,
ARRAY_AGG(DISTINCT(bfLeader.uid)) AS leader_uid,
ARRAY_AGG(DISTINCT(bfLeader.vorname || \' \' || bfLeader.nachname)) AS leader_name,
COUNT(bfCount.benutzerfunktion_id) AS number_of_people,
(CASE WHEN o.mailverteiler = TRUE THEN o.oe_kurzbz || \''.'@'.DOMAIN.'\' END) AS mailgroup
FROM public.tbl_organisationseinheit o
LEFT JOIN public.tbl_organisationseinheit oParent ON(oParent.oe_kurzbz = o.oe_parent_kurzbz)
LEFT JOIN (
SELECT benutzerfunktion_id, oe_kurzbz
FROM public.tbl_benutzerfunktion
WHERE funktion_kurzbz = \'oezuordnung\'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
) bfCount ON(bfCount.oe_kurzbz = o.oe_kurzbz)
LEFT JOIN (
SELECT bf.oe_kurzbz, bf.uid, p.vorname, p.nachname
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_benutzer b USING(uid)
JOIN public.tbl_person p USING(person_id)
WHERE funktion_kurzbz = \'Leitung\'
AND (datum_von IS NULL OR datum_von <= NOW())
AND (datum_bis IS NULL OR datum_bis >= NOW())
AND b.aktiv = TRUE
) bfLeader ON(bfLeader.oe_kurzbz = o.oe_kurzbz)
WHERE o.oe_kurzbz ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR o.bezeichnung ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
GROUP BY type, o.oe_kurzbz, o.bezeichnung, oParent.oe_kurzbz, oParent.bezeichnung
');
// If something has been found
if (hasData($ous))
{
// Loop through the returned dataset
foreach (getData($ous) as $ou)
{
// Create the new property leaders as an empty array
$ou->leaders = array();
// Loop through the found leaders for this organisation unit
for ($i = 0; $i < count($ou->leader_uid); $i++)
{
// If a leader exists for this organisationunit and has a name :D
if (!isEmptyString($ou->leader_uid[$i]) && !isEmptyString($ou->leader_name[$i]))
{
// Empty object that will contains the leader uid and name
$leader = new stdClass();
// Set the properties name and uid
$leader->uid = $ou->leader_uid[$i];
$leader->name = $ou->leader_name[$i];
// Add the leader object to the leaders array
$ou->leaders[] = $leader;
}
}
// Remove the not needed properties leader_uid and leader_name
unset($ou->leader_uid);
unset($ou->leader_name);
}
// Returns the changed dataset
return getData($ous);
}
// Otherwise return an empty array
return array();
}
/**
* Search for persons
*/
private function _person($searchstr, $type)
{
return array();
}
/**
* Search for students
*/
private function _student($searchstr, $type)
{
return array();
}
/**
* Search for prestudents
*/
private function _prestudent($searchstr, $type)
{
return array();
}
/**
* Search for documents
*/
private function _document($searchstr, $type)
{
return array();
}
/**
* Search for CMSs
*/
private function _cms($searchstr, $type)
{
return array();
}
/**
* Search for rooms
*/
private function _raum($searchstr, $type)
{
return array();
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,103 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class PlausicheckProducerLib
{
const CI_LIBRARY_PATH = 'application/libraries';
const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks';
const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck';
private $_ci; // ci instance
private $_currentStudiensemester; // current Studiensemester
// set fehler which can be produced by the job
// structure: fehler_kurzbz => class (library) name for resolving
private $_fehlerLibMappings = array(
'AbbrecherAktiv' => 'AbbrecherAktiv',
'AbschlussstatusFehlt' => 'AbschlussstatusFehlt',
'AktSemesterNull' => 'AktSemesterNull',
'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus',
'AktiverStudentstatusOhneKontobuchung' => 'AktiverStudentstatusOhneKontobuchung',
'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'
);
public function __construct()
{
$this->_ci =& get_instance(); // get ci instance
// load models
$this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
// get current Studiensemester
$studiensemesterRes = $this->_ci->StudiensemesterModel->getAkt();
if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz;
}
/**
* Executes check for a fehler_kurzbz, returns the result.
* @param $fehler_kurzbz string
* @param $studiensemester_kurzbz string optionally needed for issue production
* @param $studiengang_kz int optionally needed for issue production
*/
public function producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz = null, $studiengang_kz = null)
{
$libName = $this->_fehlerLibMappings[$fehler_kurzbz];
// get Studiensemester
if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester;
// get path of library for issue to be produced
$issuesLibPath = DOC_ROOT . self::CI_LIBRARY_PATH . '/' . self::PLAUSI_ISSUES_FOLDER . '/';
$issuesLibFilePath = $issuesLibPath . $libName . '.php';
// check if library file exists
if (!file_exists($issuesLibFilePath)) return error("Issue library file " . $issuesLibFilePath . " does not exist");
// load library connected to fehlercode
$this->_ci->load->library(self::PLAUSI_ISSUES_FOLDER . '/'.$libName);
$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");
// pass the data needed for issue check
$paramsForCheck = array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'studiengang_kz' => $studiengang_kz
);
// call the function for checking for issue production
return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($paramsForCheck);
}
/**
* Gets all fehler_kurzbz for fehler which need to be checked.
*/
public function getFehlerKurzbz()
{
return array_keys($this->_fehlerLibMappings);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AbbrecherAktiv extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getAbbrecherAktiv($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);
}
}
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AbschlussstatusFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getAbschlussstatusFehlt($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,50 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AktSemesterNull extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getAktSemesterNull($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AktiverStudentOhneStatus extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus($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);
}
}
@@ -0,0 +1,50 @@
<?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();
// 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->_ci->plausichecklib->getAktiverStudentstatusOhneKontobuchung($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,56 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus(
$studiensemester_kurzbz,
$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);
}
}
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class BewerberNichtZumRtAngetreten extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getBewerberNichtZumRtAngetreten($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class DatumAbschlusspruefungFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getDatumAbschlusspruefungFehlt($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class DatumSponsionFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getDatumSponsionFehlt($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,45 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge($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);
}
}
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscheAnzahlAbschlusspruefungen extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscheAnzahlHeimatadressen extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getFalscheAnzahlHeimatadressen($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscheAnzahlZustelladressen extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getFalscheAnzahlZustelladressen($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class GbDatumWeitZurueck extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getGbDatumWeitZurueck($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class InaktiverStudentAktiverStatus extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getInaktiverStudentAktiverStatus($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class IncomingHeimatNationOesterreich extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getIncomingHeimatNationOesterreich($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class IncomingOhneIoDatensatz extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz($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);
}
}
@@ -0,0 +1,44 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class IncomingOrGsFoerderrelevant extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getIncomingOrGsFoerderrelevant($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,51 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class InskriptionVorLetzerBismeldung extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getInskriptionVorLetzerBismeldung($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class NationNichtOesterreichAberGemeinde extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$personRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde($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);
}
}
@@ -0,0 +1,52 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OrgformStgUngleichOrgformPrestudent extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,24 @@
<?php
/**
* class defining ressources and method to use for plausicheck issue producer
*/
abstract class PlausiChecker
{
protected $_ci; // code igniter instance
public function __construct()
{
$this->_ci =& get_instance(); // get code igniter instance
// load libraries
$this->_ci->load->library('issues/PlausicheckLib'); // load plausicheck library
}
/**
* 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,50 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class PrestudentMischformOhneOrgform extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getPrestudentMischformOhneOrgform($studiensemester_kurzbz, $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);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StgPrestudentUngleichStgStudent extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent($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);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StgPrestudentUngleichStgStudienplan extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan($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);
}
}
@@ -0,0 +1,43 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StudentstatusNachAbbrecher extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// pass parameters needed for plausicheck
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
// get all students failing the plausicheck
$prestudentRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher($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);
}
}
@@ -0,0 +1,51 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class StudienplanUngueltig extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// 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->_ci->plausichecklib->getStudienplanUngueltig($studiensemester_kurzbz, $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);
}
}
@@ -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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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 shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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,32 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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');
/**
* Incoming shouldn't have austrian home address.
*/
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/PlausicheckLib');
// check if issue persists
$checkRes = $this->_ci->plausichecklib->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
}
}

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