mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 15:04:04 +00:00
Compare commits
453
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96a373682a | ||
|
|
ebb0042881 | ||
|
|
4e7a3b22fe | ||
|
|
9e2cc68531 | ||
|
|
45647f0cec | ||
|
|
50a518ea7a | ||
|
|
2b44b421dc | ||
|
|
70a93cc093 | ||
|
|
0c4d102850 | ||
|
|
2e15f2c5ab | ||
|
|
4768fbda15 | ||
|
|
d8959d9776 | ||
|
|
27bd463109 | ||
|
|
784e5693b4 | ||
|
|
88b49b70e9 | ||
|
|
1f570f8495 | ||
|
|
67a33f2ceb | ||
|
|
4549c92d50 | ||
|
|
751445c199 | ||
|
|
916f5dd68e | ||
|
|
efc8fa1eeb | ||
|
|
0239977d21 | ||
|
|
d58edff92d | ||
|
|
ca4043833e | ||
|
|
643929a0c6 | ||
|
|
a5aa4c8466 | ||
|
|
b97dec7343 | ||
|
|
8b58c82385 | ||
|
|
4ba2869632 | ||
|
|
293bb77179 | ||
|
|
3fe10d715d | ||
|
|
3034615455 | ||
|
|
36064afbba | ||
|
|
5aa007f49c | ||
|
|
f3d031ab16 | ||
|
|
e24a66a454 | ||
|
|
3d8c4fa4d0 | ||
|
|
272014bd78 | ||
|
|
76a8e00edf | ||
|
|
af978e1312 | ||
|
|
a53c4fd623 | ||
|
|
ce62713790 | ||
|
|
34761db664 | ||
|
|
c7131ed775 | ||
|
|
b57e1984a8 | ||
|
|
59c5100a86 | ||
|
|
cf6e747def | ||
|
|
22500a96c1 | ||
|
|
03af6bfda5 | ||
|
|
0fafb95bd8 | ||
|
|
1d838f8116 | ||
|
|
9605227139 | ||
|
|
a64219dd25 | ||
|
|
e06d5fbdc1 | ||
|
|
d30595bbfb | ||
|
|
43d5068cda | ||
|
|
eebe2d6aec | ||
|
|
d5fa13d644 | ||
|
|
9ae2c91677 | ||
|
|
e369a8c03f | ||
|
|
98175c5976 | ||
|
|
94992f40bd | ||
|
|
1e2dbeac10 | ||
|
|
153717b187 | ||
|
|
dd15b37f0f | ||
|
|
2fc2d12d65 | ||
|
|
0279813ba9 | ||
|
|
1c4c90ffba | ||
|
|
acedc11be8 | ||
|
|
c79f664f9e | ||
|
|
f817527ab9 | ||
|
|
754e619e30 | ||
|
|
fb0a92a636 | ||
|
|
03858b12b9 | ||
|
|
342dede1b0 | ||
|
|
6e1c0fe623 | ||
|
|
fece3f7477 | ||
|
|
ab2333f708 | ||
|
|
c4e79ffdf9 | ||
|
|
15c1da74a2 | ||
|
|
4d2a6589b4 | ||
|
|
191a81058c | ||
|
|
dd25c7af75 | ||
|
|
ef996273a7 | ||
|
|
eb164f5f69 | ||
|
|
d33b45d7cb | ||
|
|
adce19e651 | ||
|
|
b3b6d847a7 | ||
|
|
80365de28c | ||
|
|
2d74522a4f | ||
|
|
d00aef66e1 | ||
|
|
241eec3ef2 | ||
|
|
2050f5ae65 | ||
|
|
587e523990 | ||
|
|
5ec1a1c54c | ||
|
|
2c65ccc8da | ||
|
|
787308aad4 | ||
|
|
8b44e4475b | ||
|
|
d251987850 | ||
|
|
e7127ae624 | ||
|
|
842ad77092 | ||
|
|
96104fd93a | ||
|
|
c34a74c040 | ||
|
|
ba92eea7eb | ||
|
|
ff33ea943d | ||
|
|
43b849e787 | ||
|
|
a4f8154662 | ||
|
|
33d3983a97 | ||
|
|
50951dfdcf | ||
|
|
a9f84eda42 | ||
|
|
be7527e994 | ||
|
|
3f3e94bdc9 | ||
|
|
72e7b215ef | ||
|
|
d5c1721ab1 | ||
|
|
8eb27b194f | ||
|
|
9bd3e7b1bc | ||
|
|
45595ab1fd | ||
|
|
3f056babac | ||
|
|
faad2c4a9a | ||
|
|
1a81f4a541 | ||
|
|
326e8c651c | ||
|
|
dfaaabfc2a | ||
|
|
f07f37ec35 | ||
|
|
1357ed5d3d | ||
|
|
579a55a00d | ||
|
|
0a00caa1e4 | ||
|
|
224cef7fad | ||
|
|
c53040ed5c | ||
|
|
f7465047cb | ||
|
|
0dadaece08 | ||
|
|
dafff1620d | ||
|
|
fc89a25d3a | ||
|
|
aaf8dd16ef | ||
|
|
fba5953b59 | ||
|
|
7ea80395a8 | ||
|
|
2d7458eefe | ||
|
|
9a45efd558 | ||
|
|
205b217854 | ||
|
|
e5ec9177e3 | ||
|
|
19c4cd70b8 | ||
|
|
75c341d983 | ||
|
|
f73f36ea6f | ||
|
|
6faf1cbcc2 | ||
|
|
87bd3975b8 | ||
|
|
5dc34ac0d0 | ||
|
|
09f18d9039 | ||
|
|
2ffaf36270 | ||
|
|
ec8b9a4c0a | ||
|
|
69fd223358 | ||
|
|
9c43374267 | ||
|
|
80e17e264a | ||
|
|
ea7c0cccde | ||
|
|
6dfe292776 | ||
|
|
c90f7a31bb | ||
|
|
c8c7d1566c | ||
|
|
073160dde4 | ||
|
|
56fe8c9d09 | ||
|
|
9a3532265f | ||
|
|
4ecf1845d4 | ||
|
|
9d4218bf38 | ||
|
|
67f30c7765 | ||
|
|
1bf2b707ef | ||
|
|
07d04d5701 | ||
|
|
3c373aac25 | ||
|
|
4e2254dfc7 | ||
|
|
a765de11ef | ||
|
|
fe65dc60c4 | ||
|
|
e976c825c9 | ||
|
|
88b5a0af46 | ||
|
|
a53551b462 | ||
|
|
f15349029f | ||
|
|
989ce6d707 | ||
|
|
018169b06a | ||
|
|
7275d6e897 | ||
|
|
0416a2ce7d | ||
|
|
dde95c8e01 | ||
|
|
349a0641cd | ||
|
|
304870f18c | ||
|
|
71e3cdb78d | ||
|
|
7260a0a00e | ||
|
|
5cfa398ea6 | ||
|
|
05375955d6 | ||
|
|
5fff45e302 | ||
|
|
a0ea54d0c0 | ||
|
|
de627171d5 | ||
|
|
e32691994c | ||
|
|
6f3c0fb174 | ||
|
|
76130bbf2c | ||
|
|
90bce8d3d5 | ||
|
|
364b506220 | ||
|
|
1b4297a9bf | ||
|
|
1bbea69139 | ||
|
|
916dab2584 | ||
|
|
67d53126c3 | ||
|
|
d639ec5e70 | ||
|
|
c6b1d518cf | ||
|
|
708ffac47e | ||
|
|
aff83fae49 | ||
|
|
90d8f5f2cc | ||
|
|
4e3ddad8c1 | ||
|
|
c2cb3f5b7a | ||
|
|
778bed969d | ||
|
|
cff5fa6d7b | ||
|
|
c24b6e6b32 | ||
|
|
e7b4a512ca | ||
|
|
cabda4cc35 | ||
|
|
a5d4629f07 | ||
|
|
16166db31a | ||
|
|
37d9ef66ed | ||
|
|
b2213bff62 | ||
|
|
411d2192cb | ||
|
|
391bf296d7 | ||
|
|
ab854067eb | ||
|
|
9e9990dd6e | ||
|
|
b80805e09c | ||
|
|
d22ed099bb | ||
|
|
84c99d23cd | ||
|
|
36a302f20f | ||
|
|
9a592047a0 | ||
|
|
e6947a3246 | ||
|
|
5cd0897348 | ||
|
|
a973a50576 | ||
|
|
7121b46bf9 | ||
|
|
00f07ba6f0 | ||
|
|
4c1d3ceedf | ||
|
|
f674546df8 | ||
|
|
7910cf3055 | ||
|
|
ab1c8e63ee | ||
|
|
67bbe9c105 | ||
|
|
4d01b60808 | ||
|
|
46f8d0d07d | ||
|
|
b2af8587c2 | ||
|
|
409c0d7fb4 | ||
|
|
9274743df3 | ||
|
|
97be497fda | ||
|
|
e1e228eae2 | ||
|
|
1ece31fa7a | ||
|
|
b27d2a6b62 | ||
|
|
475b6210e0 | ||
|
|
42fc89a944 | ||
|
|
9a951c499b | ||
|
|
86b06db9ff | ||
|
|
4e67d7b765 | ||
|
|
e4c52701b7 | ||
|
|
3c9f46941c | ||
|
|
b59c962f60 | ||
|
|
0d5c898106 | ||
|
|
c9c92f82d3 | ||
|
|
d57985b90a | ||
|
|
56fcb23275 | ||
|
|
dba199b531 | ||
|
|
193dd166c3 | ||
|
|
0a46bf52dd | ||
|
|
431e0bb341 | ||
|
|
beb54c1bc5 | ||
|
|
1afc4c9a29 | ||
|
|
96b4210d21 | ||
|
|
85fcecdcf6 | ||
|
|
55dc2b26d2 | ||
|
|
9c7a85826b | ||
|
|
4e6a2d5218 | ||
|
|
273f00a9c4 | ||
|
|
e876b9e4ab | ||
|
|
32de4aac6b | ||
|
|
d40040efd8 | ||
|
|
66e400013a | ||
|
|
3f95bfd82f | ||
|
|
fc4b191dea | ||
|
|
cad23ef1ad | ||
|
|
0e10702fad | ||
|
|
0012e23bf6 | ||
|
|
2801b9baf2 | ||
|
|
5dd07525dc | ||
|
|
d7cb61e5fc | ||
|
|
38447e2217 | ||
|
|
9629345473 | ||
|
|
4d72b0047a | ||
|
|
db7f46a874 | ||
|
|
a06d7bbfec | ||
|
|
d1adc160ca | ||
|
|
a70ef78ead | ||
|
|
5e509f7f19 | ||
|
|
3f257af006 | ||
|
|
7fac6062e5 | ||
|
|
7ba74143df | ||
|
|
d018ab18f8 | ||
|
|
dc22ac6b06 | ||
|
|
0411befe8d | ||
|
|
8bf18b0d37 | ||
|
|
7e141f73d3 | ||
|
|
7f9dcc43ad | ||
|
|
274262262a | ||
|
|
79c0f31ddc | ||
|
|
49d61342c2 | ||
|
|
be0943f1ba | ||
|
|
95e63f865c | ||
|
|
164c11e10a | ||
|
|
f4cc311806 | ||
|
|
df46b8ebdd | ||
|
|
765884b0dc | ||
|
|
fe8cf9bc83 | ||
|
|
f45782aeef | ||
|
|
c2faff5a03 | ||
|
|
1cff18112b | ||
|
|
195b99e588 | ||
|
|
6019489ef1 | ||
|
|
fc79f92796 | ||
|
|
8e569a9ccd | ||
|
|
d7b2964e4e | ||
|
|
b0f90cafb6 | ||
|
|
870c36e76b | ||
|
|
d56d1bc2bd | ||
|
|
45eca862ac | ||
|
|
9f738f4871 | ||
|
|
3533a3fd4b | ||
|
|
672acfe8fe | ||
|
|
6a4db90897 | ||
|
|
82587a70be | ||
|
|
d0ef9ca96c | ||
|
|
a5d5d42ba3 | ||
|
|
15441a46f7 | ||
|
|
a9a56bb1e9 | ||
|
|
e840be84eb | ||
|
|
0b40455e3c | ||
|
|
d9ea5a95af | ||
|
|
23502d4fab | ||
|
|
3690babf62 | ||
|
|
9ca7ff73f4 | ||
|
|
c56064d189 | ||
|
|
424495c636 | ||
|
|
9c7e98f1cb | ||
|
|
23edcf3aa7 | ||
|
|
ca19306b72 | ||
|
|
66c0c14748 | ||
|
|
cffa493984 | ||
|
|
9030cdcc76 | ||
|
|
c3ef487a6f | ||
|
|
ac0eddf4c7 | ||
|
|
e373e797f4 | ||
|
|
382244035b | ||
|
|
b9c8c71274 | ||
|
|
96b2d88d39 | ||
|
|
474fc1fc57 | ||
|
|
3825e2fb38 | ||
|
|
e86e7f0bd8 | ||
|
|
c36f259571 | ||
|
|
501bae585a | ||
|
|
2c72f704d0 | ||
|
|
194de7b4e7 | ||
|
|
c03609142b | ||
|
|
5374f71732 | ||
|
|
c53d451000 | ||
|
|
f6747713a1 | ||
|
|
59ddf175ed | ||
|
|
ccd8d5f871 | ||
|
|
bd47ad2b8c | ||
|
|
e90019cdd8 | ||
|
|
be508c99ea | ||
|
|
71a77fc576 | ||
|
|
a028297da6 | ||
|
|
ac44b36b59 | ||
|
|
4c0635be7c | ||
|
|
67b863f9db | ||
|
|
7628ebc9ca | ||
|
|
deb6dad7ad | ||
|
|
077f052112 | ||
|
|
e7f57c9ddd | ||
|
|
095e2bf581 | ||
|
|
25345a0522 | ||
|
|
e2b5201b5a | ||
|
|
5c80a382bf | ||
|
|
aa940683d6 | ||
|
|
843c65d52b | ||
|
|
e26f4262df | ||
|
|
dde586e004 | ||
|
|
506c23ae89 | ||
|
|
e90e03e0cc | ||
|
|
335671b46a | ||
|
|
19b8c16057 | ||
|
|
dea3aac222 | ||
|
|
5d7281e470 | ||
|
|
a7d925a177 | ||
|
|
4ef4a06a7e | ||
|
|
29515491a2 | ||
|
|
6cb8d0a9d1 | ||
|
|
2c4574d93b | ||
|
|
2fde630971 | ||
|
|
fce5ee7a16 | ||
|
|
8ccb9cd892 | ||
|
|
d1af44bcdc | ||
|
|
5a6d20f817 | ||
|
|
ce5da22180 | ||
|
|
05b2c3c42b | ||
|
|
2dd732b924 | ||
|
|
110f73e622 | ||
|
|
bb0d118284 | ||
|
|
701ccadff3 | ||
|
|
34555504df | ||
|
|
d1f5220925 | ||
|
|
decd514b22 | ||
|
|
6cf7093293 | ||
|
|
17f11fa871 | ||
|
|
96812868a4 | ||
|
|
40c79158f7 | ||
|
|
054663ee00 | ||
|
|
81eee814e9 | ||
|
|
390a3c0d5a | ||
|
|
695dd655c0 | ||
|
|
c34ffedb42 | ||
|
|
b5382b1bdf | ||
|
|
519cbc7601 | ||
|
|
957da460a6 | ||
|
|
c664c14afc | ||
|
|
8f9f447acf | ||
|
|
2cee36d7b5 | ||
|
|
43925e3088 | ||
|
|
1c236cce02 | ||
|
|
4956a517ca | ||
|
|
d9c7df736c | ||
|
|
73244df019 | ||
|
|
91d24ebae8 | ||
|
|
6861e26ed6 | ||
|
|
34242e12ea | ||
|
|
efc67d14a5 | ||
|
|
bd67e41aa6 | ||
|
|
601c6c53e7 | ||
|
|
b7ba740a3a | ||
|
|
a6167583a3 | ||
|
|
9183c4f04c | ||
|
|
1e68eb0b90 | ||
|
|
332efd4106 | ||
|
|
f303191c54 | ||
|
|
d6c7f16ceb | ||
|
|
f1912fe739 | ||
|
|
2f7fe05d21 | ||
|
|
ee4b61f549 | ||
|
|
511a4256bc | ||
|
|
3c9db86df2 | ||
|
|
367204a1ee | ||
|
|
bbe55a75ea | ||
|
|
e58bf3a8cf | ||
|
|
1f2f866c61 | ||
|
|
6ccbc95697 | ||
|
|
52d9e0a195 | ||
|
|
6a3982347b | ||
|
|
fe7feeb74e | ||
|
|
6495f741b9 | ||
|
|
b2419beca6 | ||
|
|
b752b475d9 | ||
|
|
658fe79ad7 | ||
|
|
5bbf05ac8a | ||
|
|
d3210f0d3d | ||
|
|
a0dce925d4 |
@@ -23,6 +23,15 @@ Events::on('loadRenderers', function ($renderers) {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Events::on('loadRenderers', function ($renderers) {
|
||||||
|
$fhc_core_renderers =& $renderers();
|
||||||
|
$fhc_core_renderers["slot_room"] = array(
|
||||||
|
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Slot/roomModalTitle.js',
|
||||||
|
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Slot/roomModalContent.js',
|
||||||
|
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
Events::on('loadRenderers', function ($renderers) {
|
Events::on('loadRenderers', function ($renderers) {
|
||||||
$fhc_core_renderers =& $renderers();
|
$fhc_core_renderers =& $renderers();
|
||||||
$fhc_core_renderers["ferien"] = array(
|
$fhc_core_renderers["ferien"] = array(
|
||||||
|
|||||||
@@ -3,3 +3,4 @@
|
|||||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
$config['infocenter_studiengang_kz'] = '10021, 10027, 10002';
|
$config['infocenter_studiengang_kz'] = '10021, 10027, 10002';
|
||||||
|
$config['infocenter_qualifikationskurs_kz'] = '10002';
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
// Noten die keinen Prüfungsantritt verbrauchen. Fallback-PKs; massgeblich sind die per Bezeichnung
|
||||||
|
// aufgelösten Noten (NOTEN_OHNE_ANTRITT_BEZEICHNUNGEN), da die PKs je Installation abweichen.
|
||||||
|
$config['NOTEN_OHNE_ANTRITT'] = [9, 17]; // tbl_note pk
|
||||||
|
|
||||||
|
// 'Nicht beurteilt' ist eine Altlast: formal eine Note, inhaltlich keine Leistungsfeststellung.
|
||||||
|
// Wird weiterhin häufig vergeben und darf daher keinen Antritt kosten.
|
||||||
|
$config['NOTEN_OHNE_ANTRITT_BEZEICHNUNGEN'] = ['Noch nicht eingetragen', 'entschuldigt', 'Nicht beurteilt'];
|
||||||
|
|
||||||
|
// Anrechnungsnoten: die Leistung wurde vorab anerkannt, der/die Studierende ist zwar Teil der
|
||||||
|
// Lehrveranstaltung, tritt aber zu keiner Prüfung an. Solange die ZEUGNISNOTE eine davon ist, sind
|
||||||
|
// für diese Lehrveranstaltung keine Prüfungen möglich. Auflösung wie oben über die Bezeichnung,
|
||||||
|
// die PKs sind nur Fallback.
|
||||||
|
$config['NOTEN_ANRECHNUNG_BEZEICHNUNGEN'] = ['angerechnet', 'intern angerechnet'];
|
||||||
|
$config['NOTEN_ANRECHNUNG'] = [6, 16]; // tbl_note pk
|
||||||
|
|
||||||
|
$config['NOTEN_OCCURANCE_LIMIT_MAP'] = [17 => 1]; // über alle Antritte hinweg nur ein entschuldigt
|
||||||
|
|
||||||
|
// tbl_note pk of the 'entschuldigt' note. An entschuldigt Termin is preserved as its own dated
|
||||||
|
// entry when a new pruefung of the same type is created (instead of being overwritten).
|
||||||
|
$config['NOTE_ENTSCHULDIGT'] = 17;
|
||||||
|
|
||||||
|
// The maximum number of attempts that count, the first attempt and the kommissionelle attempt
|
||||||
|
// included. null derives the number from the old flags:
|
||||||
|
// 1 (the original assessment) + TERMIN2 + TERMIN3 + KOMMPRUEF
|
||||||
|
// The examination rules permit three attempts. With TERMIN2 and KOMMPRUEF the formula gives 3.
|
||||||
|
// An installation with TERMIN3 gets 4, which is one more attempt in the same chain.
|
||||||
|
$config['CIS_GESAMTNOTE_MAX_ANTRITTE'] = null;
|
||||||
|
|
||||||
|
// The exam types that take place before a commission.
|
||||||
|
$config['PRUEFUNG_KOMMISSIONELL_TYPEN'] = ['kommPruef', 'zusKommPruef'];
|
||||||
|
|
||||||
|
// The type that the tool writes for the last attempt. The last attempt is always kommissionell.
|
||||||
|
$config['PRUEFUNG_TYP_KOMMISSIONELL'] = 'kommPruef';
|
||||||
|
|
||||||
|
// Exam types that never use an attempt. A zusKommPruef repeats a kommissionelle Prüfung that had
|
||||||
|
// a procedural fault. It stands outside the attempt chain, and the student administration enters
|
||||||
|
// it. The examination rules do not describe it.
|
||||||
|
$config['PRUEFUNG_TYPEN_OHNE_ANTRITT'] = ['zusKommPruef'];
|
||||||
|
|
||||||
|
// Spaltenaufteilung der Prüfungen in der Notentabelle:
|
||||||
|
// 'antritt' - eine Spalte je Antrittsnummer, Datum steht in der Zelle (robust bei Einzelterminen)
|
||||||
|
// 'datum' - eine Spalte je Prüfungsdatum (kompakt, wenn ganze Jahrgänge am selben Tag antreten)
|
||||||
|
// Nur die Vorgabe; im Tool umschaltbar und pro Benutzer gespeichert.
|
||||||
|
$config['CIS_GESAMTNOTE_PRUEFUNGSSPALTEN'] = 'antritt';
|
||||||
|
|
||||||
|
// Bei der Notenübernahme durch die Assistenz den ersten Antritt als eigene Prüfung anlegen.
|
||||||
|
$config['CIS_GESAMTNOTE_ERSTANTRITT_BEI_UEBERNAHME'] = true;
|
||||||
|
|
||||||
|
// availability of the two Benotungstool import flows. When both are true they are shown as
|
||||||
|
// separate buttons/dialogs.
|
||||||
|
$config['CIS_GESAMTNOTE_PRUEFUNGSIMPORT'] = true; // dated import that creates a pruefung per row
|
||||||
|
$config['CIS_GESAMTNOTE_NOTENIMPORT'] = false; // classic note-only import (uid + note, no date)
|
||||||
|
|
||||||
|
// Noteneintragungsfrist (Prüfungsordnung §1): grade/pruefung entry is only permitted up to this
|
||||||
|
// deadline. The month/day below is applied to the studiensemester's year:
|
||||||
|
// Sommersemester (SSyyyy) -> deadline in the SAME calendar year (default 15th November)
|
||||||
|
// Wintersemester (WSyyyy) -> deadline in the FOLLOWING calendar year (default 15th May)
|
||||||
|
$config['CIS_GESAMTNOTE_NOTENEINTRAGUNGSFRIST'] = false; // switch to use the window enforcement
|
||||||
|
$config['NOTENEINTRAGUNGSFRIST_SS'] = ['month' => 11, 'day' => 15]; // Sommersemester deadline (same year)
|
||||||
|
$config['NOTENEINTRAGUNGSFRIST_WS'] = ['month' => 5, 'day' => 15]; // Wintersemester deadline (following year)
|
||||||
@@ -61,12 +61,29 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa
|
|||||||
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$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';
|
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
|
||||||
|
|
||||||
|
// Legacy CMS news routes
|
||||||
|
$route['api/frontend/v1/Cms/getNewsItem/(:num)'] = 'api/frontend/v1/NewsAdministrationAPI/getNewsItem/$1';
|
||||||
|
$route['api/frontend/v1/Cms/storeNewsItem'] = 'api/frontend/v1/NewsAdministrationAPI/storeNewsItem';
|
||||||
|
$route['api/frontend/v1/Cms/updateNewsItem/(:num)'] = 'api/frontend/v1/NewsAdministrationAPI/updateNewsItem/$1';
|
||||||
|
$route['api/frontend/v1/Cms/deleteNewsItem/(:num)'] = 'api/frontend/v1/NewsAdministrationAPI/deleteNewsItem/$1';
|
||||||
|
|
||||||
|
// Keep legacy uppercase URLs refreshable while using the canonical controller method casing
|
||||||
|
$route['CisVue/Cms/NewsAdministration'] = 'CisVue/Cms/newsAdministration';
|
||||||
|
|
||||||
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
|
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
|
||||||
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
||||||
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
|
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
|
||||||
$route['Cis/OtherLvPlan/.*'] = 'Cis/OtherLvPlan/index/$1';
|
$route['Cis/OtherLvPlan/.*'] = 'Cis/OtherLvPlan/index/$1';
|
||||||
//Route for LV Plan Stg/Semester/Verband/Gruppe
|
//Route for LV Plan Stg/Semester/Verband/Gruppe
|
||||||
$route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1';
|
$route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1';
|
||||||
|
$route['Cis/Benotungstool/.*'] = 'Cis/Benotungstool/index/$1';
|
||||||
|
|
||||||
|
$route['Cis/MyReservation'] = 'Cis/MyReservation/index/$1';
|
||||||
|
|
||||||
|
//Route for Zeitsperrenma
|
||||||
|
$route['Cis/Zeitsperrenma/.*'] = 'Cis/Zeitsperrenma/index/$1';
|
||||||
|
//Route für Zeitsperren
|
||||||
|
$route['Cis/Zeitsperren/.*'] = 'Cis/Zeitsperren/index/$1';
|
||||||
|
|
||||||
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
|
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
|
||||||
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
|
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
|
||||||
@@ -129,13 +146,19 @@ $route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/in
|
|||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3/$4';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3/$4';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3';
|
||||||
|
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
||||||
|
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/le/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByLe/$1/$2';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/lv/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByLv/$1/$2';
|
||||||
|
|
||||||
|
|
||||||
// load routes from extensions, also look for environment-specific configs
|
// load routes from extensions, also look for environment-specific configs
|
||||||
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
|
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ $config['root'] = [
|
|||||||
'verband' => [
|
'verband' => [
|
||||||
'group'
|
'group'
|
||||||
]
|
]
|
||||||
],
|
]
|
||||||
'orgform'
|
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$config['root']['stg']['orgform'] = $config['root']['stg'];
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Benotungstool extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'index' => array('lehre/benotungstool:rw', 'lehre/benotungstool_assistenz:rw')
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Benotungstool']);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!defined('BASEPATH'))
|
||||||
|
exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Compat extends Auth_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'ci' => ['basis/cis:r'],
|
||||||
|
'legacy' => ['basis/cis:r'],
|
||||||
|
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function ci()
|
||||||
|
{
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php',['route' => 'Compat']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function legacy()
|
||||||
|
{
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php',['route' => 'Compat']);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class MyReservation extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'index' => ['basis/cis:r']
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Load Config
|
||||||
|
$this->load->config('calendar');
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyReservation']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class ProjektabgabeUebersicht extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'index' => ['basis/cis:r']
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'ProjektabgabeUebersicht']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Zeitsperren extends Auth_Controller
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'index' => ['basis/cis:r'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Load Libraries
|
||||||
|
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index loads the view Zeitsperren
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'zeitsperren']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Zeitsperrenma extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'index' => ['basis/cis:r']
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Zeitsperrenma']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,14 +17,15 @@ class Cms extends Auth_Controller
|
|||||||
array(
|
array(
|
||||||
'content' => 'basis/cis:r',
|
'content' => 'basis/cis:r',
|
||||||
'getNews' => 'basis/cis:r',
|
'getNews' => 'basis/cis:r',
|
||||||
'getNewsRowCount' => 'basis/cis:r',
|
|
||||||
'getRoomInformation' => 'basis/cis:r',
|
'getRoomInformation' => 'basis/cis:r',
|
||||||
'news' => 'basis/cis:r'
|
'news' => 'basis/cis:r',
|
||||||
|
'newsAdministration' => ['basis/news:r'],
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Loads Libraries
|
// Loads Libraries
|
||||||
$this->load->library('CmsLib');
|
$this->load->library('CmsLib');
|
||||||
|
$this->load->library('PermissionLib');
|
||||||
|
|
||||||
// Loads phrases system
|
// Loads phrases system
|
||||||
$this->loadPhrases([
|
$this->loadPhrases([
|
||||||
@@ -83,10 +84,18 @@ class Cms extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
|
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
|
||||||
{
|
{
|
||||||
$viewData = array();
|
$this->load->view('CisRouterView/CisRouterView.php', [
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']);
|
'route' => 'News',
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function newsAdministration()
|
||||||
|
{
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', [
|
||||||
|
'route' => 'NewsAdministration',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoomInformation($ort_kurzbz)
|
public function getRoomInformation($ort_kurzbz)
|
||||||
{
|
{
|
||||||
// Load Config
|
// Load Config
|
||||||
|
|||||||
@@ -1916,7 +1916,7 @@ class Abgabe extends FHCAPI_Controller
|
|||||||
|
|
||||||
if (!$mailres)
|
if (!$mailres)
|
||||||
{
|
{
|
||||||
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
|
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2026 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');
|
||||||
|
|
||||||
|
class Benutzer extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getUserData' => self::PERM_LOGGED,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
public function getUserData()
|
||||||
|
{
|
||||||
|
$uid = $this->input->get("uid") ?? getAuthUID();
|
||||||
|
$this->BenutzerModel->addSelect("uid, person_id, insertamum");
|
||||||
|
$userResult = $this->BenutzerModel->load(["uid" => $uid]);
|
||||||
|
$userData = $this->getDataOrTerminateWithError($userResult);
|
||||||
|
$this->terminateWithSuccess($userData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -67,8 +67,11 @@ class CisMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
private function generateUrlForMenuItem($menuItem)
|
private function generateUrlForMenuItem($menuItem)
|
||||||
{
|
{
|
||||||
$menuItem->url = $this->menuItemUrlHelper($menuItem);
|
if(!isset($menuItem->url))
|
||||||
unset($menuItem->content);
|
{
|
||||||
|
$menuItem->url = $this->menuItemUrlHelper($menuItem);
|
||||||
|
unset($menuItem->content);
|
||||||
|
}
|
||||||
|
|
||||||
if ($menuItem->childs && count($menuItem->childs)) {
|
if ($menuItem->childs && count($menuItem->childs)) {
|
||||||
$menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs);
|
$menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs);
|
||||||
@@ -83,7 +86,7 @@ class CisMenu extends FHCAPI_Controller
|
|||||||
return site_url("/CisVue/Cms/content/" . $menuItem->content_id);
|
return site_url("/CisVue/Cms/content/" . $menuItem->content_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$menuItem->content || !mb_strlen($menuItem->content)) {
|
if (!isset($menuItem->content) || !$menuItem->content || !mb_strlen($menuItem->content)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +94,8 @@ class CisMenu extends FHCAPI_Controller
|
|||||||
$doc->loadXML($menuItem->content);
|
$doc->loadXML($menuItem->content);
|
||||||
$urlElem = $doc->getElementsByTagName('url')->item(0);
|
$urlElem = $doc->getElementsByTagName('url')->item(0);
|
||||||
|
|
||||||
|
$this->menuItemUrlTargetHelper($menuItem, $doc);
|
||||||
|
|
||||||
if (!$urlElem) {
|
if (!$urlElem) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@@ -122,5 +127,18 @@ class CisMenu extends FHCAPI_Controller
|
|||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function menuItemUrlTargetHelper($menuItem, $xmldoc)
|
||||||
|
{
|
||||||
|
if($menuItem->template_kurzbz === 'redirect')
|
||||||
|
{
|
||||||
|
$targetElem = $xmldoc->getElementsByTagName('target')->item(0);
|
||||||
|
$target = ($targetElem) ? $targetElem->textContent : '';
|
||||||
|
if(!in_array($target, array('_self', '_top', '_blank')))
|
||||||
|
{
|
||||||
|
$target = '_self';
|
||||||
|
}
|
||||||
|
$menuItem->target = $target;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,14 +36,15 @@ class Cms extends FHCAPI_Controller
|
|||||||
'ContentID' => self::PERM_LOGGED,
|
'ContentID' => self::PERM_LOGGED,
|
||||||
'getOrtKurzbzContent' => self::PERM_LOGGED,
|
'getOrtKurzbzContent' => self::PERM_LOGGED,
|
||||||
'content' => self::PERM_LOGGED,
|
'content' => self::PERM_LOGGED,
|
||||||
'news' => self::PERM_LOGGED,
|
'newsForWidget' => self::PERM_LOGGED,
|
||||||
'getNewsRowCount' => self::PERM_LOGGED,
|
|
||||||
'getNews' => self::PERM_LOGGED,
|
'getNews' => self::PERM_LOGGED,
|
||||||
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->model('content/News_model', 'NewsModel');
|
$this->load->model('content/News_model', 'NewsModel');
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||||
|
|
||||||
// setting up the papgination_size
|
// setting up the papgination_size
|
||||||
$this->page_size = 10;
|
$this->page_size = 10;
|
||||||
|
|
||||||
@@ -59,7 +60,6 @@ class Cms extends FHCAPI_Controller
|
|||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Private methods
|
// Private methods
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ class Cms extends FHCAPI_Controller
|
|||||||
$this->terminateWithSuccess($content_id);
|
$this->terminateWithSuccess($content_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function news()
|
public function newsForWidget()
|
||||||
{
|
{
|
||||||
|
|
||||||
// form validation
|
// form validation
|
||||||
@@ -118,7 +118,7 @@ class Cms extends FHCAPI_Controller
|
|||||||
$this->load->model('content/news_model', 'NewsModel');
|
$this->load->model('content/news_model', 'NewsModel');
|
||||||
|
|
||||||
$limit = $this->input->get('limit',TRUE);
|
$limit = $this->input->get('limit',TRUE);
|
||||||
|
|
||||||
//query the news
|
//query the news
|
||||||
$news = $this->NewsModel->getAll($limit);
|
$news = $this->NewsModel->getAll($limit);
|
||||||
|
|
||||||
@@ -157,23 +157,7 @@ class Cms extends FHCAPI_Controller
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
|
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = false, $titel = '', $edit = false, $sichtbar = true)
|
||||||
{
|
|
||||||
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
|
|
||||||
$all = $edit;
|
|
||||||
|
|
||||||
$this->load->model('content/News_model','NewsModel');
|
|
||||||
|
|
||||||
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen);
|
|
||||||
|
|
||||||
$num_rows = $this->getDataOrTerminateWithError($num_rows);
|
|
||||||
|
|
||||||
$this->terminateWithSuccess($num_rows);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
|
|
||||||
{
|
{
|
||||||
//form validation
|
//form validation
|
||||||
$this->load->library('form_validation');
|
$this->load->library('form_validation');
|
||||||
@@ -193,15 +177,45 @@ class Cms extends FHCAPI_Controller
|
|||||||
|
|
||||||
// default value for the page_size is 10
|
// default value for the page_size is 10
|
||||||
$page_size = $page_size ?? 10;
|
$page_size = $page_size ?? 10;
|
||||||
|
|
||||||
|
$passedSichtbar = $this->input->get('published', true);
|
||||||
|
if($passedSichtbar !== null)
|
||||||
|
{
|
||||||
|
$sichtbar = $passedSichtbar;
|
||||||
|
}
|
||||||
|
|
||||||
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache);
|
$filterForDegreePrograms = false;
|
||||||
|
$entitledDegreePrograms = [];
|
||||||
|
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
|
||||||
|
if(isError($student))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($student));
|
||||||
|
}
|
||||||
|
if(hasData($student))
|
||||||
|
{
|
||||||
|
$student = current(getData($student));
|
||||||
|
|
||||||
|
$degreeProgramSemesterDataResult = $this->PrestudentModel->getStudiengaengAndAusbildungssemesterByStudentUid(getAuthUID());
|
||||||
|
$degreeProgramSemesterData = $this->getDataOrTerminateWithError($degreeProgramSemesterDataResult)[0];
|
||||||
|
if ($degreeProgramSemesterData) {
|
||||||
|
$studiengang_kz = isset($degreeProgramSemesterData->studiengang_kz) ? $degreeProgramSemesterData->studiengang_kz : null;
|
||||||
|
$semester = isset($degreeProgramSemesterData->ausbildungssemester) ? $degreeProgramSemesterData->ausbildungssemester : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$mischen = true;
|
||||||
|
} else {
|
||||||
|
$filterForDegreePrograms = true;
|
||||||
|
$entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news");
|
||||||
|
array_push($entitledDegreePrograms, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache, $filterForDegreePrograms, $entitledDegreePrograms, true);
|
||||||
$news = $this->getDataOrTerminateWithError($news);
|
$news = $this->getDataOrTerminateWithError($news);
|
||||||
|
|
||||||
$this->addMeta('phrases', json_decode($this->p->getJson()));
|
$this->addMeta('row_count', $news["row_count"] ?? 0);
|
||||||
$this->terminateWithSuccess($news);
|
$this->terminateWithSuccess($news["content"]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,18 +18,9 @@
|
|||||||
|
|
||||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
//require_once('../../../include/studiengang.class.php');
|
|
||||||
//require_once('../../../include/student.class.php');
|
|
||||||
//require_once('../../../include/datum.class.php');
|
|
||||||
//require_once('../../../include/mail.class.php');
|
|
||||||
//require_once('../../../include/benutzerberechtigung.class.php');
|
|
||||||
//require_once('../../../include/phrasen.class.php');
|
|
||||||
//require_once('../../../include/projektarbeit.class.php');
|
|
||||||
//require_once('../../../include/projektbetreuer.class.php');
|
|
||||||
|
|
||||||
class Lehre extends FHCAPI_Controller
|
class Lehre extends FHCAPI_Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Object initialization
|
* Object initialization
|
||||||
*/
|
*/
|
||||||
@@ -40,38 +31,56 @@ class Lehre extends FHCAPI_Controller
|
|||||||
'LV' => self::PERM_LOGGED,
|
'LV' => self::PERM_LOGGED,
|
||||||
'Pruefungen' => self::PERM_LOGGED,
|
'Pruefungen' => self::PERM_LOGGED,
|
||||||
'semesterAverageGrade' => self::PERM_LOGGED,
|
'semesterAverageGrade' => self::PERM_LOGGED,
|
||||||
|
'getZugewieseneLv' => self::PERM_LOGGED,
|
||||||
|
'getLeForLv' => self::PERM_LOGGED
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$this->load->library('PhrasesLib');
|
||||||
|
|
||||||
|
$this->loadPhrases(
|
||||||
|
array(
|
||||||
|
'global',
|
||||||
|
'ui',
|
||||||
|
'abgabetool'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->helper('hlp_sancho_helper');
|
||||||
|
|
||||||
|
require_once(FHCPATH . 'include/studiengang.class.php');
|
||||||
|
require_once(FHCPATH . 'include/student.class.php');
|
||||||
|
require_once(FHCPATH . 'include/projektarbeit.class.php');
|
||||||
|
require_once(FHCPATH . 'include/projektbetreuer.class.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constructs the emails of the groups from a lehrveranstaltung
|
* constructs the emails of the groups from a lehrveranstaltung
|
||||||
*/
|
*/
|
||||||
public function lvStudentenMail()
|
public function lvStudentenMail()
|
||||||
{
|
{
|
||||||
$lehreinheit_id = $this->input->get("lehreinheit_id",TRUE);
|
$lehreinheit_id = $this->input->get("lehreinheit_id",TRUE);
|
||||||
|
|
||||||
// return early if the required parameter is missing
|
|
||||||
if(!isset($lehreinheit_id))
|
|
||||||
{
|
|
||||||
$this->terminateWithError('Missing required parameter', self::ERROR_TYPE_GENERAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
// return early if the required parameter is missing
|
||||||
|
if(!isset($lehreinheit_id))
|
||||||
$studentenMails = $this->LehreinheitModel->getStudentenMail($lehreinheit_id);
|
{
|
||||||
|
$this->terminateWithError('Missing required parameter', self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
$studentenMails = $this->getDataOrTerminateWithError($studentenMails);
|
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||||
|
|
||||||
|
$studentenMails = $this->LehreinheitModel->getStudentenMail($lehreinheit_id);
|
||||||
|
|
||||||
|
$studentenMails = $this->getDataOrTerminateWithError($studentenMails);
|
||||||
|
|
||||||
//convert array of objects into array of strings
|
//convert array of objects into array of strings
|
||||||
$studentenMails = array_map(function($element){
|
$studentenMails = array_map(function($element){
|
||||||
return $element->mail;
|
return $element->mail;
|
||||||
}, $studentenMails);
|
}, $studentenMails);
|
||||||
|
|
||||||
$this->terminateWithSuccess($studentenMails);
|
$this->terminateWithSuccess($studentenMails);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function LV($studiensemester_kurzbz, $lehrveranstaltung_id)
|
public function LV($studiensemester_kurzbz, $lehrveranstaltung_id)
|
||||||
@@ -81,13 +90,13 @@ class Lehre extends FHCAPI_Controller
|
|||||||
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage(), $lehrveranstaltung_id);
|
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage(), $lehrveranstaltung_id);
|
||||||
|
|
||||||
$result = current($this->getDataOrTerminateWithError($result));
|
$result = current($this->getDataOrTerminateWithError($result));
|
||||||
|
|
||||||
$this->terminateWithSuccess($result);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetches all Pruefungen of a student for a specific lehrveranstaltung
|
* fetches all Pruefungen of a student for a specific lehrveranstaltung
|
||||||
* if the student passed the Pruefung on the first attempt, no information about the Pruefungen is stored in the database
|
* if the student passed the Pruefung on the first attempt, no information about the Pruefungen is stored in the database
|
||||||
* @param mixed $lehrveranstaltung_id
|
* @param mixed $lehrveranstaltung_id
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -145,5 +154,46 @@ class Lehre extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess(['average_grade' => $averageGrade, 'weighted_average_grade' => $weightedAverageGrade]);
|
$this->terminateWithSuccess(['average_grade' => $averageGrade, 'weighted_average_grade' => $weightedAverageGrade]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetches all assigned lehrveranstaltungen of a mitarbeiter for a given semester
|
||||||
|
* @param mixed $uid
|
||||||
|
* @param mixed $sem_kurzbz
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function getZugewieseneLv() {
|
||||||
|
$uid = $this->input->get("uid",TRUE);
|
||||||
|
$sem_kurzbz = $this->input->get("sem_kurzbz",TRUE);
|
||||||
|
|
||||||
|
// TODO: error messages
|
||||||
|
|
||||||
|
if(!isset($sem_kurzbz) || isEmptyString($sem_kurzbz))
|
||||||
|
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||||
|
|
||||||
|
if (!isset($uid) || isEmptyString($uid))
|
||||||
|
$uid = getAuthUID();
|
||||||
|
|
||||||
|
// querying other ma_uids data requires admin permission
|
||||||
|
if($uid !== getAuthUID()) {
|
||||||
|
$this->load->library('PermissionLib');
|
||||||
|
$isAdmin = $this->permissionlib->isBerechtigt('admin');
|
||||||
|
if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||||
|
$result = $this->LehrveranstaltungModel->getLvForLektorInSemester($sem_kurzbz, $uid);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLeForLv() {
|
||||||
|
$lv_id = $this->input->get("lv_id",TRUE);
|
||||||
|
$sem_kurzbz = $this->input->get("sem_kurzbz",TRUE);
|
||||||
|
|
||||||
|
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||||
|
|
||||||
|
// $this->terminateWithSuccess($this->LehreinheitModel->getLesForLv($lv_id, $sem_kurzbz));
|
||||||
|
$this->terminateWithSuccess($this->LehreinheitModel->getAllLehreinheitenForLvaAndMaUid($lv_id, getAuthUID(), $sem_kurzbz));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,7 +28,10 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getByEmp' => ['admin:r', 'assistenz:r'],
|
'getByEmp' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getByLe' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getByLv' => ['admin:r', 'assistenz:r'],
|
||||||
'getByStg' => ['admin:r', 'assistenz:r'],
|
'getByStg' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getByStgOrgform' => ['admin:r', 'assistenz:r'],
|
||||||
'loadByLV' => ['admin:r', 'assistenz:r'],
|
'loadByLV' => ['admin:r', 'assistenz:r'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -77,41 +80,117 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess($tree);
|
$this->terminateWithSuccess($tree);
|
||||||
}
|
}
|
||||||
public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
|
|
||||||
{
|
|
||||||
$studiengang_kz = $this->getStudiengangKz($stg_kz);
|
|
||||||
|
|
||||||
if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz))
|
public function getByLe($studiensemester_kurzbz = null, $lehreinheit_id = null)
|
||||||
|
{
|
||||||
|
if (is_null($lehreinheit_id))
|
||||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
$verband = null;
|
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||||
if (!is_null($semester) && !is_numeric($semester))
|
|
||||||
{
|
|
||||||
$verband = $this->getOrgformKurzbz($semester);
|
|
||||||
$semester = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
|
||||||
|
$lehreinheiten = $this->_ci->LehreinheitModel->getByLeStudiensemester($lehreinheit_id, $studiensemester_kurzbz);
|
||||||
|
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($lehreinheiten_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getByLv($studiensemester_kurzbz = null, $lehrveranstaltung_id = null)
|
||||||
|
{
|
||||||
|
if (is_null($lehrveranstaltung_id))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||||
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
|
|
||||||
|
|
||||||
$studienplan_ids = array();
|
$tree = [];
|
||||||
$only_ids = array();
|
|
||||||
$placeholders = array();
|
|
||||||
|
|
||||||
if (hasData($studienplan_data))
|
$this->_ci->LehrveranstaltungModel->addSelect('studiengang_kz');
|
||||||
|
$lv = $this->_ci->LehrveranstaltungModel->load($lehrveranstaltung_id);
|
||||||
|
$lv = $this->getDataOrTerminateWithError($lv);
|
||||||
|
|
||||||
|
if (empty($lv))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$lehrveranstaltungen_data = array();
|
||||||
|
foreach ($this->_loadLvRows(current($lv)->studiengang_kz, $studiensemester_kurzbz) as $row)
|
||||||
{
|
{
|
||||||
foreach (getData($studienplan_data) as $studienplan) {
|
if ((string)$row->lehrveranstaltung_id === (string)$lehrveranstaltung_id)
|
||||||
$placeholders[] = "(?, ?)";
|
{
|
||||||
$studienplan_ids[] = $studienplan->studienplan_id;
|
$lehrveranstaltungen_data[] = $row;
|
||||||
$studienplan_ids[] = $studienplan->semester;
|
break;
|
||||||
$only_ids[] = $studienplan->studienplan_id;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
|
if (empty($lehrveranstaltungen_data))
|
||||||
$lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
|
{
|
||||||
|
|
||||||
|
$this->_ci->LehrveranstaltungModel->addSelect('
|
||||||
|
tbl_lehrveranstaltung.*,
|
||||||
|
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
lehrtyp_kurzbz,
|
||||||
|
studiengang_kz as lv_studiengang_kz,
|
||||||
|
UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang,
|
||||||
|
semester as semester,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
ects as lv_ects,
|
||||||
|
lehreverzeichnis as lv_lehreverzeichnis,
|
||||||
|
planfaktor as lv_planfaktor,
|
||||||
|
planlektoren as lv_planlektoren,
|
||||||
|
planpersonalkosten as lv_planpersonalkosten,
|
||||||
|
plankostenprolektor as lv_plankostenprolektor,
|
||||||
|
tbl_lehrveranstaltung.orgform_kurzbz as orgform_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.sprache as sprache,
|
||||||
|
lehrform_kurzbz as lv_lehrform_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
|
||||||
|
semesterstunden as lv_semesterstunden,
|
||||||
|
');
|
||||||
|
$this->_ci->LehrveranstaltungModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||||
|
$lehrveranstaltungen = $this->_ci->LehrveranstaltungModel->load($lehrveranstaltung_id);
|
||||||
|
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
|
||||||
|
{
|
||||||
|
$lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz);
|
||||||
|
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
|
||||||
|
|
||||||
|
if (!isset($lehrveranstaltung->_children))
|
||||||
|
{
|
||||||
|
$lehrveranstaltung->_children = $lehreinheiten_data;
|
||||||
|
}
|
||||||
|
$tree[] = $lehrveranstaltung;
|
||||||
|
}
|
||||||
|
|
||||||
|
$counter = 0;
|
||||||
|
$this->assignUniqueIndex($tree, $counter);
|
||||||
|
$this->terminateWithSuccess($tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
|
||||||
|
{
|
||||||
|
$this->_getLvTree($studiensemester_kurzbz, $stg_kz, $semester, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getByStgOrgform($studiensemester_kurzbz = null, $stg_kz = null, $orgform = null, $semester = null)
|
||||||
|
{
|
||||||
|
$orgform_kurzbz = $this->getOrgformKurzbz($orgform);
|
||||||
|
$this->_getLvTree($studiensemester_kurzbz, $stg_kz, $semester, $orgform_kurzbz);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _getLvTree($studiensemester_kurzbz, $stg_kz, $semester, $orgform_kurzbz)
|
||||||
|
{
|
||||||
|
$studiengang_kz = $this->getStudiengangKz($stg_kz);
|
||||||
|
|
||||||
|
if (is_null($studiengang_kz) || !preg_match("/^(-?[1-9][0-9]*|0)$/", (string)$studiengang_kz))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
if (!is_null($semester) && !ctype_digit((string)$semester))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||||
|
|
||||||
|
$lehrveranstaltungen_data = $this->_loadLvRows($studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
|
||||||
|
|
||||||
$tree = [];
|
$tree = [];
|
||||||
foreach ($lehrveranstaltungen_data as $row)
|
foreach ($lehrveranstaltungen_data as $row)
|
||||||
@@ -244,6 +323,31 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
|
$this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
private function _loadLvRows($studiengang_kz, $studiensemester_kurzbz, $semester = null, $orgform_kurzbz = null)
|
||||||
|
{
|
||||||
|
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||||
|
|
||||||
|
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
|
||||||
|
|
||||||
|
$studienplan_ids = array();
|
||||||
|
$only_ids = array();
|
||||||
|
$placeholders = array();
|
||||||
|
|
||||||
|
if (hasData($studienplan_data))
|
||||||
|
{
|
||||||
|
foreach (getData($studienplan_data) as $studienplan) {
|
||||||
|
$placeholders[] = "(?, ?)";
|
||||||
|
$studienplan_ids[] = $studienplan->studienplan_id;
|
||||||
|
$studienplan_ids[] = $studienplan->semester;
|
||||||
|
$only_ids[] = $studienplan->studienplan_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
|
||||||
|
return hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
|
||||||
|
}
|
||||||
|
|
||||||
private function _setAuthUID()
|
private function _setAuthUID()
|
||||||
{
|
{
|
||||||
$this->_uid = getAuthUID();
|
$this->_uid = getAuthUID();
|
||||||
@@ -309,8 +413,8 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
if (!$data)
|
if (!$data)
|
||||||
return $orgform_kurzbz;
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
return current($data)->orgform_kurzbz;
|
return current($data)->orgform_kurzbz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,8 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getLvMenu' => self::PERM_LOGGED
|
'getLvMenu' => self::PERM_LOGGED,
|
||||||
|
'getMultipleLvMenu' => self::PERM_LOGGED
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->model("ressource/Mitarbeiter_model");
|
$this->load->model("ressource/Mitarbeiter_model");
|
||||||
@@ -61,24 +62,23 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* alternative function to get multiple lvMenus with a single http request
|
* alternative function to get multiple lvMenus with a single http request
|
||||||
|
* not yet working as intended as the menu_lv.inc.php scripts called by the
|
||||||
|
* lvMenuBuild event have logic coupled to require_once import which results in
|
||||||
|
* a wrong logic after the first invocation -> faulty results for lvinfo, moodle
|
||||||
|
* and several others
|
||||||
*/
|
*/
|
||||||
public function getMultipleLvMenu($lvMenuOptionList){
|
public function getMultipleLvMenu(){
|
||||||
|
$lvMenuOptionList = $this->input->post('lvMenuOptionList', true);
|
||||||
$result =[];
|
$result =[];
|
||||||
foreach($lvMenuOptionList as $lvMenuOptions){
|
foreach($lvMenuOptionList as $lvMenuOptions){
|
||||||
$lvMenu = $this->getLvMenu($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
|
$lvMenu = $this->getLvMenuInternal($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
|
||||||
if(isError($lvMenu)){
|
|
||||||
// TODO: some lvMenu threw an error, handle error here
|
|
||||||
}
|
|
||||||
$result[$lvMenuOptions['lvid']]=$lvMenu;
|
$result[$lvMenuOptions['lvid']]=$lvMenu;
|
||||||
}
|
}
|
||||||
$this->terminateWithSuccess($result);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private function getLvMenuInternal($lvid, $studiensemester_kurzbz) {
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function getLvMenu($lvid, $studiensemester_kurzbz)
|
|
||||||
{
|
|
||||||
|
|
||||||
// return early if parameters are missing
|
// return early if parameters are missing
|
||||||
if(!isset($lvid) || !isset($studiensemester_kurzbz))
|
if(!isset($lvid) || !isset($studiensemester_kurzbz))
|
||||||
@@ -89,14 +89,14 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
// get the user
|
// get the user
|
||||||
if (!$user=getAuthUID())
|
if (!$user=getAuthUID())
|
||||||
$this->terminateWithError($this->p->t('global', 'nichtAngemeldet'));
|
$this->terminateWithError($this->p->t('global', 'nichtAngemeldet'));
|
||||||
|
|
||||||
// check if is_lector
|
// check if is_lector
|
||||||
$is_lector = false;
|
$is_lector = false;
|
||||||
$mares = $this->Mitarbeiter_model->isMitarbeiter($user);
|
$mares = $this->Mitarbeiter_model->isMitarbeiter($user);
|
||||||
if(hasData($mares))
|
if(hasData($mares))
|
||||||
{
|
{
|
||||||
$is_lector = getData($mares);
|
$is_lector = getData($mares);
|
||||||
}
|
}
|
||||||
|
|
||||||
// definition of user_is_allowed_to_upload
|
// definition of user_is_allowed_to_upload
|
||||||
@@ -105,7 +105,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
// load lehrveranstaltung
|
// load lehrveranstaltung
|
||||||
$lvres = $this->Lehrveranstaltung_model->load($lvid);
|
$lvres = $this->Lehrveranstaltung_model->load($lvid);
|
||||||
if(!hasData($lvres))
|
if(!hasData($lvres))
|
||||||
{
|
{
|
||||||
$this->terminateWithError('LV ' . $lvid . ' not found.');
|
$this->terminateWithError('LV ' . $lvid . ' not found.');
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
$stgres = $this->Studiengang_model->load(strval($studiengang_kz));
|
$stgres = $this->Studiengang_model->load(strval($studiengang_kz));
|
||||||
if(!hasData($stgres))
|
if(!hasData($stgres))
|
||||||
{
|
{
|
||||||
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
|
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
|
||||||
}
|
}
|
||||||
$stg = (getData($stgres))[0];
|
$stg = (getData($stgres))[0];
|
||||||
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
|
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
|
||||||
@@ -139,7 +139,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
$angemeldet = false;
|
$angemeldet = false;
|
||||||
|
|
||||||
$lesres = $this->Lehreinheit_model->getLehreinheitenForStudentAndStudienSemester(
|
$lesres = $this->Lehreinheit_model->getLehreinheitenForStudentAndStudienSemester(
|
||||||
$lvid, $user, $angezeigtes_stsem
|
$lvid, $user, $angezeigtes_stsem
|
||||||
);
|
);
|
||||||
|
|
||||||
if(hasData($lesres) && count(getData($lesres)) > 0)
|
if(hasData($lesres) && count(getData($lesres)) > 0)
|
||||||
@@ -148,7 +148,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
// lehrfach
|
// lehrfach
|
||||||
$lehrfach_id='';
|
$lehrfach_id='';
|
||||||
|
|
||||||
if(defined('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN)
|
if(defined('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN)
|
||||||
{
|
{
|
||||||
// Wenn der eingeloggte User zu einer der Lehreinheiten zugeteilt ist
|
// Wenn der eingeloggte User zu einer der Lehreinheiten zugeteilt ist
|
||||||
@@ -211,8 +211,8 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
foreach($fbs as $row)
|
foreach($fbs as $row)
|
||||||
{
|
{
|
||||||
$lehrfach_oe_kurzbz_arr[] = $row->oe_kurzbz;
|
$lehrfach_oe_kurzbz_arr[] = $row->oe_kurzbz;
|
||||||
if($this->PermissionLib->isBerechtigt('lehre', null, $row->oe_kurzbz)
|
if($this->PermissionLib->isBerechtigt('lehre', null, $row->oe_kurzbz)
|
||||||
|| $this->PermissionLib->isBerechtigt('assistenz', null, $stg->oe_kurzbz))
|
|| $this->PermissionLib->isBerechtigt('assistenz', null, $stg->oe_kurzbz))
|
||||||
{
|
{
|
||||||
$user_is_allowed_to_upload=true;
|
$user_is_allowed_to_upload=true;
|
||||||
}
|
}
|
||||||
@@ -224,21 +224,21 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
$menu = array();
|
$menu = array();
|
||||||
|
|
||||||
$this->fhc_menu_lvinfo($menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr);
|
$this->fhc_menu_lvinfo($menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr);
|
||||||
|
|
||||||
$this->fhc_menu_feedback($menu, $angemeldet, $lvid);
|
$this->fhc_menu_feedback($menu, $angemeldet, $lvid);
|
||||||
|
|
||||||
$this->fhc_menu_gesamtnote($menu, $angemeldet, $lvid, $lv, $is_lector, $angezeigtes_stsem);
|
$this->fhc_menu_gesamtnote($menu, $angemeldet, $lvid, $lv, $is_lector, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_emailStudierende($menu, $user, $angemeldet, $lvid, $angezeigtes_stsem);
|
$this->fhc_menu_emailStudierende($menu, $user, $angemeldet, $lvid, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_abmeldung($menu, $user, $is_lector, $lvid, $angezeigtes_stsem);
|
$this->fhc_menu_abmeldung($menu, $user, $is_lector, $lvid, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_lehretools($menu, $lvid, $angezeigtes_stsem, $sprache);
|
$this->fhc_menu_lehretools($menu, $lvid, $angezeigtes_stsem, $sprache);
|
||||||
|
|
||||||
$this->fhc_menu_anrechnungStudent($menu, $lvid, $angezeigtes_stsem);
|
$this->fhc_menu_anrechnungStudent($menu, $lvid, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_anrechnungLector($menu, $angezeigtes_stsem);
|
$this->fhc_menu_anrechnungLector($menu, $angezeigtes_stsem);
|
||||||
|
|
||||||
|
|
||||||
// Addons Menu Logic
|
// Addons Menu Logic
|
||||||
// ##########################################################################################
|
// ##########################################################################################
|
||||||
@@ -272,18 +272,18 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
'permissionLib' => &$this->PermissionLib,
|
'permissionLib' => &$this->PermissionLib,
|
||||||
'phrasesLib' => &$this->PhrasesLib
|
'phrasesLib' => &$this->PhrasesLib
|
||||||
];
|
];
|
||||||
|
|
||||||
Events::trigger('lvMenuBuild',
|
Events::trigger('lvMenuBuild',
|
||||||
// passing $menu per reference
|
// passing $menu per reference
|
||||||
function & () use (&$menu) {
|
function & () use (&$menu) {
|
||||||
return $menu;
|
return $menu;
|
||||||
},
|
},
|
||||||
$params
|
$params
|
||||||
);
|
);
|
||||||
|
|
||||||
// Menu sortieren
|
// Menu sortieren
|
||||||
// ##########################################################################################
|
// ##########################################################################################
|
||||||
|
|
||||||
foreach ($menu as $key => $row){
|
foreach ($menu as $key => $row){
|
||||||
|
|
||||||
// removes menu points that are not needed in the c4 lvUebersicht
|
// removes menu points that are not needed in the c4 lvUebersicht
|
||||||
@@ -291,7 +291,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
unset($menu[$key]);
|
unset($menu[$key]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fills pos array to sort the menu
|
// fills pos array to sort the menu
|
||||||
$pos[$key] = $row['position'];
|
$pos[$key] = $row['position'];
|
||||||
|
|
||||||
@@ -299,11 +299,18 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
array_multisort($pos, SORT_ASC, SORT_NUMERIC, $menu);
|
array_multisort($pos, SORT_ASC, SORT_NUMERIC, $menu);
|
||||||
|
|
||||||
// HTTP response
|
|
||||||
// ##########################################################################################
|
return $menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getLvMenu($lvid, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$menu = $this->getLvMenuInternal($lvid, $studiensemester_kurzbz);
|
||||||
|
|
||||||
$this->terminateWithSuccess($menu);
|
$this->terminateWithSuccess($menu);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
|
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
|
||||||
@@ -372,7 +379,8 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
'name'=>$this->p->t('lehre', 'gesamtnote'),
|
'name'=>$this->p->t('lehre', 'gesamtnote'),
|
||||||
'phrase' => 'lehre/gesamtnote',
|
'phrase' => 'lehre/gesamtnote',
|
||||||
'c4_icon'=> base_url('skin/images/button_endnote.png'),
|
'c4_icon'=> base_url('skin/images/button_endnote.png'),
|
||||||
'c4_link'=> base_url('cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
|
'c4_link'=> site_url('Cis/Benotungstool/'.urlencode($lvid).'/'.urlencode($angezeigtes_stsem))
|
||||||
|
//'c4_link'=> base_url('cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
|
||||||
//'c4_link'=> base_url('benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
|
//'c4_link'=> base_url('benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -541,4 +549,4 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,167 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class MaZeitsperren extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getAllActiveZeitsperren' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getAllZeitsperrenFixeMa' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getAllZeitsperrenLector' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getAllZeitsperrenOes' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getZeitsperrenAss' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getStgLectors' => self::PERM_LOGGED,
|
||||||
|
'loadZeitsperrenLectorStg' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'loadZeitsperrenMa' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getDetailsMa' => self::PERM_LOGGED
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Load Libraries
|
||||||
|
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||||
|
$this->load->library('form_validation');
|
||||||
|
|
||||||
|
// Load language phrases
|
||||||
|
$this->loadPhrases([
|
||||||
|
'ui',
|
||||||
|
'person',
|
||||||
|
'zeitsperren'
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Load models
|
||||||
|
$this->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
//only user with zeitsperren
|
||||||
|
public function getAllActiveZeitsperren($days)
|
||||||
|
{
|
||||||
|
$result = $this->ZeitsperreModel->getZeitsperrenForNextDays($days);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: check query: more results after join with hr-table
|
||||||
|
//all fixe Ma
|
||||||
|
public function getAllZeitsperrenFixeMa($days)
|
||||||
|
{
|
||||||
|
$von = date('Y-m-d');
|
||||||
|
$bis = date('Y-m-d', strtotime("+{$days} days"));
|
||||||
|
$result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, true, false, null, false);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllZeitsperrenLector($days)
|
||||||
|
{
|
||||||
|
$von = date('Y-m-d');
|
||||||
|
$bis = date('Y-m-d', strtotime("+{$days} days"));
|
||||||
|
$result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, false, true, null, false);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZeitsperrenAss($days)
|
||||||
|
{
|
||||||
|
$von = date('Y-m-d');
|
||||||
|
$bis = date('Y-m-d', strtotime("+{$days} days"));
|
||||||
|
$result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, false, false, null, true);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllZeitsperrenOes($days, $oe)
|
||||||
|
{
|
||||||
|
if(!$oe)
|
||||||
|
{
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'OE Kurzbezeichnung']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$von = date('Y-m-d');
|
||||||
|
$bis = date('Y-m-d', strtotime("+{$days} days"));
|
||||||
|
$result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, false, false, $oe, false);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadZeitsperrenLectorStg($days, $stg)
|
||||||
|
{
|
||||||
|
if(!$stg)
|
||||||
|
{
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
if(!is_numeric($stg))
|
||||||
|
{
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'error_paramNoNumber', ['param'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
$von = date('Y-m-d');
|
||||||
|
$bis = date('Y-m-d', strtotime("+{$days} days"));
|
||||||
|
$result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, false, true, false, false, $stg);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStgLectors()
|
||||||
|
{
|
||||||
|
$sql = "
|
||||||
|
select
|
||||||
|
studiengang_kz,
|
||||||
|
kurzbz,
|
||||||
|
kurzbzlang,
|
||||||
|
typ,
|
||||||
|
bezeichnung,
|
||||||
|
kurzbzlang || ' (' || bezeichnung || ')' AS label,
|
||||||
|
aktiv
|
||||||
|
from
|
||||||
|
public.tbl_studiengang
|
||||||
|
where
|
||||||
|
typ in ('b','m')
|
||||||
|
order by typ asc, kurzbz Asc
|
||||||
|
";
|
||||||
|
|
||||||
|
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||||
|
$result = $this->StudiengangModel->execReadOnlyQuery($sql);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadZeitsperrenMa($days, $uid)
|
||||||
|
{
|
||||||
|
if ($uid === null || $uid === '')
|
||||||
|
{
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mitarbeiter UID']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$result = $this->ZeitsperreModel->getZeitsperrenForNextDays($days, $uid);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDetailsMa($uid)
|
||||||
|
{
|
||||||
|
if ($uid === null || $uid === '')
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mitarbeiter UID']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->load->model('person/Person_model', 'PersonModel');
|
||||||
|
$result = $this->PersonModel->getFullName($uid);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,948 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2026 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');
|
||||||
|
|
||||||
|
class NewsAdministrationAPI extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* News API constructor.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getNews' => 'basis/news:r',
|
||||||
|
'getNewsItem' => 'basis/news:r',
|
||||||
|
'storeNewsItem' => 'basis/news:w',
|
||||||
|
'updateNewsItem' => 'basis/news:w',
|
||||||
|
'deleteNewsItem' => 'basis/news:w'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->load->model('content/Content_model', 'ContentModel');
|
||||||
|
$this->load->model('content/Contentsprache_model', 'ContentspracheModel');
|
||||||
|
$this->load->model('content/News_model', 'NewsModel');
|
||||||
|
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||||
|
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
$this->load->model('system/Sprache_model', 'SpracheModel');
|
||||||
|
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||||
|
|
||||||
|
$this->loadPhrases([
|
||||||
|
'global'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->load->library('CmsLib');
|
||||||
|
|
||||||
|
$this->load->helper('hlp_sancho_helper');
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $titel = '', $active = true, $sichtbar = true)
|
||||||
|
{
|
||||||
|
$this->load->library('form_validation');
|
||||||
|
$this->form_validation->set_data($_GET);
|
||||||
|
$this->form_validation->set_rules('page','Page','required|is_natural');
|
||||||
|
$this->form_validation->set_rules('page_size', 'PageSize', 'is_natural');
|
||||||
|
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
|
||||||
|
$page = intval($this->input->get('page', true));
|
||||||
|
$page_size = intval($this->input->get('page_size', true));
|
||||||
|
$sprache = $this->input->get('sprache', true);
|
||||||
|
if(!$sprache)
|
||||||
|
{
|
||||||
|
$sprache = getUserLanguage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// default value for the page_size is 10
|
||||||
|
$page_size = $page_size ?? 10;
|
||||||
|
|
||||||
|
$passedSichtbar = $this->input->get('published', true);
|
||||||
|
if($passedSichtbar !== null)
|
||||||
|
{
|
||||||
|
$sichtbar = $passedSichtbar;
|
||||||
|
}
|
||||||
|
|
||||||
|
$passedIsActive = $this->input->get('isActive', true);
|
||||||
|
if ($passedIsActive !== null)
|
||||||
|
{
|
||||||
|
$isActive = filter_var(
|
||||||
|
$passedIsActive,
|
||||||
|
FILTER_VALIDATE_BOOLEAN,
|
||||||
|
FILTER_NULL_ON_FAILURE
|
||||||
|
);
|
||||||
|
if ($isActive !== null)
|
||||||
|
{
|
||||||
|
$active = $isActive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$degreeProgramShortCode = $this->input->get('degreeProgramShortCode', true);
|
||||||
|
if ($degreeProgramShortCode !== null && $degreeProgramShortCode !== '')
|
||||||
|
{
|
||||||
|
if (!ctype_digit((string)$degreeProgramShortCode))
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'degreeProgramShortCode' => 'A valid degree program is required'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
$studiengang_kz = $degreeProgramShortCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
$passedSemester = $this->input->get('semester', true);
|
||||||
|
if ($passedSemester !== null && $passedSemester !== '')
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
!ctype_digit((string)$passedSemester)
|
||||||
|
|| (int)$passedSemester < 1
|
||||||
|
|| (int)$passedSemester > 8
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'semester' => 'A valid semester is required'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
$semester = filter_var($passedSemester, FILTER_VALIDATE_INT);
|
||||||
|
}
|
||||||
|
|
||||||
|
$entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news");
|
||||||
|
|
||||||
|
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, false, $titel, true, $sichtbar, $page, $page_size, $sprache, true, $entitledDegreePrograms, $active);
|
||||||
|
$news = $this->getDataOrTerminateWithError($news);
|
||||||
|
|
||||||
|
$this->addMeta('row_count', $news["row_count"] ?? 0);
|
||||||
|
$this->terminateWithSuccess($news["content"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns one news entry with all available language versions for editing.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function getNewsItem($newsId)
|
||||||
|
{
|
||||||
|
if (!is_numeric($newsId) || (int)$newsId < 1)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'newsId' => 'A valid news ID is required'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsId = (int)$newsId;
|
||||||
|
$newsResult = $this->NewsModel->load($newsId);
|
||||||
|
|
||||||
|
if (isError($newsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($newsResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasData($newsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'newsId' => 'The requested news entry does not exist'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$news = current(getData($newsResult));
|
||||||
|
$entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news");
|
||||||
|
|
||||||
|
if (!in_array($news->studiengang_kz, $entitledDegreePrograms)) {
|
||||||
|
$this->terminateWithError('You are not entitled to access this news entry', self::ERROR_TYPE_PERMISSION);
|
||||||
|
}
|
||||||
|
$translationsResult = $this->ContentspracheModel->loadWhere([
|
||||||
|
'content_id' => $news->content_id
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (isError($translationsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($translationsResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$languages = [];
|
||||||
|
|
||||||
|
foreach ((array)getData($translationsResult) as $translation)
|
||||||
|
{
|
||||||
|
$languages[$translation->sprache] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$translations = [];
|
||||||
|
|
||||||
|
foreach (array_keys($languages) as $language)
|
||||||
|
{
|
||||||
|
$contentResult = $this->ContentModel->getContent(
|
||||||
|
$news->content_id,
|
||||||
|
$language,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isError($contentResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($contentResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = getData($contentResult);
|
||||||
|
$document = new DOMDocument('1.0', 'UTF-8');
|
||||||
|
|
||||||
|
if ($content->content !== '' && $document->loadXML($content->content) === false)
|
||||||
|
{
|
||||||
|
$this->terminateWithError(
|
||||||
|
'The stored news content is invalid',
|
||||||
|
self::ERROR_TYPE_GENERAL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$author = $document->getElementsByTagName('verfasser')->item(0);
|
||||||
|
$title = $document->getElementsByTagName('betreff')->item(0);
|
||||||
|
$text = $document->getElementsByTagName('text')->item(0);
|
||||||
|
|
||||||
|
$translations[] = [
|
||||||
|
'language' => $language,
|
||||||
|
'author' => $author ? $author->nodeValue : '',
|
||||||
|
'title' => $title ? $title->nodeValue : '',
|
||||||
|
'text' => $text ? str_replace('dms.php', APP_ROOT . 'cms/dms.php', $text->nodeValue) : '',
|
||||||
|
'isPublished' => (bool)$content->sichtbar
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess([
|
||||||
|
'newsId' => (int)$news->news_id,
|
||||||
|
'visibleFrom' => $news->datum,
|
||||||
|
'visibleTo' => $news->datum_bis,
|
||||||
|
'degreeProgramShortCode' => $news->studiengang_kz,
|
||||||
|
'semester' => $news->semester,
|
||||||
|
'translations' => $translations
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a news entry and all supplied translations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function storeNewsItem()
|
||||||
|
{
|
||||||
|
$this->load->library('form_validation');
|
||||||
|
$postData = $this->input->post(null, true);
|
||||||
|
$this->form_validation->set_data(is_array($postData) ? $postData : []);
|
||||||
|
$this->form_validation->set_rules('visibleFrom', 'Visible from', 'required|is_valid_date');
|
||||||
|
$this->form_validation->set_rules('visibleTo', 'Visible to', 'is_valid_date');
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
'degreeProgramShortCode',
|
||||||
|
'Degree program',
|
||||||
|
'required|is_natural'
|
||||||
|
);
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
'semester',
|
||||||
|
'Semester',
|
||||||
|
'is_natural_no_zero|less_than_equal_to[8]'
|
||||||
|
);
|
||||||
|
|
||||||
|
$errors = $this->form_validation->run() === false
|
||||||
|
? $this->form_validation->error_array()
|
||||||
|
: [];
|
||||||
|
$visibleFrom = $this->input->post('visibleFrom', true);
|
||||||
|
$visibleTo = $this->input->post('visibleTo', true);
|
||||||
|
$translations = $this->input->post('translations', true);
|
||||||
|
|
||||||
|
if (
|
||||||
|
is_string($visibleFrom)
|
||||||
|
&& is_string($visibleTo)
|
||||||
|
&& $visibleTo !== ''
|
||||||
|
&& is_valid_date($visibleFrom)
|
||||||
|
&& is_valid_date($visibleTo)
|
||||||
|
&& new DateTime($visibleTo) < new DateTime($visibleFrom)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$errors['visibleTo'] = 'Visible to must not be before Visible from';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_array($translations) || count($translations) === 0)
|
||||||
|
{
|
||||||
|
$errors['translations'] = 'At least one translation is required';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach ($translations as $index => $translation)
|
||||||
|
{
|
||||||
|
if (!is_array($translation))
|
||||||
|
{
|
||||||
|
$errors['translations.' . $index] = 'Each translation must be an object';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($errors) > 0)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors($errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$this->_ensureUserIsEntitledForDegreeProgram($this->input->post('degreeProgramShortCode', true));
|
||||||
|
|
||||||
|
$degreeProgramShortCode = $this->input->post('degreeProgramShortCode', true);
|
||||||
|
$semester = $this->input->post('semester', true);
|
||||||
|
$semester = $semester === '' ? null : $semester;
|
||||||
|
$visibleTo = $visibleTo === '' ? null : $visibleTo;
|
||||||
|
|
||||||
|
$studiengang = $this->_getStudiengang($degreeProgramShortCode);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'studiengang_kz' => $degreeProgramShortCode,
|
||||||
|
'semester' => $semester,
|
||||||
|
'datum' => $visibleFrom,
|
||||||
|
'datum_bis' => $visibleTo,
|
||||||
|
'translations' => []
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($translations as $index => $translation)
|
||||||
|
{
|
||||||
|
$data['translations'][$index] = [
|
||||||
|
'sprache' => $translation['language'] ?? '',
|
||||||
|
'verfasser' => $translation['author'] ?? '',
|
||||||
|
'betreff' => $translation['title'] ?? '',
|
||||||
|
'text' => $translation['text'] ?? '',
|
||||||
|
'sichtbar' => isset($translation['isPublished']) ? (bool)$translation['isPublished'] : false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_validateLanguages($data['translations']);
|
||||||
|
|
||||||
|
foreach ($data['translations'] as $index => $translation)
|
||||||
|
{
|
||||||
|
$data['translations'][$index]['content'] = $this->_buildNewsXml($translation);
|
||||||
|
}
|
||||||
|
|
||||||
|
$uid = getAuthUID();
|
||||||
|
$now = date('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
if ($this->db->trans_begin() === false)
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->db->error(), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$contentResult = $this->ContentModel->insert([
|
||||||
|
'template_kurzbz' => 'news',
|
||||||
|
'oe_kurzbz' => $studiengang->oe_kurzbz,
|
||||||
|
'aktiv' => true,
|
||||||
|
'menu_open' => false,
|
||||||
|
'insertamum' => $now,
|
||||||
|
'insertvon' => $uid
|
||||||
|
]);
|
||||||
|
$contentId = (int)$this->_getInsertedIdOrRollback($contentResult);
|
||||||
|
|
||||||
|
$newsResult = $this->NewsModel->insert([
|
||||||
|
'uid' => $uid,
|
||||||
|
'studiengang_kz' => $data['studiengang_kz'],
|
||||||
|
'semester' => $data['semester'],
|
||||||
|
'datum' => $data['datum'],
|
||||||
|
'datum_bis' => $data['datum_bis'],
|
||||||
|
'content_id' => $contentId,
|
||||||
|
'insertamum' => $now,
|
||||||
|
'insertvon' => $uid,
|
||||||
|
'updateamum' => $now,
|
||||||
|
'updatevon' => $uid
|
||||||
|
]);
|
||||||
|
$newsId = (int)$this->_getInsertedIdOrRollback($newsResult);
|
||||||
|
|
||||||
|
foreach ($data['translations'] as $translation)
|
||||||
|
{
|
||||||
|
$translation['content'] = $this->formatContentURLsToRelative($translation['content']);
|
||||||
|
|
||||||
|
$translationResult = $this->ContentspracheModel->insert([
|
||||||
|
'sprache' => $translation['sprache'],
|
||||||
|
'content_id' => $contentId,
|
||||||
|
'version' => 1,
|
||||||
|
'sichtbar' => $translation['sichtbar'],
|
||||||
|
'content' => $translation['content'],
|
||||||
|
'titel' => $translation['betreff'],
|
||||||
|
'insertamum' => $now,
|
||||||
|
'insertvon' => $uid,
|
||||||
|
'updateamum' => $now,
|
||||||
|
'updatevon' => $uid
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->_getInsertedIdOrRollback($translationResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsItemResult = $this->NewsModel->load($newsId);
|
||||||
|
$newsItem = $this->getDataOrTerminateWithError($newsItemResult);
|
||||||
|
$newsItem = $newsItem[0];
|
||||||
|
|
||||||
|
$this->_sendNewsItemTranslationRequiredMail(
|
||||||
|
$newsItem
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->db->trans_commit() === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($newsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a news entry and its supplied translations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function updateNewsItem($newsId)
|
||||||
|
{
|
||||||
|
if (!is_numeric($newsId) || (int)$newsId < 1)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'newsId' => 'A valid news ID is required'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsId = (int)$newsId;
|
||||||
|
$existingNewsResult = $this->NewsModel->load($newsId);
|
||||||
|
|
||||||
|
if (isError($existingNewsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($existingNewsResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasData($existingNewsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'newsId' => 'The requested news entry does not exist'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingNews = current(getData($existingNewsResult));
|
||||||
|
|
||||||
|
$this->_ensureUserIsEntitledForDegreeProgram($existingNews->studiengang_kz);
|
||||||
|
|
||||||
|
$this->load->library('form_validation');
|
||||||
|
$postData = $this->input->post(null, true);
|
||||||
|
$this->form_validation->set_data(is_array($postData) ? $postData : []);
|
||||||
|
$this->form_validation->set_rules('visibleFrom', 'Visible from', 'required|is_valid_date');
|
||||||
|
$this->form_validation->set_rules('visibleTo', 'Visible to', 'is_valid_date');
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
'degreeProgramShortCode',
|
||||||
|
'Degree program',
|
||||||
|
'required|is_natural'
|
||||||
|
);
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
'semester',
|
||||||
|
'Semester',
|
||||||
|
'is_natural_no_zero|less_than_equal_to[8]'
|
||||||
|
);
|
||||||
|
|
||||||
|
$errors = $this->form_validation->run() === false
|
||||||
|
? $this->form_validation->error_array()
|
||||||
|
: [];
|
||||||
|
$visibleFrom = $this->input->post('visibleFrom', true);
|
||||||
|
$visibleTo = $this->input->post('visibleTo', true);
|
||||||
|
$translations = $this->input->post('translations', true);
|
||||||
|
|
||||||
|
if (
|
||||||
|
is_string($visibleFrom)
|
||||||
|
&& is_string($visibleTo)
|
||||||
|
&& $visibleTo !== ''
|
||||||
|
&& is_valid_date($visibleFrom)
|
||||||
|
&& is_valid_date($visibleTo)
|
||||||
|
&& new DateTime($visibleTo) < new DateTime($visibleFrom)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$errors['visibleTo'] = 'Visible to must not be before Visible from';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_array($translations) || count($translations) === 0)
|
||||||
|
{
|
||||||
|
$errors['translations'] = 'At least one translation is required';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach ($translations as $index => $translation)
|
||||||
|
{
|
||||||
|
if (!is_array($translation))
|
||||||
|
{
|
||||||
|
$errors['translations.' . $index] = 'Each translation must be an object';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($errors) > 0)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors($errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
$degreeProgramShortCode = $this->input->post('degreeProgramShortCode', true);
|
||||||
|
$semester = $this->input->post('semester', true);
|
||||||
|
$semester = $semester === '' ? null : $semester;
|
||||||
|
$visibleTo = $visibleTo === '' ? null : $visibleTo;
|
||||||
|
|
||||||
|
$studiengang = $this->_getStudiengang($degreeProgramShortCode);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'studiengang_kz' => $degreeProgramShortCode,
|
||||||
|
'semester' => $semester,
|
||||||
|
'datum' => $visibleFrom,
|
||||||
|
'datum_bis' => $visibleTo,
|
||||||
|
'translations' => []
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($translations as $index => $translation)
|
||||||
|
{
|
||||||
|
$data['translations'][$index] = [
|
||||||
|
'sprache' => $translation['language'] ?? '',
|
||||||
|
'verfasser' => $translation['author'] ?? '',
|
||||||
|
'betreff' => $translation['title'] ?? '',
|
||||||
|
'text' => $translation['text'] ?? '',
|
||||||
|
'sichtbar' => isset($translation['isPublished']) ? (bool)$translation['isPublished'] : false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_validateLanguages($data['translations']);
|
||||||
|
|
||||||
|
foreach ($data['translations'] as $index => $translation)
|
||||||
|
{
|
||||||
|
$data['translations'][$index]['content'] = $this->_buildNewsXml($translation);
|
||||||
|
}
|
||||||
|
|
||||||
|
$uid = getAuthUID();
|
||||||
|
$now = date('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
if ($this->db->trans_begin() === false)
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->db->error(), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$contentResult = $this->ContentModel->update($existingNews->content_id, [
|
||||||
|
'oe_kurzbz' => $studiengang->oe_kurzbz,
|
||||||
|
'updateamum' => $now,
|
||||||
|
'updatevon' => $uid
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (isError($contentResult))
|
||||||
|
{
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError(getError($contentResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsResult = $this->NewsModel->update($newsId, [
|
||||||
|
'studiengang_kz' => $data['studiengang_kz'],
|
||||||
|
'semester' => $data['semester'],
|
||||||
|
'datum' => $data['datum'],
|
||||||
|
'datum_bis' => $data['datum_bis'],
|
||||||
|
'updateamum' => $now,
|
||||||
|
'updatevon' => $uid
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (isError($newsResult))
|
||||||
|
{
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError(getError($newsResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingTranslationsResult = $this->ContentspracheModel->loadWhere([
|
||||||
|
'content_id' => $existingNews->content_id
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (isError($existingTranslationsResult))
|
||||||
|
{
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError(getError($existingTranslationsResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingTranslations = [];
|
||||||
|
|
||||||
|
foreach ((array)getData($existingTranslationsResult) as $existingTranslation)
|
||||||
|
{
|
||||||
|
$language = $existingTranslation->sprache;
|
||||||
|
|
||||||
|
if (
|
||||||
|
!isset($existingTranslations[$language])
|
||||||
|
|| (int)$existingTranslation->version > (int)$existingTranslations[$language]->version
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$existingTranslations[$language] = $existingTranslation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$submittedLanguages = array_column($data['translations'], 'sprache');
|
||||||
|
$this->db->where('content_id', $existingNews->content_id);
|
||||||
|
$this->db->where_not_in('sprache', $submittedLanguages);
|
||||||
|
|
||||||
|
if ($this->db->delete('campus.tbl_contentsprache') === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($data['translations'] as $translation)
|
||||||
|
{
|
||||||
|
$translation['content'] = $this->formatContentURLsToRelative($translation['content']);
|
||||||
|
$translationData = [
|
||||||
|
'sichtbar' => $translation['sichtbar'],
|
||||||
|
'content' => $translation['content'],
|
||||||
|
'titel' => $translation['betreff'],
|
||||||
|
'updateamum' => $now,
|
||||||
|
'updatevon' => $uid
|
||||||
|
];
|
||||||
|
|
||||||
|
$existingTranslation = $existingTranslations[$translation['sprache']] ?? null;
|
||||||
|
|
||||||
|
if ($existingTranslation)
|
||||||
|
{
|
||||||
|
$translationResult = $this->ContentspracheModel->update(
|
||||||
|
$existingTranslation->contentsprache_id,
|
||||||
|
$translationData
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$translationResult = $this->ContentspracheModel->insert([
|
||||||
|
'sprache' => $translation['sprache'],
|
||||||
|
'content_id' => $existingNews->content_id,
|
||||||
|
'version' => 1,
|
||||||
|
'insertamum' => $now,
|
||||||
|
'insertvon' => $uid
|
||||||
|
] + $translationData);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_getInsertedIdOrRollback($translationResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->db->trans_commit() === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($newsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes one news entry and its linked content.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleteNewsItem($newsId)
|
||||||
|
{
|
||||||
|
if (!is_numeric($newsId) || (int)$newsId < 1)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'newsId' => 'A valid news ID is required'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsId = (int)$newsId;
|
||||||
|
$newsResult = $this->NewsModel->load($newsId);
|
||||||
|
|
||||||
|
if (isError($newsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($newsResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasData($newsResult))
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'newsId' => 'The requested news entry does not exist'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$news = current(getData($newsResult));
|
||||||
|
|
||||||
|
|
||||||
|
$this->_ensureUserIsEntitledForDegreeProgram($news->studiengang_kz);
|
||||||
|
|
||||||
|
if ($this->db->trans_begin() === false)
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->db->error(), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsDeleteResult = $this->NewsModel->delete($newsId);
|
||||||
|
|
||||||
|
if (isError($newsDeleteResult))
|
||||||
|
{
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError(getError($newsDeleteResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->where('content_id', $news->content_id);
|
||||||
|
|
||||||
|
if ($this->db->delete('campus.tbl_contentsprache') === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$contentDeleteResult = $this->ContentModel->delete($news->content_id);
|
||||||
|
|
||||||
|
if (isError($contentDeleteResult))
|
||||||
|
{
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError(getError($contentDeleteResult), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->db->trans_status() === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->db->trans_commit() === false)
|
||||||
|
{
|
||||||
|
$error = $this->db->error();
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError($error, self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($newsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Private methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the requested Studiengang or reports a validation error.
|
||||||
|
*
|
||||||
|
* @param integer $studiengangKz
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
private function _getStudiengang($studiengangKz)
|
||||||
|
{
|
||||||
|
$result = $this->StudiengangModel->load($studiengangKz);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasData($result))
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors([
|
||||||
|
'studiengang_kz' => 'The requested Studiengang does not exist'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$studiengaenge = getData($result);
|
||||||
|
|
||||||
|
return current($studiengaenge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that all supplied languages exist in tbl_sprache.
|
||||||
|
*
|
||||||
|
* @param array $translations
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function _validateLanguages($translations)
|
||||||
|
{
|
||||||
|
$languages = [];
|
||||||
|
|
||||||
|
foreach ($translations as $translation)
|
||||||
|
{
|
||||||
|
$languages[] = $translation['sprache'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->SpracheModel->loadMultiple($languages);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
{
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingLanguages = [];
|
||||||
|
|
||||||
|
foreach ((array)getData($result) as $language)
|
||||||
|
{
|
||||||
|
$existingLanguages[$language->sprache] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$errors = [];
|
||||||
|
|
||||||
|
foreach ($translations as $index => $translation)
|
||||||
|
{
|
||||||
|
if (!isset($existingLanguages[$translation['sprache']]))
|
||||||
|
{
|
||||||
|
$errors['translations.' . $index . '.sprache'] = 'The requested language does not exist';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($errors) > 0)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors($errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _ensureUserIsEntitledForDegreeProgram($degreeProgramShortCode)
|
||||||
|
{
|
||||||
|
$entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news:w");
|
||||||
|
if (!is_array($entitledDegreePrograms))
|
||||||
|
{
|
||||||
|
$this->terminateWithError('Failed to retrieve entitled degree programs for the user', self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!in_array($degreeProgramShortCode, $entitledDegreePrograms)) {
|
||||||
|
$this->terminateWithError("User is not entitled for the specified degree program");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns an inserted identifier or rolls the transaction back on error.
|
||||||
|
*
|
||||||
|
* @param stdClass $result
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
private function _getInsertedIdOrRollback($result)
|
||||||
|
{
|
||||||
|
if (isError($result))
|
||||||
|
{
|
||||||
|
$this->db->trans_rollback();
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
return getData($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the XML format consumed by existing news readers.
|
||||||
|
*
|
||||||
|
* @param array $translation
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function _buildNewsXml($translation)
|
||||||
|
{
|
||||||
|
$document = new DOMDocument('1.0', 'UTF-8');
|
||||||
|
$news = $document->createElement('news');
|
||||||
|
$document->appendChild($news);
|
||||||
|
|
||||||
|
$this->_appendCdataElement($document, $news, 'verfasser', $translation['verfasser']);
|
||||||
|
$this->_appendCdataElement($document, $news, 'betreff', $translation['betreff']);
|
||||||
|
$this->_appendCdataElement($document, $news, 'text', $translation['text']);
|
||||||
|
|
||||||
|
return $document->saveXML($news);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a CDATA element and safely preserves CDATA terminators.
|
||||||
|
*
|
||||||
|
* @param DOMDocument $document
|
||||||
|
* @param DOMElement $parent
|
||||||
|
* @param string $name
|
||||||
|
* @param string $value
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function _appendCdataElement($document, $parent, $name, $value)
|
||||||
|
{
|
||||||
|
$element = $document->createElement($name);
|
||||||
|
$parts = explode(']]>', $value);
|
||||||
|
$lastIndex = count($parts) - 1;
|
||||||
|
|
||||||
|
foreach ($parts as $index => $part)
|
||||||
|
{
|
||||||
|
if ($index > 0)
|
||||||
|
{
|
||||||
|
$part = '>' . $part;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($index < $lastIndex)
|
||||||
|
{
|
||||||
|
$part .= ']]';
|
||||||
|
}
|
||||||
|
|
||||||
|
$element->appendChild($document->createCDATASection($part));
|
||||||
|
}
|
||||||
|
|
||||||
|
$parent->appendChild($element);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _sendNewsItemTranslationRequiredMail($newsItem)
|
||||||
|
{
|
||||||
|
$translatorsResult = $this->BenutzerfunktionModel->getBenutzerFunktionen("translate", $newsItem->studiengang_kz);
|
||||||
|
$translators = $this->getDataOrTerminateWithError($translatorsResult);
|
||||||
|
|
||||||
|
$newsItemContentResult = $this->ContentspracheModel->loadWhere([
|
||||||
|
'content_id' => $newsItem->content_id,
|
||||||
|
'sprache' => 'German'
|
||||||
|
]);
|
||||||
|
$newsItemContentEntry = getData($newsItemContentResult)[0] ?? null;
|
||||||
|
if ($newsItemContentEntry) {
|
||||||
|
$newsItem->sichtbar = $newsItemContentEntry->sichtbar ?? false;
|
||||||
|
$newsItem->content = $newsItemContentEntry->content;
|
||||||
|
}
|
||||||
|
$content = getData(
|
||||||
|
$this->cmslib->createNewsContent(
|
||||||
|
$this->cmslib->createNewsWrapper($newsItem, true),
|
||||||
|
false,
|
||||||
|
""
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($translators as $translator) {
|
||||||
|
sendSanchoMail(
|
||||||
|
"Sancho_Mail_News_Translation_Req",
|
||||||
|
[
|
||||||
|
"newsItemUrl" => APP_ROOT . "cis.php/CisVue/Cms/newsAdministration?newsId=" . $newsItem->news_id,
|
||||||
|
"newsItemAuthor" => $newsItem->verfasser,
|
||||||
|
"newsItemSubject" => $newsItem->betreff,
|
||||||
|
"newsItemContent" => $content
|
||||||
|
],
|
||||||
|
$translator->uid . "@" . DOMAIN,
|
||||||
|
"Übersetzung erforderlich / Translation required"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function formatContentURLsToRelative($content)
|
||||||
|
{
|
||||||
|
$content = preg_replace(
|
||||||
|
'#https?://[^"\'>\s]*/(dms\.php(?:\?[^"\'>\s]*)?)#i',
|
||||||
|
'$1',
|
||||||
|
$content
|
||||||
|
);
|
||||||
|
|
||||||
|
$content = preg_replace(
|
||||||
|
'#(?:\.\./)+[^"\'>\s]*/(dms\.php(?:\?[^"\'>\s]*)?)#i',
|
||||||
|
'$1',
|
||||||
|
$content
|
||||||
|
);
|
||||||
|
|
||||||
|
$content = preg_replace(
|
||||||
|
'#/[^"\'>\s]*/(dms\.php(?:\?[^"\'>\s]*)?)#i',
|
||||||
|
'$1',
|
||||||
|
$content
|
||||||
|
);
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -36,7 +36,8 @@ class Ort extends FHCAPI_Controller
|
|||||||
'ContentID' => self::PERM_LOGGED,
|
'ContentID' => self::PERM_LOGGED,
|
||||||
'getOrtKurzbzContent' => self::PERM_LOGGED,
|
'getOrtKurzbzContent' => self::PERM_LOGGED,
|
||||||
'getRooms' => self::PERM_LOGGED,
|
'getRooms' => self::PERM_LOGGED,
|
||||||
'getTypes' => self::PERM_LOGGED
|
'getTypes' => self::PERM_LOGGED,
|
||||||
|
'getRoomInfo' => self::PERM_LOGGED
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||||
@@ -74,6 +75,8 @@ class Ort extends FHCAPI_Controller
|
|||||||
$vonStunde = getData($this->StundeModel->getStundeForTime($von))[0]->stunde;
|
$vonStunde = getData($this->StundeModel->getStundeForTime($von))[0]->stunde;
|
||||||
$bisStunde = getData($this->StundeModel->getStundeForTime($bis))[0]->stunde;
|
$bisStunde = getData($this->StundeModel->getStundeForTime($bis))[0]->stunde;
|
||||||
|
|
||||||
|
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||||
|
|
||||||
$params = array();
|
$params = array();
|
||||||
$qry = "SELECT DISTINCT tbl_ort.*
|
$qry = "SELECT DISTINCT tbl_ort.*
|
||||||
FROM public.tbl_ort JOIN public.tbl_ortraumtyp USING(ort_kurzbz)
|
FROM public.tbl_ort JOIN public.tbl_ortraumtyp USING(ort_kurzbz)
|
||||||
@@ -174,5 +177,16 @@ class Ort extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess($content);
|
$this->terminateWithSuccess($content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRoomInfo()
|
||||||
|
{
|
||||||
|
$ortKurzbz = $this->input->get("ortKurzbz");
|
||||||
|
|
||||||
|
$roomResult = $this->OrtModel->getRoomInfo($ortKurzbz);
|
||||||
|
$roomData = $this->getDataOrTerminateWithError($roomResult);
|
||||||
|
$room = count($roomData) ? $roomData[0] : null;
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($room);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2024 fhcomplete.org
|
* Copyright (C) 2026 fhcomplete.org
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2026 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');
|
||||||
|
|
||||||
|
class Permission extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getPermissions' => self::PERM_LOGGED,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* retrieves permissions for auth user
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public function getPermissions()
|
||||||
|
{
|
||||||
|
$permissionsParam = $this->input->post("permissions");
|
||||||
|
if (!$permissionsParam || !is_array($permissionsParam)) {
|
||||||
|
$this->terminateWithError("Invalid parameter!");
|
||||||
|
}
|
||||||
|
|
||||||
|
$permissions = [];
|
||||||
|
foreach ($permissionsParam as $permission) {
|
||||||
|
$permissions[$permission] = $this->permissionlib->isBerechtigt($permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($permissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Private methods
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2024 fhcomplete.org
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Reservierung extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getMyReservation' => 'basis/cis:r',
|
||||||
|
'deleteReservation' => 'lehre/reservierung:rw'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all reservations from lehre.vw_reservation of the logged in user
|
||||||
|
*/
|
||||||
|
public function getMyReservation()
|
||||||
|
{
|
||||||
|
$result = $this->ReservierungModel->getMyReservation();
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deletes a reservation by ID
|
||||||
|
*/
|
||||||
|
public function deleteReservation()
|
||||||
|
{
|
||||||
|
$reservierung_id = $this->input->post('reservierung_id');
|
||||||
|
|
||||||
|
|
||||||
|
if ($reservierung_id === NULL || trim((string)$reservierung_id) === '') {
|
||||||
|
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->ReservierungModel->deleteReservation($reservierung_id);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ class Studgang extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getStudiengangInfo'=> self::PERM_LOGGED,
|
'getStudiengangInfo'=> self::PERM_LOGGED,
|
||||||
|
'getDegreePrograms'=> self::PERM_LOGGED,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||||
@@ -43,15 +43,46 @@ class Studgang extends FHCAPI_Controller
|
|||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
public function getStudiengangInfo(){
|
public function getDegreePrograms() {
|
||||||
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
|
$entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news");
|
||||||
$isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter);
|
if (!$entitledDegreePrograms) {
|
||||||
if($isMitarbeiter) {
|
$this->terminateWithError("User is not entitled for any degree program");
|
||||||
$this->terminateWithSuccess(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$activeDegreePrograms = $this->StudiengangModel->getDegreePrograms();
|
||||||
|
$activeDegreePrograms= $this->getDataOrTerminateWithError($activeDegreePrograms);
|
||||||
|
|
||||||
|
$activeDegreePrograms = array_values(array_filter($activeDegreePrograms, function($degreeProgram) use ($entitledDegreePrograms) {
|
||||||
|
return in_array($degreeProgram->studiengang_kz, $entitledDegreePrograms);
|
||||||
|
}));
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($activeDegreePrograms);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStudiengangInfo(){
|
||||||
|
$studiengang_kz = $this->input->get('studiengang_kz', true);
|
||||||
|
$semester = $this->input->get('semester', true);
|
||||||
|
|
||||||
|
// without a Studiengang the info of the logged in Student is returned
|
||||||
|
if (!is_numeric($studiengang_kz))
|
||||||
|
{
|
||||||
|
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
|
||||||
|
$isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter);
|
||||||
|
if($isMitarbeiter) {
|
||||||
|
$this->terminateWithSuccess(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
$studiengang_kz = null;
|
||||||
|
$semester = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$studiengang_kz = (int)$studiengang_kz;
|
||||||
|
$semester = is_numeric($semester) ? (int)$semester : null;
|
||||||
|
}
|
||||||
|
|
||||||
// fetches the Studiengang Information which is used next to the news
|
// fetches the Studiengang Information which is used next to the news
|
||||||
$studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews();
|
$studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews($studiengang_kz, $semester);
|
||||||
$studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo);
|
$studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo);
|
||||||
$this->terminateWithSuccess($studiengangInfo);
|
$this->terminateWithSuccess($studiengangInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2024 fhcomplete.org
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
class Studiensemester extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
private $_ci;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getStudiensemester'=> self::PERM_LOGGED,
|
||||||
|
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
|
||||||
|
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET METHOD
|
||||||
|
* returns List of all studiensemester as well as current one
|
||||||
|
*/
|
||||||
|
public function getStudiensemester()
|
||||||
|
{
|
||||||
|
$this->_ci->StudiensemesterModel->addOrder("start", "DESC");
|
||||||
|
$result = $this->_ci->StudiensemesterModel->load();
|
||||||
|
|
||||||
|
$studiensemester = getData($result);
|
||||||
|
$result = $this->_ci->StudiensemesterModel->getAkt();
|
||||||
|
$aktuell = getData($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess(array($studiensemester, $aktuell));
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Private methods
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2026 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');
|
||||||
|
|
||||||
|
class StudstatusAntraege extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getTodos' => self::PERM_LOGGED
|
||||||
|
]);
|
||||||
|
|
||||||
|
//load models
|
||||||
|
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
|
||||||
|
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets all todos of antraegen of the user with stg leitungsfunction
|
||||||
|
* or list of open antraege for user with assistance function
|
||||||
|
* @access public
|
||||||
|
* @return array || []
|
||||||
|
*/
|
||||||
|
public function getTodos()
|
||||||
|
{
|
||||||
|
$uid = getAuthUID();
|
||||||
|
|
||||||
|
//at first get studiengang with leitungsfunktion
|
||||||
|
$result = $this->BenutzerfunktionModel->getSTGLByUID($uid);
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
$funktionen = getData($result);
|
||||||
|
|
||||||
|
$studiengaenge = [];
|
||||||
|
|
||||||
|
foreach ($funktionen as $funktion) {
|
||||||
|
$studiengaenge[] = $funktion->studiengang_kz;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dataAntrage = [];
|
||||||
|
|
||||||
|
$result = $this->StudierendenantragModel->getOpenAntraegeForStgl($studiengaenge);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$dataAntrage[] = getData($result) ?: [];
|
||||||
|
$statusRole = 1;
|
||||||
|
|
||||||
|
$this->terminateWithSuccess([count($dataAntrage) > 0 ? $dataAntrage[0] : $dataAntrage, $statusRole]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO delete after check if needed or not
|
||||||
|
//get studiengaenge of assistance (regarding benutzerfunktion)
|
||||||
|
//$result = $this->BenutzerfunktionModel->getSTGAssByUID($uid);
|
||||||
|
/* if(hasData($result)) {
|
||||||
|
$statusRole = 2;
|
||||||
|
$funktionen = getData($result);
|
||||||
|
|
||||||
|
$studiengaenge = [];
|
||||||
|
|
||||||
|
foreach ($funktionen as $funktion) {
|
||||||
|
$studiengaenge[] = $funktion->studiengang_kz;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ci->addMeta('stgAss', $studiengaenge);
|
||||||
|
$dataAntrage = [];
|
||||||
|
|
||||||
|
foreach ($studiengaenge as $studiengang)
|
||||||
|
{
|
||||||
|
$result = $this->StudierendenantragModel->getOpenAntraegeForAss($studiengang);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
if(hasData($result)) {
|
||||||
|
$dataAntrage[] = getData($result);
|
||||||
|
$statusRole = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$statusRole = 0;
|
||||||
|
$dataAntrage = [];
|
||||||
|
//$this->terminateWithSuccess([[], $statusRole]);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
//get studiengaenge of assistance (regarding rights)
|
||||||
|
$stgAss = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
|
||||||
|
if(!is_array($stgAss))
|
||||||
|
{
|
||||||
|
$statusRole = 0;
|
||||||
|
$this->terminateWithSuccess([[], $statusRole]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$statusRole = 2;
|
||||||
|
$studiengaenge = [];
|
||||||
|
|
||||||
|
foreach ($stgAss as $stg) {
|
||||||
|
$studiengaenge[] = (int) $stg;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dataAntrage = [];
|
||||||
|
$result = $this->StudierendenantragModel->getOpenAntraegeForAss($studiengaenge);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
if(hasData($result)) {
|
||||||
|
$dataAntrage[] = getData($result);
|
||||||
|
$statusRole = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess([count($dataAntrage) > 0 ? $dataAntrage[0] : $dataAntrage, $statusRole]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,367 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Zeitsperren extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getZeitsperrenUser' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'getTypenZeitsperren' => self::PERM_LOGGED,
|
||||||
|
'getTypenErreichbarkeit' => self::PERM_LOGGED,
|
||||||
|
'getStunden' => self::PERM_LOGGED,
|
||||||
|
'loadZeitsperre' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'add' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'update' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
'delete' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Load Libraries
|
||||||
|
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||||
|
$this->load->library('form_validation');
|
||||||
|
|
||||||
|
// Load language phrases
|
||||||
|
$this->loadPhrases([
|
||||||
|
'ui',
|
||||||
|
'person',
|
||||||
|
'zeitsperren'
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Load models
|
||||||
|
$this->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
|
||||||
|
$this->load->model('ressource/Zeitsperretyp_model', 'ZeitsperretypModel');
|
||||||
|
$this->load->model('ressource/Erreichbarkeit_model', 'ErreichbarkeitModel');
|
||||||
|
$this->load->model('ressource/Stunde_model', 'StundeModel');
|
||||||
|
$this->load->model('ressource/Zeitaufzeichnung_model', 'ZeitaufzeichnungModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZeitsperrenUser($uid)
|
||||||
|
{
|
||||||
|
//check if $uid is passedUser
|
||||||
|
$loggedInUser = getAuthUID();
|
||||||
|
if($loggedInUser != $uid) {
|
||||||
|
$this->load->library('PermissionLib');
|
||||||
|
$isAdmin = $this->permissionlib->isBerechtigt('admin');
|
||||||
|
if(!$isAdmin) {
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'noAdmin'), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->ZeitsperreModel->getZeitsperrenUser($uid);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTypenZeitsperren()
|
||||||
|
{
|
||||||
|
$excludedTypes = array('ZVerfueg');
|
||||||
|
$result = $this->ZeitsperretypModel->getTypenZeitsperren($excludedTypes);
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTypenErreichbarkeit()
|
||||||
|
{
|
||||||
|
$result = $this->ErreichbarkeitModel->load();
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStunden()
|
||||||
|
{
|
||||||
|
$this->StundeModel->addOrder('stunde', 'ASC');
|
||||||
|
$result = $this->StundeModel->load();
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadZeitsperre($zeitsperre_id)
|
||||||
|
{
|
||||||
|
$this->ZeitsperreModel->addSelect(
|
||||||
|
'campus.tbl_zeitsperre.*, typ.*,
|
||||||
|
ma.person_id AS ma_person_id, ma.vorname AS ma_vorname, ma.nachname AS ma_nachname,
|
||||||
|
ma.titelpre AS ma_titelpre, ma.titelpost AS ma_titelpost'
|
||||||
|
);
|
||||||
|
$this->ZeitsperreModel->addJoin('campus.tbl_zeitsperretyp typ', 'ON (typ.zeitsperretyp_kurzbz = campus.tbl_zeitsperre.zeitsperretyp_kurzbz)');
|
||||||
|
$this->ZeitsperreModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = campus.tbl_zeitsperre.vertretung_uid)', 'LEFT');
|
||||||
|
$this->ZeitsperreModel->addJoin('public.tbl_person ma', 'ON (ma.person_id = ben.person_id)', 'LEFT');
|
||||||
|
$result = $this->ZeitsperreModel->loadWhere(
|
||||||
|
array('zeitsperre_id' => $zeitsperre_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->terminateWithSuccess((current(getData($result)) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function add($mitarbeiter_uid)
|
||||||
|
{
|
||||||
|
$loggedInUser = getAuthUID();
|
||||||
|
|
||||||
|
if($mitarbeiter_uid != $loggedInUser)
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'noPermission'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$this->form_validation->set_rules('zeitsperretyp_kurzbz', 'Grund Zeitsperre', 'required', [
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Grund Zeitsperre'])
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->form_validation->set_rules('vondatum', 'VonDatum', 'required|is_valid_date', [
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'VonDatum']),
|
||||||
|
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->form_validation->set_rules('bisdatum', 'BisDatum', 'required|is_valid_date|callback_check_von_bis_datum|callback_check_diff_intval', [
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'BisDatum']),
|
||||||
|
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'BisDatum']),
|
||||||
|
'check_von_bis_datum' => $this->p->t('zeitsperre', 'error_VonDatumGroesserAlsBisDatum'),
|
||||||
|
'check_diff_intval' => $this->p->t('zeitsperre', 'error_zeitraumAuffallendHoch')
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($this->form_validation->run() == false)
|
||||||
|
{
|
||||||
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
}
|
||||||
|
|
||||||
|
$bezeichnung = $this->input->post('bezeichnung');
|
||||||
|
$vondatum = $this->input->post('vondatum');
|
||||||
|
$vonstunde = $this->input->post('vonstunde');
|
||||||
|
$bisdatum = $this->input->post('bisdatum');
|
||||||
|
$bisstunde = $this->input->post('bisstunde');
|
||||||
|
//$vonIso = $this->input->post('vonISO'); //Timestamp für Stunde
|
||||||
|
//$bisIso = $this->input->post('bisISO'); //Timestamp für Stunde
|
||||||
|
$erreichbarkeit_kurzbz = $this->input->post('erreichbarkeit_kurzbz');
|
||||||
|
$vertretung_uid = $this->input->post('vertretung_uid');
|
||||||
|
$zeitsperretyp_kurzbz = $this->input->post('zeitsperretyp_kurzbz');
|
||||||
|
|
||||||
|
//check if existing zeitsperre
|
||||||
|
$result = $this->ZeitsperreModel->getSperreByDate($mitarbeiter_uid, $vondatum, $vonstunde, true);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->p->t('zeitsperren', 'error_existingZeitsperre', ['typ'=> current($data)->zeitsperretyp_kurzbz]), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if existing zeitaufzeichnung
|
||||||
|
if(in_array($zeitsperretyp_kurzbz, Zeitsperre_model::BLOCKIERENDE_ZEITSPERREN))
|
||||||
|
{
|
||||||
|
$result = $this->ZeitsperreModel->existsZeitaufzeichnung($mitarbeiter_uid, $vondatum, $bisdatum);
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
$this->terminateWithError($this->p->t('zeitsperren', 'error_existingZeitaufzeichnung'), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->ZeitsperreModel->insert(
|
||||||
|
[
|
||||||
|
'mitarbeiter_uid' => $mitarbeiter_uid,
|
||||||
|
'bezeichnung' => $bezeichnung,
|
||||||
|
'vondatum' => $vondatum,
|
||||||
|
'vonstunde' => $vonstunde,
|
||||||
|
'bisdatum' => $bisdatum,
|
||||||
|
'bisstunde' => $bisstunde,
|
||||||
|
'erreichbarkeit_kurzbz' => $erreichbarkeit_kurzbz,
|
||||||
|
'zeitsperretyp_kurzbz' => $zeitsperretyp_kurzbz,
|
||||||
|
'vertretung_uid' => $vertretung_uid,
|
||||||
|
'insertvon' => $loggedInUser,
|
||||||
|
'insertamum' => date('c'),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update($zeitsperre_id)
|
||||||
|
{
|
||||||
|
//check if loggedin User is owner of the zeitsperre
|
||||||
|
$loggedInUser = getAuthUID();
|
||||||
|
$result = $this->ZeitsperreModel->load($zeitsperre_id);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$uid = current($data)->mitarbeiter_uid;
|
||||||
|
|
||||||
|
if($uid != $loggedInUser)
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'noPermission'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
if(!$zeitsperre_id)
|
||||||
|
{
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Zeitsperre_id']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
//get current params
|
||||||
|
$array_update = [
|
||||||
|
'bezeichnung',
|
||||||
|
'vondatum',
|
||||||
|
'vonstunde',
|
||||||
|
'bisdatum',
|
||||||
|
'bisstunde',
|
||||||
|
// 'vonISO', //Timestamp für Stunde
|
||||||
|
// 'bisISO', //Timestamp für Stunde
|
||||||
|
'erreichbarkeit_kurzbz',
|
||||||
|
'vertretung_uid',
|
||||||
|
'zeitsperretyp_kurzbz',
|
||||||
|
'mitarbeiter_uid',
|
||||||
|
];
|
||||||
|
$post = $this->input->post();
|
||||||
|
$update = [];
|
||||||
|
|
||||||
|
foreach ($array_update as $prop)
|
||||||
|
{
|
||||||
|
if (array_key_exists($prop, $post))
|
||||||
|
{
|
||||||
|
$update[$prop] = $post[$prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validation
|
||||||
|
$rulesDefined = false; //necessary, otherwise CI validation will always be triggered, even without rules
|
||||||
|
foreach ($update as $key => $val) {
|
||||||
|
switch ($key) {
|
||||||
|
case 'zeitsperretyp_kurzbz':
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
$key,
|
||||||
|
'Grund Zeitsperre',
|
||||||
|
'required',
|
||||||
|
['required' => $this->p->t('ui', 'error_fieldRequired', ['field'=>'Grund Zeitsperre'])]
|
||||||
|
);
|
||||||
|
$rulesDefined = true;
|
||||||
|
break;
|
||||||
|
case 'vondatum':
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
$key,
|
||||||
|
'VonDatum',
|
||||||
|
'required|is_valid_date',
|
||||||
|
[
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field'=>'VonDatum']),
|
||||||
|
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field'=>'VonDatum'])
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$rulesDefined = true;
|
||||||
|
break;
|
||||||
|
case 'bisdatum':
|
||||||
|
$rules = 'required|is_valid_date';
|
||||||
|
if (array_key_exists('vondatum', $update)) {
|
||||||
|
$rules .= '|callback_check_von_bis_datum|callback_check_diff_intval';
|
||||||
|
}
|
||||||
|
$this->form_validation->set_rules(
|
||||||
|
$key,
|
||||||
|
'BisDatum',
|
||||||
|
$rules,
|
||||||
|
[
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field'=>'BisDatum']),
|
||||||
|
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field'=>'BisDatum']),
|
||||||
|
'check_von_bis_datum' => $this->p->t('zeitsperre', 'error_VonDatumGroesserAlsBisDatum'),
|
||||||
|
'check_diff_intval' => $this->p->t('zeitsperre', 'error_zeitraumAuffallendHoch')
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$rulesDefined = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($rulesDefined && $this->form_validation->run() == false) {
|
||||||
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(array_key_exists('vondatum', $post) || array_key_exists('bisdatum', $post))
|
||||||
|
{
|
||||||
|
$result = $this->ZeitsperreModel->load($zeitsperre_id);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$data = current($data);
|
||||||
|
|
||||||
|
$mitarbeiter_uid = array_key_exists('mitarbeiter_uid', $post) ? $update['mitarbeiter_uid'] : $data->mitarbeiter_uid;
|
||||||
|
$vondatum = array_key_exists('vondatum', $post) ? $update['vondatum'] : $data->vondatum;
|
||||||
|
$bisdatum = array_key_exists('bisdatum', $post) ? $update['bisdatum'] : $data->bisdatum;
|
||||||
|
$vonstunde = array_key_exists('vonstunde', $post) ? $update['vonstunde'] : $data->vonstunde;
|
||||||
|
$zeitsperretyp_kurzbz = array_key_exists('zeitsperretyp_kurzbz', $post) ? $update['zeitsperretyp_kurzbz'] : $data->zeitsperretyp_kurzbz;
|
||||||
|
|
||||||
|
$result = $this->ZeitsperreModel->getSperreByDate($mitarbeiter_uid, $vondatum, $vonstunde, true);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->p->t('zeitsperren', 'error_existingZeitsperre', ['typ'=> current($data)->zeitsperretyp_kurzbz]), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if existing zeitaufzeichnung
|
||||||
|
if(in_array($zeitsperretyp_kurzbz, Zeitsperre_model::BLOCKIERENDE_ZEITSPERREN))
|
||||||
|
{
|
||||||
|
$result = $this->ZeitsperreModel->existsZeitaufzeichnung($mitarbeiter_uid, $vondatum, $bisdatum);
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
$this->terminateWithError($this->p->t('zeitsperren', 'error_existingZeitaufzeichnung'), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($update)) {
|
||||||
|
$update['updatevon'] = $loggedInUser;
|
||||||
|
$update['updateamum'] = date('c');
|
||||||
|
$result = $this->ZeitsperreModel->update($zeitsperre_id, $update);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$this->terminateWithSuccess("no update");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete($zeitsperre_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!is_numeric($zeitsperre_id) || (int)$zeitsperre_id <= 0)
|
||||||
|
{
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Zeitsperre_id']), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if loggedin User is owner of the zeitsperre
|
||||||
|
$loggedInUser = getAuthUID();
|
||||||
|
$result = $this->ZeitsperreModel->load($zeitsperre_id);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$uid = current($data)->mitarbeiter_uid;
|
||||||
|
|
||||||
|
if($uid != $loggedInUser)
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'noPermission'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$result = $this->ZeitsperreModel->delete(
|
||||||
|
array('zeitsperre_id' => $zeitsperre_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_von_bis_datum($bisdatum)
|
||||||
|
{
|
||||||
|
$vondatum = $this->input->post('vondatum');
|
||||||
|
|
||||||
|
return $vondatum <= $bisdatum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_diff_intval($bisdatum)
|
||||||
|
{
|
||||||
|
$vondatum = $this->input->post('vondatum');
|
||||||
|
|
||||||
|
// Intervall in days
|
||||||
|
$vonTs = strtotime($vondatum);
|
||||||
|
$bisTs = strtotime($bisdatum);
|
||||||
|
|
||||||
|
$tage = ($bisTs - $vonTs) / 86400;
|
||||||
|
|
||||||
|
// if intervall > 14
|
||||||
|
return $tage <= 14;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,276 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2024 fhcomplete.org
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!defined('BASEPATH'))
|
||||||
|
exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class RoomPlan extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'addRoomReservation' => self::PERM_LOGGED,
|
||||||
|
'deleteRoomReservation' => self::PERM_LOGGED,
|
||||||
|
'getRoomCreationInfo' => self::PERM_LOGGED,
|
||||||
|
'getGruppen' => self::PERM_LOGGED,
|
||||||
|
'getLektor' => self::PERM_LOGGED,
|
||||||
|
'getReservableMap' => self::PERM_LOGGED,
|
||||||
|
'getGroupOptions' => self::PERM_LOGGED,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->load->library('LogLib');
|
||||||
|
$this->loglib->setConfigs(array(
|
||||||
|
'classIndex' => 5,
|
||||||
|
'functionIndex' => 5,
|
||||||
|
'lineIndex' => 4,
|
||||||
|
'dbLogType' => 'API',
|
||||||
|
'dbExecuteUser' => 'RESTful API'
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->load->library('form_validation');
|
||||||
|
$this->load->library('PermissionLib');
|
||||||
|
$this->load->library('StundenplanLib');
|
||||||
|
|
||||||
|
$this->loadPhrases(['ui']);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public function addRoomReservation()
|
||||||
|
{
|
||||||
|
$this->form_validation->set_rules('selectedStart', "Start", "required");
|
||||||
|
$this->form_validation->set_rules('selectedEnd', "End", "required");
|
||||||
|
$this->form_validation->set_rules('title', "Title", "required|max_length[10]");
|
||||||
|
$this->form_validation->set_rules('beschreibung', "Beschreibung", "required|max_length[32]");
|
||||||
|
$this->form_validation->set_rules('ort_kurzbz', "Ort", "required|max_length[16]");
|
||||||
|
$this->form_validation->set_rules('studiengang', 'Studiengang', 'numeric');
|
||||||
|
$this->form_validation->set_rules('semester', 'Semester', 'integer|greater_than_equal_to[0]');
|
||||||
|
$this->form_validation->set_rules('verband', 'Verband', 'trim');
|
||||||
|
$this->form_validation->set_rules('gruppe', 'Gruppe', 'trim');
|
||||||
|
$this->form_validation->set_rules('spezialgruppe', 'Spezialgruppe', 'max_length[32]');
|
||||||
|
$this->form_validation->set_rules('lektoren', 'Lektoren');
|
||||||
|
|
||||||
|
if (!$this->form_validation->run())
|
||||||
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
|
||||||
|
$start = $this->input->post('selectedStart');
|
||||||
|
$end = $this->input->post('selectedEnd');
|
||||||
|
$title = $this->input->post('title');
|
||||||
|
$beschreibung = $this->input->post('beschreibung');
|
||||||
|
$ort_kurzbz = $this->input->post('ort_kurzbz');
|
||||||
|
|
||||||
|
$studiengang_kz = $this->input->post('studiengang');
|
||||||
|
$semester = $this->input->post('semester');
|
||||||
|
$verband = $this->input->post('verband');
|
||||||
|
$gruppe = $this->input->post('gruppe');
|
||||||
|
$spezialgruppe = $this->input->post('spezialgruppe');
|
||||||
|
$lektoren = $this->input->post('lektoren');
|
||||||
|
|
||||||
|
|
||||||
|
$result = $this->stundenplanlib->addReservation($start, $end, $title, $beschreibung, $ort_kurzbz, $lektoren, $studiengang_kz, $semester, $verband, $gruppe, $spezialgruppe);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
$this->terminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteRoomReservation()
|
||||||
|
{
|
||||||
|
$reservierung_id = $this->input->post('reservierung_id');
|
||||||
|
|
||||||
|
$result = $this->stundenplanlib->deleteReservation($reservierung_id);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
$this->terminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRoomCreationInfo()
|
||||||
|
{
|
||||||
|
$return_array = array('berechtigt' => false, 'studiengaenge' => []);
|
||||||
|
if (!$this->permissionlib->isBerechtigt('lehre/reservierung'))
|
||||||
|
$this->terminateWithSuccess($return_array);
|
||||||
|
|
||||||
|
$stg_berechtigungen = $this->permissionlib->getSTG_isEntitledFor('lehre/reservierung');
|
||||||
|
if (isEmptyArray($stg_berechtigungen))
|
||||||
|
$this->terminateWithSuccess($return_array);
|
||||||
|
|
||||||
|
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||||
|
$this->StudiengangModel->addSelect('studiengang_kz, UPPER(CONCAT(typ, kurzbz)) as kuerzel, kurzbzlang');
|
||||||
|
$this->StudiengangModel->addOrder('typ, kurzbz');
|
||||||
|
$this->StudiengangModel->db->where_in('studiengang_kz', $stg_berechtigungen);
|
||||||
|
$studiengaenge = $this->StudiengangModel->loadWhere(array('aktiv' => true));
|
||||||
|
|
||||||
|
if (isError($studiengaenge))
|
||||||
|
$this->terminateWithError($studiengaenge);
|
||||||
|
|
||||||
|
$return_array['studiengaenge'] = hasData($studiengaenge) ? getData($studiengaenge) : [];
|
||||||
|
$return_array['berechtigt'] = true;
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($return_array);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getGruppen()
|
||||||
|
{
|
||||||
|
$query = $this->input->get('query');
|
||||||
|
if (is_null($query))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$stg_berechtigungen = $this->permissionlib->getSTG_isEntitledFor('lehre/reservierung');
|
||||||
|
|
||||||
|
if (isEmptyArray($stg_berechtigungen))
|
||||||
|
$this->terminateWithSuccess([]);
|
||||||
|
|
||||||
|
$this->load->model('organisation/gruppe_model', 'GruppeModel');
|
||||||
|
|
||||||
|
$query_words = explode(' ', urldecode($query));
|
||||||
|
|
||||||
|
$this->GruppeModel->addOrder('gruppe_kurzbz');
|
||||||
|
$this->GruppeModel->db->group_start();
|
||||||
|
foreach ($query_words as $word) {
|
||||||
|
$this->GruppeModel->db->group_start();
|
||||||
|
$this->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%");
|
||||||
|
$this->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%");
|
||||||
|
$this->GruppeModel->db->or_where('beschreibung ILIKE', "%" . $word . "%");
|
||||||
|
$this->GruppeModel->db->or_where('orgform_kurzbz ILIKE', "%" . $word . "%");
|
||||||
|
|
||||||
|
if (is_numeric($word)) {
|
||||||
|
$this->GruppeModel->db->or_where('studiengang_kz', $word);
|
||||||
|
}
|
||||||
|
$this->GruppeModel->db->group_end();
|
||||||
|
}
|
||||||
|
$this->GruppeModel->db->group_end();
|
||||||
|
$this->GruppeModel->db->where_in('studiengang_kz', $stg_berechtigungen);
|
||||||
|
$gruppen = $this->GruppeModel->loadWhere(array('sichtbar' => true, 'lehre' => true));
|
||||||
|
if (isError($gruppen))
|
||||||
|
$this->terminateWithError($gruppen);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : []);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLektor()
|
||||||
|
{
|
||||||
|
|
||||||
|
$query = $this->input->get('query');
|
||||||
|
if (is_null($query))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$stg_berechtigungen = $this->permissionlib->getSTG_isEntitledFor('lehre/reservierung');
|
||||||
|
|
||||||
|
if (isEmptyArray($stg_berechtigungen))
|
||||||
|
$this->terminateWithSuccess([]);
|
||||||
|
|
||||||
|
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
|
||||||
|
$query_words = explode(' ', urldecode($query));
|
||||||
|
|
||||||
|
$this->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname');
|
||||||
|
$this->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
|
||||||
|
$this->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
|
||||||
|
$this->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true);
|
||||||
|
$this->MitarbeiterModel->db->group_start();
|
||||||
|
foreach ($query_words as $word) {
|
||||||
|
$this->MitarbeiterModel->db->group_start();
|
||||||
|
$this->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
|
||||||
|
$this->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
|
||||||
|
$this->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%");
|
||||||
|
$this->MitarbeiterModel->db->group_end();
|
||||||
|
}
|
||||||
|
$this->MitarbeiterModel->db->group_end();
|
||||||
|
|
||||||
|
$this->MitarbeiterModel->addOrder('nachname');
|
||||||
|
$this->MitarbeiterModel->addOrder('vorname');
|
||||||
|
$mitarbeiter = $this->MitarbeiterModel->load();
|
||||||
|
if (isError($mitarbeiter))
|
||||||
|
$this->terminateWithError($mitarbeiter);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess(hasData($mitarbeiter) ? getData($mitarbeiter) : []);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getReservableMap($ort_kurzbz = null)
|
||||||
|
{
|
||||||
|
$this->form_validation->set_rules('start_date', "StartDate", "required");
|
||||||
|
$this->form_validation->set_rules('end_date', "EndDate", "required");
|
||||||
|
|
||||||
|
if (!$this->form_validation->run())
|
||||||
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
|
||||||
|
// storing the post parameter in local variables
|
||||||
|
$start_date = $this->input->post('start_date', true);
|
||||||
|
$end_date = $this->input->post('end_date', true);
|
||||||
|
|
||||||
|
$result = $this->stundenplanlib->getReservableMap($ort_kurzbz, $start_date, $end_date);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess(array('reservierbarMap' => hasData($result) ? getData($result) : []));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getGroupOptions()
|
||||||
|
{
|
||||||
|
$studiengangKz = $this->input->get('studiengangKz');
|
||||||
|
|
||||||
|
$this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
|
||||||
|
$this->LehrverbandModel->addSelect('semester, verband, gruppe');
|
||||||
|
$this->LehrverbandModel->db->where('aktiv', true);
|
||||||
|
$this->LehrverbandModel->db->where('studiengang_kz', $studiengangKz);
|
||||||
|
$lehrverbandResult = $this->LehrverbandModel->load();
|
||||||
|
|
||||||
|
if (isError($lehrverbandResult))
|
||||||
|
$this->terminateWithError($lehrverbandResult);
|
||||||
|
|
||||||
|
$lehrverbanden = hasData($lehrverbandResult) ? getData($lehrverbandResult) : [];
|
||||||
|
|
||||||
|
$grouppedValues = [];
|
||||||
|
foreach ($lehrverbanden as $lehrverband) {
|
||||||
|
if (isset($grouppedValues[$lehrverband->semester]) && $lehrverband->verband !== ' ') {
|
||||||
|
$grouppedValues[$lehrverband->semester][] = $lehrverband;
|
||||||
|
} else if (!isset($grouppedValues[$lehrverband->semester]) && $lehrverband->verband !== ' ') {
|
||||||
|
$grouppedValues[$lehrverband->semester] = [$lehrverband];
|
||||||
|
} else if (!isset($grouppedValues[$lehrverband->semester])) {
|
||||||
|
$grouppedValues[$lehrverband->semester] = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$grouppedValues = array_map(
|
||||||
|
function ($semester) {
|
||||||
|
$verbandGruppen = [];
|
||||||
|
foreach ($semester as $lehrverband) {
|
||||||
|
if (isset($verbandGruppen[$lehrverband->verband]) && $lehrverband->gruppe !== ' ') {
|
||||||
|
$verbandGruppen[$lehrverband->verband][] = $lehrverband->gruppe;
|
||||||
|
} else if (!isset($verbandGruppen[$lehrverband->verband]) && $lehrverband->gruppe !== ' ') {
|
||||||
|
$verbandGruppen[$lehrverband->verband] = [$lehrverband->gruppe];
|
||||||
|
} else if (!isset($verbandGruppen[$lehrverband->verband])) {
|
||||||
|
$verbandGruppen[$lehrverband->verband] = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $verbandGruppen;
|
||||||
|
},
|
||||||
|
$grouppedValues
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($grouppedValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -101,6 +101,9 @@ class Widget extends FHCAPI_Controller
|
|||||||
$tmpsetup = json_decode($widget->setup);
|
$tmpsetup = json_decode($widget->setup);
|
||||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||||
$widget->setup = $tmpsetup;
|
$widget->setup = $tmpsetup;
|
||||||
|
$widget->permitted = empty($widget->berechtigung_kurzbz)
|
||||||
|
|| $this->permissionlib->isBerechtigt($widget->berechtigung_kurzbz);
|
||||||
|
|
||||||
return $widget;
|
return $widget;
|
||||||
}, $widgets);
|
}, $widgets);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,218 @@
|
|||||||
|
<?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');
|
||||||
|
|
||||||
|
use CI3_Events as Events;
|
||||||
|
|
||||||
|
class PaabgabeUebersicht extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
const DOWNLOAD_PERMISSION = 'lehre/abgabetool:download';
|
||||||
|
const ABGABE_TYPES = ['Bachelor', 'Diplom'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PaabgabeUebersicht API constructor.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'viewData' => self::PERM_LOGGED,
|
||||||
|
'getPaAbgaben' => array('lehre/abgabetool:r'),
|
||||||
|
'getStudiengaenge' => array('lehre/abgabetool:r'),
|
||||||
|
'getTermine' => array('lehre/abgabetool:r'),
|
||||||
|
'getPaAbgabetypen' => array('lehre/abgabetool:r'),
|
||||||
|
'downloadZip' => array('lehre/abgabetool:r'),
|
||||||
|
//'downloadProjektarbeit' => array('lehre/abgabetool:r')
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||||
|
|
||||||
|
$this->load->library('PermissionLib');
|
||||||
|
|
||||||
|
// Load Phrases
|
||||||
|
$this->loadPhrases([
|
||||||
|
'abgabetool'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function viewData()
|
||||||
|
{
|
||||||
|
$viewData = [
|
||||||
|
"uid" => getAuthUID(),
|
||||||
|
// TODO create permission
|
||||||
|
"showEdit" => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($viewData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Projektabgaben for search criteria.
|
||||||
|
*/
|
||||||
|
public function getPaAbgaben()
|
||||||
|
{
|
||||||
|
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||||
|
$abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz');
|
||||||
|
$abgabedatum = $this->input->get('abgabedatum');
|
||||||
|
$personSearchString = $this->input->get('personSearchString');
|
||||||
|
|
||||||
|
$result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString);
|
||||||
|
|
||||||
|
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
|
||||||
|
// check wether Abgabe is in visual library
|
||||||
|
if (hasData($result))
|
||||||
|
{
|
||||||
|
Events::trigger('in_visual_library', getData($result));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess(getData($result) ?: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all Studiengänge for which user is entitled for
|
||||||
|
*/
|
||||||
|
public function getStudiengaenge()
|
||||||
|
{
|
||||||
|
$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::DOWNLOAD_PERMISSION);
|
||||||
|
|
||||||
|
if (!$studiengang_kz_arr) $this->terminateWithSuccess([]);
|
||||||
|
|
||||||
|
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||||
|
|
||||||
|
$this->StudiengangModel->addSelect('tbl_studiengang.*, UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) AS kuerzel', $studiengang_kz_arr);
|
||||||
|
$this->StudiengangModel->db->where_in('studiengang_kz', $studiengang_kz_arr);
|
||||||
|
$this->StudiengangModel->addOrder('typ, kurzbz');
|
||||||
|
$result = $this->StudiengangModel->load();
|
||||||
|
|
||||||
|
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get projekt work due dates, depending on search criteria.
|
||||||
|
*/
|
||||||
|
public function getTermine()
|
||||||
|
{
|
||||||
|
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||||
|
$abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->PaabgabeModel->getTermine(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz);
|
||||||
|
|
||||||
|
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all submission types.
|
||||||
|
*/
|
||||||
|
public function getPaAbgabetypen()
|
||||||
|
{
|
||||||
|
// Load model PaabgabetypModel
|
||||||
|
$this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel');
|
||||||
|
|
||||||
|
$this->PaabgabetypModel->addOrder('bezeichnung');
|
||||||
|
$result = $this->PaabgabetypModel->load();
|
||||||
|
|
||||||
|
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess((getData($result) ?: []));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Download zip files with project works matching submission search criteria.
|
||||||
|
*/
|
||||||
|
public function downloadZip()
|
||||||
|
{
|
||||||
|
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||||
|
$abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz');
|
||||||
|
$abgabedatum = $this->input->get('abgabedatum');
|
||||||
|
$personSearchString = $this->input->get('personSearchString');
|
||||||
|
|
||||||
|
if (!isset($studiengang_kz) && !isset($abgabetyp_kurzbz) && !isset($abgabedatum) && !isset($personSearchString))
|
||||||
|
$this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'nichtsAusgewaehlt'));
|
||||||
|
|
||||||
|
$this->load->library('zip');
|
||||||
|
|
||||||
|
$result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString);
|
||||||
|
|
||||||
|
if (isError($result)) $this->terminateWithFileOutput('text/plain', getError($result));
|
||||||
|
|
||||||
|
$fileExists = false;
|
||||||
|
$studiengang_kuerzel = null;
|
||||||
|
|
||||||
|
if (!hasData($result)) $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineDateienVorhanden'));
|
||||||
|
|
||||||
|
$abgaben = getData($result);
|
||||||
|
|
||||||
|
foreach ($abgaben as $abgabe)
|
||||||
|
{
|
||||||
|
$path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$abgabe->uid.'.pdf';
|
||||||
|
if (file_exists($path))
|
||||||
|
{
|
||||||
|
$fileExists = true;
|
||||||
|
$studiengang_kuerzel = $abgabe->studiengang_kuerzel;
|
||||||
|
$this->zip->read_file($path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$fileExists) $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineDateienVorhanden'));
|
||||||
|
|
||||||
|
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||||
|
$zipFileName = 'Abgabe'.(isset($studiengang_kz) && isset($studiengang_kuerzel) ? '_'.$studiengang_kuerzel : '').'.zip';
|
||||||
|
$this->zip->download($zipFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Download Projektarbeit document.
|
||||||
|
*/
|
||||||
|
//~ public function downloadProjektarbeit()
|
||||||
|
//~ {
|
||||||
|
//~ $paabgabe_id = $this->input->get('paabgabe_id');
|
||||||
|
|
||||||
|
//~ if (!is_numeric($paabgabe_id))
|
||||||
|
//~ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Abgabe ID']), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
//~ //$abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
|
||||||
|
//~ $this->PaabgabeModel->addSelect("paabgabe_id, student_uid, tbl_paabgabe.datum, tbl_paabgabe.abgabedatum, projekttyp_kurzbz, titel, titel_english,
|
||||||
|
//~ paabgabe_id || '_' || student_uid || '.pdf' AS filename");
|
||||||
|
//~ $this->PaabgabeModel->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id');
|
||||||
|
//~ $abgabeRes = $this->PaabgabeModel->load($paabgabe_id);
|
||||||
|
|
||||||
|
//~ if (isError($abgabeRes))
|
||||||
|
//~ show_error(getError($abgabeRes));
|
||||||
|
|
||||||
|
//~ if (hasData($abgabeRes))
|
||||||
|
//~ {
|
||||||
|
//~ $endabgabe = getData($abgabeRes)[0];
|
||||||
|
//~ $filepath = PAABGABE_PATH.$endabgabe->filename;
|
||||||
|
|
||||||
|
//~ if (file_exists($filepath))
|
||||||
|
//~ {
|
||||||
|
//~ $this->output
|
||||||
|
//~ ->set_status_header(200)
|
||||||
|
//~ ->set_content_type('application/pdf', 'utf-8')
|
||||||
|
//~ ->set_header('Content-Disposition: attachment; filename="'.$endabgabe->filename.'"')
|
||||||
|
//~ ->set_output(file_get_contents($filepath))
|
||||||
|
//~ ->_display();
|
||||||
|
//~ }
|
||||||
|
//~ else
|
||||||
|
//~ {
|
||||||
|
//~ show_error("File does not exist.");
|
||||||
|
//~ }
|
||||||
|
//~ }
|
||||||
|
//~ }
|
||||||
|
}
|
||||||
@@ -12,9 +12,9 @@ class Funktionen extends FHCAPI_Controller
|
|||||||
parent::__construct(array(
|
parent::__construct(array(
|
||||||
'getAllFunctions' => ['admin:r', 'assistenz:r'],
|
'getAllFunctions' => ['admin:r', 'assistenz:r'],
|
||||||
'getAllUserFunctions' => ['admin:r', 'assistenz:r'],
|
'getAllUserFunctions' => ['admin:r', 'assistenz:r'],
|
||||||
'getOrgHeads' => ['admin:r', 'assistenz:r'],
|
'getOrgHeads' => self::PERM_LOGGED,
|
||||||
'getOrgetsForCompany' => ['admin:r', 'assistenz:r'],
|
'getOrgetsForCompany' => self::PERM_LOGGED,
|
||||||
'getAllOrgUnits' => ['admin:r', 'assistenz:r'],
|
'getAllOrgUnits' => self::PERM_LOGGED,
|
||||||
'loadFunction' => ['admin:r', 'assistenz:r'],
|
'loadFunction' => ['admin:r', 'assistenz:r'],
|
||||||
'insertFunction' => ['admin:rw', 'assistenz:rw'],
|
'insertFunction' => ['admin:rw', 'assistenz:rw'],
|
||||||
'updateFunction' => ['admin:rw', 'assistenz:rw'],
|
'updateFunction' => ['admin:rw', 'assistenz:rw'],
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2026 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');
|
||||||
|
|
||||||
|
class Betreuungen extends FHCAPI_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct([
|
||||||
|
'getBetreuungen' => self::PERM_LOGGED,
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
public function getBetreuungen()
|
||||||
|
{
|
||||||
|
$semester = $this->input->get("semester");
|
||||||
|
if (!$semester) $this->terminateWithError("Missing parameters!");
|
||||||
|
|
||||||
|
$personId = getAuthPersonId();
|
||||||
|
|
||||||
|
$betreuungenQuery = "SELECT
|
||||||
|
tbl_lehrveranstaltung.bezeichnung,
|
||||||
|
tbl_projektarbeit.titel,
|
||||||
|
(SELECT nachname || ' ' || (CASE WHEN wahlname IS NOT NULL THEN wahlname ELSE vorname END)
|
||||||
|
FROM public.tbl_benutzer
|
||||||
|
JOIN public.tbl_person USING(person_id)
|
||||||
|
WHERE uid=student_uid)
|
||||||
|
as name,
|
||||||
|
(SELECT uid
|
||||||
|
FROM public.tbl_benutzer
|
||||||
|
WHERE uid=student_uid)
|
||||||
|
as uid,
|
||||||
|
tbl_lehrveranstaltung.studiengang_kz,
|
||||||
|
tbl_lehrveranstaltung.semester,
|
||||||
|
tbl_studiengang.kurzbzlang as studiengang,
|
||||||
|
tbl_studiengang.email,
|
||||||
|
tbl_betreuerart.beschreibung AS beutreuerart_beschreibung,
|
||||||
|
tbl_projektbetreuer.stunden
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehrveranstaltung, lehre.tbl_projektarbeit, lehre.tbl_projektbetreuer, public.tbl_studiengang, lehre.tbl_betreuerart
|
||||||
|
WHERE
|
||||||
|
tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_projektarbeit.lehrveranstaltung_id AND
|
||||||
|
tbl_projektarbeit.studiensemester_kurzbz = '$semester' AND
|
||||||
|
tbl_projektarbeit.projektarbeit_id = tbl_projektbetreuer.projektarbeit_id AND
|
||||||
|
tbl_lehrveranstaltung.studiengang_kz = tbl_studiengang.studiengang_kz AND
|
||||||
|
tbl_projektbetreuer.betreuerart_kurzbz = tbl_betreuerart.betreuerart_kurzbz AND
|
||||||
|
tbl_projektbetreuer.person_id = '$personId'";
|
||||||
|
$this->addMeta("query", $betreuungenQuery);
|
||||||
|
|
||||||
|
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||||
|
$result = $this->LehrveranstaltungModel->execReadOnlyQuery($betreuungenQuery);
|
||||||
|
$result = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,7 +19,8 @@ class Lehreinheit extends FHCAPI_Controller
|
|||||||
'getLehrfach' => ['admin:r', 'assistenz:r'],
|
'getLehrfach' => ['admin:r', 'assistenz:r'],
|
||||||
'getSprache' => ['admin:r', 'assistenz:r'],
|
'getSprache' => ['admin:r', 'assistenz:r'],
|
||||||
'getRaumtyp' => ['admin:r', 'assistenz:r'],
|
'getRaumtyp' => ['admin:r', 'assistenz:r'],
|
||||||
'getLehrform' => ['admin:r', 'assistenz:r']
|
'getLehrform' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getLehreinheitenBySemester' => self::PERM_LOGGED,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->_ci = &get_instance();
|
$this->_ci = &get_instance();
|
||||||
@@ -438,6 +439,27 @@ class Lehreinheit extends FHCAPI_Controller
|
|||||||
$this->terminateWithSuccess($this->p->t('global', 'gespeichert'));
|
$this->terminateWithSuccess($this->p->t('global', 'gespeichert'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLehreinheitenBySemester()
|
||||||
|
{
|
||||||
|
$semester = $this->input->get('semester');
|
||||||
|
$lehreinheiten = $this->LehreinheitModel->getLehrenheitenBySemester(getAuthUID(), $semester);
|
||||||
|
$lehreinheiten = $this->getDataOrTerminateWithError($lehreinheiten);
|
||||||
|
|
||||||
|
foreach ($lehreinheiten as $lehreinheit) {
|
||||||
|
$groups = $this->LehreinheitModel->getGroupsByLehreinheit($lehreinheit->lehreinheit_id);
|
||||||
|
$groups = $this->getDataOrTerminateWithError($groups);
|
||||||
|
$stgKurzbz = $lehreinheit->stg_kurzbz;
|
||||||
|
$lehreinheit->groups = array_map(
|
||||||
|
function ($group) use ($stgKurzbz) {
|
||||||
|
return $group->gruppe_kurzbz ?? $stgKurzbz . "-" . $group->semester . $group->verband . $group->gruppe;
|
||||||
|
},
|
||||||
|
$groups
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($lehreinheiten);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private function checkPermission($lehreinheit_id)
|
private function checkPermission($lehreinheit_id)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ class Studiensemester extends FHCAPI_Controller
|
|||||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
||||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
|
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
|
||||||
'current' => self::PERM_LOGGED,
|
'current' => self::PERM_LOGGED,
|
||||||
'set' => self::PERM_LOGGED
|
'set' => self::PERM_LOGGED,
|
||||||
|
'getContainingOrNearestByDateRange' => self::PERM_LOGGED,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
// Load model StudiensemesterModel
|
// Load model StudiensemesterModel
|
||||||
@@ -203,4 +204,15 @@ class Studiensemester extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess(true);
|
$this->terminateWithSuccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getContainingOrNearestByDateRange()
|
||||||
|
{
|
||||||
|
$from = $this->input->get("from");
|
||||||
|
$to = $this->input->get("to");
|
||||||
|
|
||||||
|
$result = $this->StudiensemesterModel->getContainingOrNearestByDateRange($from, $to);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ class Grades extends FHCAPI_Controller
|
|||||||
|
|
||||||
// Load Libraries
|
// Load Libraries
|
||||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||||
|
$this->load->library('PruefungsverlaufLib', null, 'VerlaufLib');
|
||||||
|
|
||||||
|
$this->load->config('noten');
|
||||||
|
|
||||||
// Load Phrases
|
// Load Phrases
|
||||||
$this->loadPhrases([
|
$this->loadPhrases([
|
||||||
@@ -355,23 +358,24 @@ class Grades extends FHCAPI_Controller
|
|||||||
$data['lehrveranstaltung_id'] = $lehrveranstaltung_id;
|
$data['lehrveranstaltung_id'] = $lehrveranstaltung_id;
|
||||||
$data['student_uid'] = $student_uid;
|
$data['student_uid'] = $student_uid;
|
||||||
$data['studiensemester_kurzbz'] = $studiensemester_kurzbz;
|
$data['studiensemester_kurzbz'] = $studiensemester_kurzbz;
|
||||||
|
|
||||||
$this->ZeugnisnoteModel->insert($data);
|
|
||||||
|
|
||||||
if (defined('FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN')
|
$this->ZeugnisnoteModel->insert($data);
|
||||||
&& FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN) {
|
}
|
||||||
$result = $this->addTestsForGrade(
|
|
||||||
$studiensemester_kurzbz,
|
// Der erste Antritt wird bereits bei der Übernahme als eigene Prüfung angelegt, damit der
|
||||||
$student_uid,
|
// Prüfungsverlauf von Anfang an vollständig ist und das Benotungstool ihn nicht erst beim
|
||||||
$lehrveranstaltung_id,
|
// Anlegen einer Wiederholung nachtragen muss. Läuft bewusst in BEIDEN Zweigen (auch beim
|
||||||
$teacherGrade->note,
|
// Überschreiben einer bestehenden Zeugnisnote) und ist idempotent.
|
||||||
$teacherGrade->punkte
|
if ($this->config->item('CIS_GESAMTNOTE_ERSTANTRITT_BEI_UEBERNAHME')) {
|
||||||
);
|
$result = $this->addErstantrittForGrade(
|
||||||
$this->getDataOrTerminateWithError($result);
|
$studiensemester_kurzbz,
|
||||||
}
|
$student_uid,
|
||||||
|
$lehrveranstaltung_id,
|
||||||
|
$teacherGrade
|
||||||
|
);
|
||||||
|
$this->getDataOrTerminateWithError($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$this->terminateWithSuccess(true);
|
$this->terminateWithSuccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,20 +495,32 @@ class Grades extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function that adds tests for a student
|
* Legt bei der Notenübernahme den ersten Prüfungsantritt als eigenen Datensatz an
|
||||||
* (Entries in lehre.tbl_pruefung)
|
* (Eintrag in lehre.tbl_pruefung).
|
||||||
*
|
*
|
||||||
* @param string $studiensemester_kurzbz
|
* Idempotent: existiert für den Studenten in dieser LV bereits ein Termin, passiert nichts -
|
||||||
* @param string $student_uid
|
* die Übernahme darf beliebig oft laufen, ohne den Verlauf zu verfälschen.
|
||||||
* @param integer $lehrveranstaltung_id
|
*
|
||||||
* @param integer $note
|
* Datiert auf das Freigabedatum der LV-Note: das ist der Zeitpunkt, zu dem die
|
||||||
* @param numeric $punkte
|
* Leistungsfeststellung verbindlich wurde. Das Benotungsdatum ändert sich bei jeder Korrektur,
|
||||||
|
* der Übernahmezeitpunkt ist reine Verwaltungsarbeit - beide taugen nicht als Termindatum.
|
||||||
|
*
|
||||||
|
* @param string $studiensemester_kurzbz
|
||||||
|
* @param string $student_uid
|
||||||
|
* @param integer $lehrveranstaltung_id
|
||||||
|
* @param stdClass $teacherGrade die übernommene LV-Gesamtnote
|
||||||
*
|
*
|
||||||
* @return stdClass
|
* @return stdClass
|
||||||
*/
|
*/
|
||||||
protected function addTestsForGrade($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id, $note, $punkte)
|
protected function addErstantrittForGrade($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id, $teacherGrade)
|
||||||
{
|
{
|
||||||
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||||
|
$this->load->model('education/LePruefung_model', 'LePruefungModel');
|
||||||
|
|
||||||
|
// bereits ein Termin vorhanden -> der Verlauf beginnt schon, nichts nachzutragen
|
||||||
|
$vorhanden = $this->VerlaufLib->getPruefungen($student_uid, $lehrveranstaltung_id, $studiensemester_kurzbz);
|
||||||
|
if (count($vorhanden) > 0)
|
||||||
|
return success(null);
|
||||||
|
|
||||||
// Get Lehreinheit
|
// Get Lehreinheit
|
||||||
$result = $this->LehrveranstaltungModel->getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id);
|
$result = $this->LehrveranstaltungModel->getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id);
|
||||||
@@ -515,19 +531,24 @@ class Grades extends FHCAPI_Controller
|
|||||||
return error($this->p->t("stv", "grades_error_lehreinheit_id"));
|
return error($this->p->t("stv", "grades_error_lehreinheit_id"));
|
||||||
$le = current(getData($result));
|
$le = current(getData($result));
|
||||||
|
|
||||||
|
$datum = $teacherGrade->freigabedatum ?: ($teacherGrade->benotungsdatum ?: date('Y-m-d'));
|
||||||
|
$now = date('Y-m-d H:i:s');
|
||||||
|
|
||||||
// Prepare
|
// Prepare
|
||||||
$this->load->model('education/LePruefung_model', 'LePruefungModel');
|
|
||||||
$data = [
|
$data = [
|
||||||
"student_uid" => $student_uid,
|
"student_uid" => $student_uid,
|
||||||
"lehreinheit_id" => $le->lehreinheit_id,
|
"lehreinheit_id" => $le->lehreinheit_id,
|
||||||
"datum" => date('Y-m-d'),
|
"mitarbeiter_uid" => $teacherGrade->mitarbeiter_uid,
|
||||||
"pruefungstyp_kurzbz" => "Termin1",
|
"datum" => $datum,
|
||||||
"note" => $note
|
"pruefungstyp_kurzbz" => $this->VerlaufLib->legacyTypFuerAntritt(1),
|
||||||
|
"note" => $teacherGrade->note,
|
||||||
|
"insertamum" => $now,
|
||||||
|
"insertvon" => getAuthUID()
|
||||||
];
|
];
|
||||||
|
|
||||||
if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE)
|
if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE)
|
||||||
$data["punkte"] = $punkte;
|
$data["punkte"] = $teacherGrade->punkte;
|
||||||
|
|
||||||
// Get Anwesenheit
|
// Get Anwesenheit
|
||||||
$this->load->model('education/Anwesenheit_model', 'AnwesenheitModel');
|
$this->load->model('education/Anwesenheit_model', 'AnwesenheitModel');
|
||||||
$result = $this->AnwesenheitModel->loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id);
|
$result = $this->AnwesenheitModel->loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id);
|
||||||
@@ -535,7 +556,8 @@ class Grades extends FHCAPI_Controller
|
|||||||
return $result;
|
return $result;
|
||||||
$anwesenheit = getData($result);
|
$anwesenheit = getData($result);
|
||||||
|
|
||||||
if ($anwesenheit && (float)current($anwesenheit)->prozent < FAS_ANWESENHEIT_ROT) {
|
if (defined('FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN') && FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN
|
||||||
|
&& $anwesenheit && (float)current($anwesenheit)->prozent < FAS_ANWESENHEIT_ROT) {
|
||||||
// Get Anwesenheitsbefreiung
|
// Get Anwesenheitsbefreiung
|
||||||
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||||
$result = $this->BenutzerfunktionModel->getBenutzerFunktionByUidInStdsem($student_uid, $studiensemester_kurzbz, 'awbefreit');
|
$result = $this->BenutzerfunktionModel->getBenutzerFunktionByUidInStdsem($student_uid, $studiensemester_kurzbz, 'awbefreit');
|
||||||
@@ -545,7 +567,10 @@ class Grades extends FHCAPI_Controller
|
|||||||
|
|
||||||
$anwesenheitsbefreit = hasData($result);
|
$anwesenheitsbefreit = hasData($result);
|
||||||
|
|
||||||
// Wenn nicht Anwesenheitsbefreit und Anwesenheit unter einem bestimmten Prozentsatz fällt dann wird ein Pruefungsantritt abgezogen
|
// Bei zu geringer Anwesenheit ohne Befreiung wird ein zusätzlicher Termin
|
||||||
|
// 'Nicht beurteilt' vor dem eigentlichen Antritt festgehalten. ACHTUNG: diese Note
|
||||||
|
// zählt nicht mehr als Antritt (NOTEN_OHNE_ANTRITT_BEZEICHNUNGEN) - der frühere
|
||||||
|
// "Antritt abziehen"-Effekt entfällt damit, der Eintrag ist reine Dokumentation.
|
||||||
if (!$anwesenheitsbefreit) {
|
if (!$anwesenheitsbefreit) {
|
||||||
$data2 = $data;
|
$data2 = $data;
|
||||||
$data2["note"] = 7;
|
$data2["note"] = 7;
|
||||||
@@ -556,8 +581,6 @@ class Grades extends FHCAPI_Controller
|
|||||||
|
|
||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $result;
|
return $result;
|
||||||
|
|
||||||
$data["pruefungstyp_kurzbz"] = "Termin2";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -574,6 +574,19 @@ class Kontakt extends FHCAPI_Controller
|
|||||||
$person_id = $this->input->post('person_id');
|
$person_id = $this->input->post('person_id');
|
||||||
$standort_id = $this->input->post('standort_id');
|
$standort_id = $this->input->post('standort_id');
|
||||||
|
|
||||||
|
//check person_id: allow editing only of persons who are no mitarbeiter
|
||||||
|
if($person_id)
|
||||||
|
{
|
||||||
|
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||||
|
$this->BenutzerModel->addJoin('public.tbl_mitarbeiter ma', 'ON (ma.mitarbeiter_uid = public.tbl_benutzer.uid)');
|
||||||
|
|
||||||
|
$result = $this->BenutzerModel->loadWhere([
|
||||||
|
'person_id' => $person_id
|
||||||
|
]);
|
||||||
|
if(hasData($result))
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'editingMitarbeiterPVonly'), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
$result = $this->KontaktModel->update(
|
$result = $this->KontaktModel->update(
|
||||||
[
|
[
|
||||||
'kontakt_id' => $kontakt_id
|
'kontakt_id' => $kontakt_id
|
||||||
|
|||||||
@@ -370,6 +370,7 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
$result->semester = $item->semester;
|
$result->semester = $item->semester;
|
||||||
$result->verband = $item->verband;
|
$result->verband = $item->verband;
|
||||||
$result->gruppe = $item->gruppe;
|
$result->gruppe = $item->gruppe;
|
||||||
|
$result->studiensemester_kurzbz = $item->studiensemester_kurzbz;
|
||||||
return $result;
|
return $result;
|
||||||
},
|
},
|
||||||
$lehrverband_query_result));
|
$lehrverband_query_result));
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ class Projektarbeit extends FHCAPI_Controller
|
|||||||
$this->load->model('education/Note_model', 'NoteModel');
|
$this->load->model('education/Note_model', 'NoteModel');
|
||||||
$this->load->model('education/Projektbetreuer_model', 'BetreuerModel');
|
$this->load->model('education/Projektbetreuer_model', 'BetreuerModel');
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
|
||||||
// load libraries
|
// load libraries
|
||||||
$this->load->library('PermissionLib');
|
$this->load->library('PermissionLib');
|
||||||
@@ -100,16 +102,16 @@ class Projektarbeit extends FHCAPI_Controller
|
|||||||
private function fetchProjektarbeitById($projektarbeit_id) {
|
private function fetchProjektarbeitById($projektarbeit_id) {
|
||||||
$this->ProjektarbeitModel->resetQuery();
|
$this->ProjektarbeitModel->resetQuery();
|
||||||
$this->ProjektarbeitModel->addSelect(
|
$this->ProjektarbeitModel->addSelect(
|
||||||
'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
|
'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
|
||||||
firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
|
tbl_projektarbeit.studiensemester_kurzbz, firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
|
||||||
);
|
);
|
||||||
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
|
|
||||||
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||||
$this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
|
$this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
|
||||||
|
|
||||||
|
|
||||||
return $this->ProjektarbeitModel->loadWhere(
|
return $this->ProjektarbeitModel->loadWhere(
|
||||||
array('projektarbeit_id' => $projektarbeit_id)
|
array('projektarbeit_id' => $projektarbeit_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -246,14 +248,38 @@ class Projektarbeit extends FHCAPI_Controller
|
|||||||
$additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id');
|
$additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id');
|
||||||
|
|
||||||
if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
|
if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
|
||||||
if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL);
|
if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemester missing', self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
// get Lvs
|
// get prestudent_id from student model
|
||||||
|
$studentRes = $this->StudentModel->load(['student_uid' => $student_uid]);
|
||||||
|
if(hasData($studentRes)) {
|
||||||
|
$student = getData($studentRes);
|
||||||
|
} else {
|
||||||
|
$this->terminateWithError($studentRes, self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// to get prestudent_status history
|
||||||
|
$historyRes = $this->PrestudentstatusModel->getHistoryPrestudent($student[0]->prestudent_id);
|
||||||
|
if(hasData($historyRes)) {
|
||||||
|
$history = getData($historyRes);
|
||||||
|
} else {
|
||||||
|
$this->terminateWithError($historyRes, self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// query for every lva of a studiengang that has projektarbeit flag true
|
||||||
$lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id);
|
$lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id);
|
||||||
|
|
||||||
if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
|
if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
$lvs = hasData($lvsResult) ? getData($lvsResult) : [];
|
$lvs = hasData($lvsResult) ? getData($lvsResult) : [];
|
||||||
|
|
||||||
|
$lvsIDs = array_column($lvs, 'lehrveranstaltung_id');
|
||||||
|
|
||||||
|
// get current studienplan_id from status history to find out which lva options are actually assigned to the students studienplan
|
||||||
|
// important so the projektarbeit has the correct lva assigned to be able to find and print the thesis title on the degree documents!
|
||||||
|
$currentStatus = $history[0];
|
||||||
|
$lvByStudienPlanRes = $this->LehrveranstaltungModel->getLvsByStudienplanByLvaIDs($currentStatus->studienplan_id, $lvsIDs);
|
||||||
|
if(hasData($lvByStudienPlanRes)) {
|
||||||
|
$lvs = getData($lvByStudienPlanRes);
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($lvs as $lv)
|
foreach ($lvs as $lv)
|
||||||
{
|
{
|
||||||
@@ -320,11 +346,18 @@ class Projektarbeit extends FHCAPI_Controller
|
|||||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [
|
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'is_natural', [
|
||||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']),
|
|
||||||
'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
|
'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung', 'required', [
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [
|
||||||
|
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester'])
|
||||||
|
]);
|
||||||
|
|
||||||
$this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [
|
$this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [
|
||||||
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn'])
|
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn'])
|
||||||
]);
|
]);
|
||||||
@@ -354,6 +387,8 @@ class Projektarbeit extends FHCAPI_Controller
|
|||||||
'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'],
|
'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'],
|
||||||
'firma_id' => $formData['firma_id'] ?? null,
|
'firma_id' => $formData['firma_id'] ?? null,
|
||||||
'lehreinheit_id' => $formData['lehreinheit_id'],
|
'lehreinheit_id' => $formData['lehreinheit_id'],
|
||||||
|
'lehrveranstaltung_id' => $formData['lehrveranstaltung_id'],
|
||||||
|
'studiensemester_kurzbz' => $formData['studiensemester_kurzbz'],
|
||||||
'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null,
|
'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null,
|
||||||
'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null,
|
'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null,
|
||||||
'note' => $formData['note'] ?? null,
|
'note' => $formData['note'] ?? null,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ class Mylv extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
|
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'Student' => self::PERM_LOGGED,
|
'Student' => self::PERM_LOGGED,
|
||||||
'Studiensemester' => self::PERM_LOGGED,
|
'Studiensemester' => self::PERM_LOGGED,
|
||||||
@@ -44,13 +45,27 @@ class Mylv extends Auth_Controller
|
|||||||
public function Studiensemester()
|
public function Studiensemester()
|
||||||
{
|
{
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
|
||||||
$result = $this->StudiensemesterModel->getWhereStudentHasLvs(getAuthUID());
|
$isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())) ?? false;
|
||||||
|
if($isMitarbeiter) {
|
||||||
|
$result = $this->StudiensemesterModel->getWhereMitarbeiterHasLvs(getAuthUID());
|
||||||
|
|
||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $this->outputJsonError(getError($result));
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
$this->outputJsonSuccess(getData($result));
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else if(getData($this->StudentModel->isStudent(getAuthUID())) ?? false) { // $isStudent
|
||||||
|
$result = $this->StudiensemesterModel->getWhereStudentHasLvs(getAuthUID());
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else {
|
||||||
|
$this->outputJsonError('neither student or mitarbeiter');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -58,13 +73,27 @@ class Mylv extends Auth_Controller
|
|||||||
public function Lvs($studiensemester_kurzbz)
|
public function Lvs($studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
|
||||||
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage());
|
$isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())) ?? false;
|
||||||
|
if($isMitarbeiter) {
|
||||||
|
$result = $this->LehrveranstaltungModel->getLvsByMitarbeiterInSemester(getAuthUID(), $studiensemester_kurzbz);
|
||||||
|
|
||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $this->outputJsonError(getError($result));
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
$this->outputJsonSuccess(getData($result));
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else if(getData($this->StudentModel->isStudent(getAuthUID())) ?? false) { // $isStudent
|
||||||
|
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage());
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else {
|
||||||
|
$this->outputJsonError('neither student or mitarbeiter');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -803,7 +803,7 @@ class ReihungstestJob extends JOB_Controller
|
|||||||
{
|
{
|
||||||
if (!isset($studiensemester) || isEmptyString($studiensemester))
|
if (!isset($studiensemester) || isEmptyString($studiensemester))
|
||||||
{
|
{
|
||||||
$this->logError("Studiensemster not passed as parameter");
|
$this->logError("Studiensemester not passed as parameter");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -215,8 +215,11 @@ class Pruefungsprotokoll extends Auth_Controller
|
|||||||
if (hasData($abschlusspruefung))
|
if (hasData($abschlusspruefung))
|
||||||
{
|
{
|
||||||
$abschlusspruefung_data = getData($abschlusspruefung);
|
$abschlusspruefung_data = getData($abschlusspruefung);
|
||||||
if ($this->permissionlib->isBerechtigt('admin') ||
|
if ($this->permissionlib->isBerechtigt('admin')
|
||||||
(isset($abschlusspruefung_data->studiengang_kz) && $this->permissionlib->isBerechtigt('assistenz', 'suid', $abschlusspruefung_data->studiengang_kz))
|
|| (
|
||||||
|
isset($abschlusspruefung_data->studiengang_kz)
|
||||||
|
&& $this->permissionlib->isBerechtigt('assistenz', 'suid', $abschlusspruefung_data->studiengang_kz)
|
||||||
|
)
|
||||||
|| $this->_uid === $abschlusspruefung_data->uid_vorsitz)
|
|| $this->_uid === $abschlusspruefung_data->uid_vorsitz)
|
||||||
$result = $abschlusspruefung;
|
$result = $abschlusspruefung;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ class InfoCenter extends Auth_Controller
|
|||||||
const PREV_FILTER_ID = 'prev_filter_id';
|
const PREV_FILTER_ID = 'prev_filter_id';
|
||||||
const KEEP_TABLESORTER_FILTER = 'keepTsFilter';
|
const KEEP_TABLESORTER_FILTER = 'keepTsFilter';
|
||||||
|
|
||||||
|
const ONBOARDING_INSERTVON = 'onboarding';
|
||||||
|
const ONBOARDING_KENNZEICHENTYP = 'eobRegistrierungsId';
|
||||||
|
|
||||||
private $_uid; // contains the UID of the logged user
|
private $_uid; // contains the UID of the logged user
|
||||||
|
|
||||||
// Used to log with PersonLogLib
|
// Used to log with PersonLogLib
|
||||||
@@ -175,6 +178,7 @@ class InfoCenter extends Auth_Controller
|
|||||||
$this->load->model('person/Kontakt_model', 'KontaktModel');
|
$this->load->model('person/Kontakt_model', 'KontaktModel');
|
||||||
$this->load->model('person/Geschlecht_model', 'GeschlechtModel');
|
$this->load->model('person/Geschlecht_model', 'GeschlechtModel');
|
||||||
$this->load->model('person/adresse_model', 'AdresseModel');
|
$this->load->model('person/adresse_model', 'AdresseModel');
|
||||||
|
$this->load->model('person/Kennzeichen_model', 'KennzeichenModel');
|
||||||
|
|
||||||
// Loads libraries
|
// Loads libraries
|
||||||
$this->load->library('PersonLogLib');
|
$this->load->library('PersonLogLib');
|
||||||
@@ -1452,6 +1456,100 @@ class InfoCenter extends Auth_Controller
|
|||||||
|
|
||||||
$this->outputJsonSuccess("Done!");
|
$this->outputJsonSuccess("Done!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStudienartData()
|
||||||
|
{
|
||||||
|
$this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l']));
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
||||||
|
if ($studiengang === 'all' && $abgeschickt === 'all')
|
||||||
|
{
|
||||||
|
foreach($personen as $person)
|
||||||
|
{
|
||||||
|
$prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester);
|
||||||
|
|
||||||
|
if (!hasData($prestudenten))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$prestudentenData = getData($prestudenten);
|
||||||
|
|
||||||
|
foreach ($prestudentenData as $prestudent)
|
||||||
|
{
|
||||||
|
$this->saveAbsage($prestudent->prestudent_id, $statusgrund);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||||
|
|
||||||
|
$this->StudienplanModel->addSelect('1');
|
||||||
|
$this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id');
|
||||||
|
$escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang));
|
||||||
|
$this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped");
|
||||||
|
$this->StudienplanModel->addLimit(1);
|
||||||
|
$studiengangResult = $this->StudienplanModel->load();
|
||||||
|
|
||||||
|
if (hasData($studiengangResult))
|
||||||
|
{
|
||||||
|
foreach($personen as $person)
|
||||||
|
{
|
||||||
|
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all');
|
||||||
|
|
||||||
|
if (!hasData($prestudent))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$prestudentData = getData($prestudent);
|
||||||
|
$this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$this->terminateWithJsonError("Falschen Studiengang übergeben!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->outputJsonSuccess("Success");
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
// Private methods
|
// Private methods
|
||||||
|
|
||||||
@@ -1946,6 +2044,17 @@ class InfoCenter extends Auth_Controller
|
|||||||
show_error(getError($user_person));
|
show_error(getError($user_person));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add info about first electronig onboarding login
|
||||||
|
$this->KennzeichenModel->addSelect('insertamum');
|
||||||
|
$onboarding_first_login = $this->KennzeichenModel->loadWhere(
|
||||||
|
array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => self::ONBOARDING_KENNZEICHENTYP)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isError($onboarding_first_login))
|
||||||
|
{
|
||||||
|
show_error(getError($onboarding_first_login));
|
||||||
|
}
|
||||||
|
|
||||||
$data = array (
|
$data = array (
|
||||||
'lockedby' => $lockedby,
|
'lockedby' => $lockedby,
|
||||||
'lockedbyother' => $lockedbyother,
|
'lockedbyother' => $lockedbyother,
|
||||||
@@ -1955,7 +2064,9 @@ class InfoCenter extends Auth_Controller
|
|||||||
'messages' => $messages->retval,
|
'messages' => $messages->retval,
|
||||||
'logs' => $logs,
|
'logs' => $logs,
|
||||||
'notizen' => $notizen->retval,
|
'notizen' => $notizen->retval,
|
||||||
'notizenbewerbung' => $notizen_bewerbung->retval
|
'notizenbewerbung' => $notizen_bewerbung->retval,
|
||||||
|
'created_by_onboarding' => $stammdaten->retval->insertvon == self::ONBOARDING_INSERTVON,
|
||||||
|
'onboarding_first_login' => hasData($onboarding_first_login) ? getData($onboarding_first_login)[0]->insertamum : null
|
||||||
);
|
);
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
@@ -2375,97 +2486,4 @@ class InfoCenter extends Auth_Controller
|
|||||||
$this->loglib->logError('Studiengang has no mail for sending Freigabe mail');
|
$this->loglib->logError('Studiengang has no mail for sending Freigabe mail');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getStudienartData()
|
|
||||||
{
|
|
||||||
$this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l']));
|
|
||||||
}
|
|
||||||
|
|
||||||
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");
|
|
||||||
|
|
||||||
if ($studiengang === 'all' && $abgeschickt === 'all')
|
|
||||||
{
|
|
||||||
foreach($personen as $person)
|
|
||||||
{
|
|
||||||
$prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester);
|
|
||||||
|
|
||||||
if (!hasData($prestudenten))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
$prestudentenData = getData($prestudenten);
|
|
||||||
|
|
||||||
foreach ($prestudentenData as $prestudent)
|
|
||||||
{
|
|
||||||
$this->saveAbsage($prestudent->prestudent_id, $statusgrund);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
|
||||||
|
|
||||||
$this->StudienplanModel->addSelect('1');
|
|
||||||
$this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id');
|
|
||||||
$escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang));
|
|
||||||
$this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped");
|
|
||||||
$this->StudienplanModel->addLimit(1);
|
|
||||||
$studiengangResult = $this->StudienplanModel->load();
|
|
||||||
|
|
||||||
if (hasData($studiengangResult))
|
|
||||||
{
|
|
||||||
foreach($personen as $person)
|
|
||||||
{
|
|
||||||
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all');
|
|
||||||
|
|
||||||
if (!hasData($prestudent))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
$prestudentData = getData($prestudent);
|
|
||||||
$this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$this->terminateWithJsonError("Falschen Studiengang übergeben!");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->outputJsonSuccess("Success");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,8 @@ class Rueckstellung extends Auth_Controller
|
|||||||
private $_ci; // Code igniter instance
|
private $_ci; // Code igniter instance
|
||||||
private $_uid;
|
private $_uid;
|
||||||
|
|
||||||
|
const ZGV_UEBERPRUEFUNG_MAIL_VORLAGE = 'ZGVUEP';
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct(
|
parent::__construct(
|
||||||
@@ -23,6 +25,7 @@ class Rueckstellung extends Auth_Controller
|
|||||||
$this->load->model('crm/RueckstellungStatus_model', 'RueckstellungStatusModel');
|
$this->load->model('crm/RueckstellungStatus_model', 'RueckstellungStatusModel');
|
||||||
$this->load->model('person/Person_model', 'PersonModel');
|
$this->load->model('person/Person_model', 'PersonModel');
|
||||||
$this->load->library('PersonLogLib');
|
$this->load->library('PersonLogLib');
|
||||||
|
$this->load->library('MessageLib');
|
||||||
|
|
||||||
$this->_setAuthUID(); // sets property uid
|
$this->_setAuthUID(); // sets property uid
|
||||||
|
|
||||||
@@ -78,6 +81,8 @@ class Rueckstellung extends Auth_Controller
|
|||||||
|
|
||||||
$this->_log($person_id, $status_kurzbz);
|
$this->_log($person_id, $status_kurzbz);
|
||||||
|
|
||||||
|
if ($status_kurzbz === 'onhold_zgv')
|
||||||
|
$this->sendRueckstellungMessage($person_id);
|
||||||
$this->outputJson($result);
|
$this->outputJson($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,6 +109,10 @@ class Rueckstellung extends Auth_Controller
|
|||||||
if (isError($result))
|
if (isError($result))
|
||||||
$this->terminateWithJsonError(getError($result));
|
$this->terminateWithJsonError(getError($result));
|
||||||
$this->_log($person, $status_kurzbz);
|
$this->_log($person, $status_kurzbz);
|
||||||
|
|
||||||
|
if ($status_kurzbz === 'onhold_zgv')
|
||||||
|
$this->sendRueckstellungMessage($person);
|
||||||
|
|
||||||
}
|
}
|
||||||
$this->outputJsonSuccess("Erfolgreich gespeichert!");
|
$this->outputJsonSuccess("Erfolgreich gespeichert!");
|
||||||
}
|
}
|
||||||
@@ -160,4 +169,26 @@ class Rueckstellung extends Auth_Controller
|
|||||||
$this->_uid
|
$this->_uid
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function sendRueckstellungMessage($person_id)
|
||||||
|
{
|
||||||
|
$person = $this->_ci->PersonModel->load($person_id);
|
||||||
|
|
||||||
|
if (hasData($person))
|
||||||
|
{
|
||||||
|
$person = getData($person)[0];
|
||||||
|
|
||||||
|
return $this->messagelib->sendMessageUserTemplate(
|
||||||
|
$person_id,
|
||||||
|
self::ZGV_UEBERPRUEFUNG_MAIL_VORLAGE,
|
||||||
|
array(
|
||||||
|
'anrede' => $person->anrede,
|
||||||
|
'nachname' => $person->nachname
|
||||||
|
),
|
||||||
|
null,
|
||||||
|
getAuthPersonId(),
|
||||||
|
'infocenter'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -82,6 +82,21 @@ function generateCSSsInclude($CSSs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates tags for the style sheets you want to include, the parameter could by a string or an array of strings
|
||||||
|
*/
|
||||||
|
function generatePrintCSS($path)
|
||||||
|
{
|
||||||
|
$cssLink = '<link rel="stylesheet" media="print" href="%s" />';
|
||||||
|
|
||||||
|
$ci =& get_instance();
|
||||||
|
$cachetoken = '?'.$ci->config->item('fhcomplete_build_version');
|
||||||
|
|
||||||
|
if (isset($path)) {
|
||||||
|
echo sprintf($cssLink, base_url($path).$cachetoken) . PHP_EOL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates global JS-Object to pass parms to other javascripts
|
* Generates global JS-Object to pass parms to other javascripts
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -741,7 +741,7 @@ class AnrechnungLib
|
|||||||
$fullname = hasData($result) ? $result->retval[0]->vorname. $result->retval[0]->nachname : '';
|
$fullname = hasData($result) ? $result->retval[0]->vorname. $result->retval[0]->nachname : '';
|
||||||
|
|
||||||
// Return filename
|
// Return filename
|
||||||
return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname;
|
return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname . '.pdf';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function LVhasLector($anrechnung_id)
|
public function LVhasLector($anrechnung_id)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ if (!defined('BASEPATH'))
|
|||||||
exit('No direct script access allowed');
|
exit('No direct script access allowed');
|
||||||
|
|
||||||
use \DateTime as DateTime;
|
use \DateTime as DateTime;
|
||||||
|
use \DateInterval as DateInterval;
|
||||||
use \DOMDocument as DOMDocument;
|
use \DOMDocument as DOMDocument;
|
||||||
use \XSLTProcessor as XSLTProcessor;
|
use \XSLTProcessor as XSLTProcessor;
|
||||||
|
|
||||||
@@ -141,63 +142,6 @@ class CmsLib
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param stdClass $stg_obj
|
|
||||||
*
|
|
||||||
* @return stdClass
|
|
||||||
*/
|
|
||||||
protected function getNewsExtras($stg_obj, $semester)
|
|
||||||
{
|
|
||||||
$this->ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
|
||||||
|
|
||||||
$stg_ltg = $this->ci->StudiengangModel->getLeitungDetailed($stg_obj->studiengang_kz);
|
|
||||||
if (isError($stg_ltg))
|
|
||||||
return $stg_ltg;
|
|
||||||
$stg_ltg = getData($stg_ltg) ?: [];
|
|
||||||
|
|
||||||
$gf_ltg = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
|
|
||||||
if (isError($gf_ltg))
|
|
||||||
return $gf_ltg;
|
|
||||||
$gf_ltg = getData($gf_ltg) ?: [];
|
|
||||||
|
|
||||||
$stv_ltg = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
|
|
||||||
if (isError($stv_ltg))
|
|
||||||
return $stv_ltg;
|
|
||||||
$stv_ltg = getData($stv_ltg) ?: [];
|
|
||||||
|
|
||||||
$ass = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
|
|
||||||
if (isError($ass))
|
|
||||||
return $ass;
|
|
||||||
$ass = getData($ass) ?: [];
|
|
||||||
|
|
||||||
$hochschulvertr = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
|
|
||||||
if (isError($hochschulvertr))
|
|
||||||
return $hochschulvertr;
|
|
||||||
$hochschulvertr = getData($hochschulvertr) ?: [];
|
|
||||||
|
|
||||||
$stdv = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
|
|
||||||
if (isError($stdv))
|
|
||||||
return $stdv;
|
|
||||||
$stdv = getData($stdv) ?: [];
|
|
||||||
|
|
||||||
$jahrgangsvertr = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
|
|
||||||
if (isError($jahrgangsvertr))
|
|
||||||
return $jahrgangsvertr;
|
|
||||||
$jahrgangsvertr = getData($jahrgangsvertr) ?: [];
|
|
||||||
|
|
||||||
return success($this->ci->load->view('Cis/Cms/News/Xml/NewsExtras', [
|
|
||||||
'studiengang' => $stg_obj,
|
|
||||||
'semester' => $semester,
|
|
||||||
'stg_ltg' => $stg_ltg,
|
|
||||||
'gf_ltg' => $gf_ltg,
|
|
||||||
'stv_ltg' => $stv_ltg,
|
|
||||||
'ass' => $ass,
|
|
||||||
'hochschulvertr' => $hochschulvertr,
|
|
||||||
'stdv' => $stdv,
|
|
||||||
'jahrgangsvertr' => $jahrgangsvertr
|
|
||||||
], true));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $studiengang_kz
|
* @param string $studiengang_kz
|
||||||
* @param string $semester
|
* @param string $semester
|
||||||
@@ -233,64 +177,102 @@ class CmsLib
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10, $sprache)
|
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10, $sprache, $filterForDegreePrograms = false, $allowedDegreePrograms = [], $active = true)
|
||||||
|
|
||||||
{
|
{
|
||||||
$this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
$this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||||
list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester);
|
list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester);
|
||||||
$all = $edit;
|
|
||||||
|
|
||||||
$xml = '<?xml version="1.0" encoding="UTF-8"?><content>';
|
|
||||||
|
|
||||||
$this->ci->load->model('content/News_model', 'NewsModel');
|
$this->ci->load->model('content/News_model', 'NewsModel');
|
||||||
$news = $this->ci->NewsModel->getNewsWithContent($sprache, $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen);
|
|
||||||
|
|
||||||
if (isError($news))
|
|
||||||
return $news;
|
|
||||||
|
|
||||||
$news = getData($news);
|
|
||||||
|
|
||||||
|
$news = $this->ci->NewsModel->getNewsWithContent($sprache, $studiengang_kz, $semester, null, $sichtbar, $page, $page_size, $active, $mischen, $filterForDegreePrograms, $allowedDegreePrograms);
|
||||||
|
$news = getData($news) ?? [];
|
||||||
|
$newsWrappers = [];
|
||||||
|
|
||||||
foreach ($news as $newsobj) {
|
foreach ($news as $newsobj) {
|
||||||
if ($studiengang_kz && $edit && !$newsobj->studiengang_kz)
|
if ($studiengang_kz && $edit && !$newsobj->studiengang_kz)
|
||||||
continue;
|
continue;
|
||||||
$date = new DateTime($newsobj->datum);
|
|
||||||
$datum = '<datum><![CDATA[' . $date->format('d.m.Y') . ']]></datum>';
|
$newsWrappers[] = $this->createNewsWrapper($newsobj, $edit);
|
||||||
$datum .= '<datumdetail><![CDATA[' . $date->format('Y-m-d H:i') . ']]></datumdetail>';
|
|
||||||
$id = $edit ? '<news_id><![CDATA[' . $newsobj->news_id . ']]></news_id>' : '';
|
|
||||||
$xml .= "<newswrapper>" . $newsobj->content . $datum . $id . "</newswrapper>";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if ($studiengang_kz != 0) {
|
$content = $this->createNewsContent($newsWrappers, $infoscreen, $titel);
|
||||||
$stg_obj = $this->ci->StudiengangModel->load($studiengang_kz);
|
if (isError($content))
|
||||||
if (isError($stg_obj))
|
return $content;
|
||||||
return $stg_obj;
|
|
||||||
$stg_obj = current(getData($stg_obj) ?: []);
|
|
||||||
|
|
||||||
if ($stg_obj) {
|
return success([
|
||||||
if (!$edit && !$infoscreen) {
|
"content" => getData($content),
|
||||||
$extras = $this->getNewsExtras($stg_obj, $semester);
|
"row_count" => $news[0]->row_count ?? 0
|
||||||
if (isError($extras))
|
]);
|
||||||
return $extras;
|
}
|
||||||
$xml .= getData($extras);
|
|
||||||
}
|
/**
|
||||||
$xml .= '<studiengang_bezeichnung><![CDATA[' . $stg_obj->bezeichnung . ']]></studiengang_bezeichnung>';
|
* Creates a newswrapper XML element from a news item.
|
||||||
}
|
*
|
||||||
} */
|
* @param stdClass $newsobj
|
||||||
|
* @param boolean $edit
|
||||||
|
*
|
||||||
|
* @return DOMElement
|
||||||
|
*/
|
||||||
|
public function createNewsWrapper($newsobj, $edit)
|
||||||
|
{
|
||||||
|
$id = $edit ? '<news_id><![CDATA[' . $newsobj->news_id . ']]></news_id>' : '';
|
||||||
|
$isPublished = $edit ? '<is_published><![CDATA[' . ($newsobj->sichtbar ? 'true' : 'false') . ']]></is_published>' : '';
|
||||||
|
|
||||||
|
$date = new DateTime($newsobj->datum);
|
||||||
|
$datum = '<datum><![CDATA[' . $date->format('d.m.Y') . ']]></datum>';
|
||||||
|
$datum .= '<datumdetail><![CDATA[' . $date->format('Y-m-d H:i') . ']]></datumdetail>';
|
||||||
|
|
||||||
|
$hasVisibleToDate = isset($newsobj->datum_bis) && $newsobj->datum_bis !== '';
|
||||||
|
$datumTo = $hasVisibleToDate
|
||||||
|
? new DateTime($newsobj->datum_bis)
|
||||||
|
: (clone $date)->add(new DateInterval('P' . MAXNEWSALTER . 'D'));
|
||||||
|
if ($hasVisibleToDate)
|
||||||
|
$datumTo->setTime(23, 59, 59);
|
||||||
|
|
||||||
|
$now = new DateTime();
|
||||||
|
$isActive = '<is_active><![CDATA[' . ($datumTo >= $now ? 'true' : 'false') . ']]></is_active>';
|
||||||
|
|
||||||
|
$newsWrapper = new DOMDocument();
|
||||||
|
$newsWrapper->loadXML('<newswrapper>' . $newsobj->content . $datum . $id . $isPublished . $isActive . '</newswrapper>');
|
||||||
|
|
||||||
|
return $newsWrapper->documentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates rendered news content from one or more newswrapper XML elements.
|
||||||
|
*
|
||||||
|
* @param DOMElement|array $newsWrappers
|
||||||
|
* @param boolean $infoscreen
|
||||||
|
* @param string $titel
|
||||||
|
*
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function createNewsContent($newsWrappers, $infoscreen, $titel)
|
||||||
|
{
|
||||||
|
if (!is_array($newsWrappers))
|
||||||
|
$newsWrappers = [$newsWrappers];
|
||||||
|
|
||||||
|
$XML = new DOMDocument('1.0', 'UTF-8');
|
||||||
|
$contentElement = $XML->createElement('content');
|
||||||
|
$XML->appendChild($contentElement);
|
||||||
|
|
||||||
|
foreach ($newsWrappers as $newsWrapper)
|
||||||
|
$contentElement->appendChild($XML->importNode($newsWrapper, true));
|
||||||
|
|
||||||
if ($titel != '') {
|
if ($titel != '') {
|
||||||
$xml .= '<news_titel>' . $titel . '</news_titel>';
|
$titleElement = $XML->createElement('news_titel');
|
||||||
|
$titleElement->appendChild($XML->createTextNode($titel));
|
||||||
|
$contentElement->appendChild($titleElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
$xml .= '</content>';
|
|
||||||
|
|
||||||
//XSLT Vorlage laden
|
//XSLT Vorlage laden
|
||||||
$template = $this->ci->TemplateModel->load($infoscreen ? 'news_infoscreen' : 'news');
|
$template = $this->ci->TemplateModel->load($infoscreen ? 'news_infoscreen' : 'news');
|
||||||
if (isError($template))
|
if (isError($template))
|
||||||
return $template;
|
return $template;
|
||||||
$template = current(getData($template));
|
$template = current(getData($template));
|
||||||
|
|
||||||
$XML = new DOMDocument();
|
|
||||||
$XML->loadXML($xml);
|
|
||||||
|
|
||||||
$xsltemplate = new DOMDocument();
|
$xsltemplate = new DOMDocument();
|
||||||
$xsltemplate->loadXML($template->xslt_xhtml_c4);
|
$xsltemplate->loadXML($template->xslt_xhtml_c4);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,410 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2026 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');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The exam history of one student in one course: the order of the attempts, the attempt count
|
||||||
|
* and the limits. This class is the only source of the examination rules. The controller and the
|
||||||
|
* client only read the result.
|
||||||
|
*/
|
||||||
|
class PruefungsverlaufLib
|
||||||
|
{
|
||||||
|
/** The first attempt: the original assessment, which is the transcript grade itself. */
|
||||||
|
const ROLLE_ERSTANTRITT = 'erstantritt';
|
||||||
|
|
||||||
|
/** Each attempt after the first one. */
|
||||||
|
const ROLLE_PRUEFUNG = 'pruefung';
|
||||||
|
|
||||||
|
/** The last attempt. The examination rules require a commission for it. */
|
||||||
|
const ROLLE_KOMMISSIONELL = 'kommissionell';
|
||||||
|
|
||||||
|
/** Maps an attempt number to the old exam type. Kept for backward compatibility. */
|
||||||
|
private static $_legacyTypen = [1 => 'Termin1', 2 => 'Termin2', 3 => 'Termin3'];
|
||||||
|
|
||||||
|
private $_ci;
|
||||||
|
private $_noteCache = [];
|
||||||
|
private $_specialNotes = null;
|
||||||
|
private $_typen = null;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
$this->_ci->load->model('education/LePruefung_model', 'LePruefungModel');
|
||||||
|
$this->_ci->load->model('education/Note_model', 'NoteModel');
|
||||||
|
$this->_ci->load->model('education/Pruefungstyp_model', 'PruefungstypModel');
|
||||||
|
$this->_ci->load->config('noten');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $lvNote counts as the implicit first attempt while no exam counts
|
||||||
|
* @param mixed $zeugnisNote a credited grade makes all exams impossible
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function getVerlauf($student_uid, $lv_id, $sem_kurzbz, $lvNote = null, $zeugnisNote = null)
|
||||||
|
{
|
||||||
|
return $this->buildVerlauf($this->getPruefungen($student_uid, $lv_id, $sem_kurzbz), $lvNote, $zeugnisNote);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** All exams of one student in one course, in chronological order. @return array */
|
||||||
|
public function getPruefungen($student_uid, $lv_id, $sem_kurzbz)
|
||||||
|
{
|
||||||
|
$result = $this->_ci->LePruefungModel->getPruefungenByUidTypLvStudiensemester($student_uid, null, $lv_id, $sem_kurzbz);
|
||||||
|
if (isError($result) || !hasData($result)) return [];
|
||||||
|
|
||||||
|
return $this->sortPruefungen(getData($result));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sort keys: datum, then tbl_pruefungstyp.sort (old rows without a date), then pruefung_id. */
|
||||||
|
public function sortPruefungen($pruefungen)
|
||||||
|
{
|
||||||
|
$pruefungen = array_values($pruefungen);
|
||||||
|
$typen = $this->getTypen();
|
||||||
|
|
||||||
|
usort($pruefungen, function ($a, $b) use ($typen) {
|
||||||
|
$da = substr((string) $a->datum, 0, 10);
|
||||||
|
$db = substr((string) $b->datum, 0, 10);
|
||||||
|
|
||||||
|
if ($da !== $db) {
|
||||||
|
if ($da === '') return -1;
|
||||||
|
if ($db === '') return 1;
|
||||||
|
return ($da < $db) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sa = isset($typen[$a->pruefungstyp_kurzbz]) ? (int) $typen[$a->pruefungstyp_kurzbz]->sort : 0;
|
||||||
|
$sb = isset($typen[$b->pruefungstyp_kurzbz]) ? (int) $typen[$b->pruefungstyp_kurzbz]->sort : 0;
|
||||||
|
if ($sa !== $sb) return ($sa < $sb) ? -1 : 1;
|
||||||
|
|
||||||
|
return ((int) $a->pruefung_id < (int) $b->pruefung_id) ? -1 : 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
return $pruefungen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the history from a list of exams. Each exam gets: position, zaehlt, antritt_nr (null
|
||||||
|
* if the exam does not count) and terminal.
|
||||||
|
*
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function buildVerlauf($pruefungen, $lvNote = null, $zeugnisNote = null)
|
||||||
|
{
|
||||||
|
$pruefungen = $this->sortPruefungen($pruefungen);
|
||||||
|
|
||||||
|
$antrittCount = 0;
|
||||||
|
$terminal = false;
|
||||||
|
$eintraege = [];
|
||||||
|
|
||||||
|
foreach ($pruefungen as $i => $p) {
|
||||||
|
$zaehlt = $this->zaehltAlsAntritt($p->note, $p->pruefungstyp_kurzbz);
|
||||||
|
if ($zaehlt) $antrittCount++;
|
||||||
|
|
||||||
|
// A kommissionelle exam closes the chain, also if its grade uses no attempt. A student
|
||||||
|
// with a kommissionelle Prüfung gets no further exam from this tool.
|
||||||
|
$kommissionell = $this->istKommissionell($p->pruefungstyp_kurzbz);
|
||||||
|
if ($kommissionell) $terminal = true;
|
||||||
|
|
||||||
|
$eintrag = clone $p;
|
||||||
|
$eintrag->position = $i + 1;
|
||||||
|
$eintrag->zaehlt = $zaehlt;
|
||||||
|
$eintrag->antritt_nr = $zaehlt ? $antrittCount : null;
|
||||||
|
$eintrag->kommissionell = $kommissionell;
|
||||||
|
$eintraege[] = $eintrag;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no exam counts, the course grade itself is the first attempt
|
||||||
|
$implizit = ($antrittCount === 0 && $lvNote !== null && $this->zaehltAlsAntritt($lvNote));
|
||||||
|
if ($implizit) $antrittCount = 1;
|
||||||
|
|
||||||
|
$maxAntritte = $this->getMaxAntritte();
|
||||||
|
|
||||||
|
// credited: the row stays visible, but you cannot enter anything
|
||||||
|
$angerechnet = $this->istAnrechnungsnote($zeugnisNote);
|
||||||
|
|
||||||
|
$verlauf = new stdClass();
|
||||||
|
$verlauf->pruefungen = $eintraege;
|
||||||
|
$verlauf->antrittCount = $antrittCount;
|
||||||
|
$verlauf->maxAntritte = $maxAntritte;
|
||||||
|
$verlauf->terminal = $terminal;
|
||||||
|
$verlauf->angerechnet = $angerechnet;
|
||||||
|
$verlauf->impliziterErstantritt = $implizit;
|
||||||
|
$verlauf->canAdd = !$terminal && !$angerechnet && $antrittCount < $maxAntritte;
|
||||||
|
|
||||||
|
// after the first exam each new entry is a repeat attempt
|
||||||
|
$verlauf->erstantrittMoeglich = !$angerechnet && (count($eintraege) === 0);
|
||||||
|
|
||||||
|
// The last attempt of the chain is kommissionell (§17 Abs 1). The role therefore follows
|
||||||
|
// from the position, and the user interface offers no type to select.
|
||||||
|
if (count($eintraege) === 0 && !$implizit) {
|
||||||
|
$verlauf->naechsteRolle = self::ROLLE_ERSTANTRITT;
|
||||||
|
} elseif (($antrittCount + 1) >= $maxAntritte) {
|
||||||
|
$verlauf->naechsteRolle = self::ROLLE_KOMMISSIONELL;
|
||||||
|
} else {
|
||||||
|
$verlauf->naechsteRolle = self::ROLLE_PRUEFUNG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $verlauf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 'angerechnet' or 'intern angerechnet'. The TRANSCRIPT grade decides. @return bool */
|
||||||
|
public function istAnrechnungsnote($note)
|
||||||
|
{
|
||||||
|
if ($note === null || $note === '') return false;
|
||||||
|
return in_array($note, $this->getSpecialNotes()['anrechnung']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All attempts that count, the kommissionelle attempt included. The explicit configuration
|
||||||
|
* wins. Without it the number comes from the old flags: the original assessment, one attempt
|
||||||
|
* for each active repeat, and the kommissionelle attempt.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getMaxAntritte()
|
||||||
|
{
|
||||||
|
$max = $this->_ci->config->item('CIS_GESAMTNOTE_MAX_ANTRITTE');
|
||||||
|
if (is_numeric($max) && (int) $max > 0) return (int) $max;
|
||||||
|
|
||||||
|
$max = 1;
|
||||||
|
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) $max++;
|
||||||
|
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) $max++;
|
||||||
|
if (defined('CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF') && CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF) $max++;
|
||||||
|
return $max;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The NOTE decides, therefore the same type can occur more than one time. The type decides in
|
||||||
|
* one case only: a type in PRUEFUNG_TYPEN_OHNE_ANTRITT never uses an attempt.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function zaehltAlsAntritt($note, $typ = null)
|
||||||
|
{
|
||||||
|
if ($typ !== null && in_array($typ, $this->getTypenOhneAntritt())) return false;
|
||||||
|
if ($note === null || $note === '') return false;
|
||||||
|
if (in_array($note, $this->getSpecialNotes()['ohneAntritt'])) return false;
|
||||||
|
|
||||||
|
// a credited grade is not an assessment, therefore it uses no attempt
|
||||||
|
if ($this->istAnrechnungsnote($note)) return false;
|
||||||
|
|
||||||
|
$noteRow = $this->getNote($note);
|
||||||
|
return $noteRow ? (bool) $noteRow->lehre : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Tells you if an exam takes place before a commission. @return bool */
|
||||||
|
public function istKommissionell($typ)
|
||||||
|
{
|
||||||
|
$typen = $this->_ci->config->item('PRUEFUNG_KOMMISSIONELL_TYPEN');
|
||||||
|
if (!is_array($typen)) $typen = ['kommPruef', 'zusKommPruef'];
|
||||||
|
return in_array($typ, $typen);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The exam types that never use an attempt. @return array */
|
||||||
|
public function getTypenOhneAntritt()
|
||||||
|
{
|
||||||
|
$typen = $this->_ci->config->item('PRUEFUNG_TYPEN_OHNE_ANTRITT');
|
||||||
|
return is_array($typen) ? $typen : ['zusKommPruef'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type for an attempt number. The student administration still reads this column, so the
|
||||||
|
* value must be correct. The last attempt gets the kommissionelle type, the attempts before it
|
||||||
|
* get the old Termin types.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function legacyTypFuerAntritt($antrittNr)
|
||||||
|
{
|
||||||
|
$antrittNr = max(1, (int) $antrittNr);
|
||||||
|
$typen = $this->getTypen();
|
||||||
|
|
||||||
|
$maxAntritte = $this->getMaxAntritte();
|
||||||
|
$kommissionell = $this->_ci->config->item('PRUEFUNG_TYP_KOMMISSIONELL');
|
||||||
|
if (!is_string($kommissionell) || $kommissionell === '') $kommissionell = 'kommPruef';
|
||||||
|
|
||||||
|
if ($maxAntritte > 1 && $antrittNr >= $maxAntritte && isset($typen[$kommissionell])) {
|
||||||
|
return $kommissionell;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($n = $antrittNr; $n >= 1; $n--) {
|
||||||
|
if (isset(self::$_legacyTypen[$n]) && isset($typen[self::$_legacyTypen[$n]])) {
|
||||||
|
return self::$_legacyTypen[$n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$_legacyTypen[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The old type for a new repeat attempt. It is never lower than Termin2, also if the first
|
||||||
|
* exam does not use an attempt.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function legacyTypFuerWiederholung($verlauf)
|
||||||
|
{
|
||||||
|
return $this->legacyTypFuerAntritt(max(2, $verlauf->antrittCount + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return array{entschuldigt: mixed, ohneAntritt: array, anrechnung: array, limitMap: array} */
|
||||||
|
public function getSpecialNotes()
|
||||||
|
{
|
||||||
|
if ($this->_specialNotes !== null) return $this->_specialNotes;
|
||||||
|
|
||||||
|
$cfgEntschuldigt = $this->_ci->config->item('NOTE_ENTSCHULDIGT');
|
||||||
|
$cfgOhneAntritt = $this->_ci->config->item('NOTEN_OHNE_ANTRITT');
|
||||||
|
$cfgLimitMap = $this->_ci->config->item('NOTEN_OCCURANCE_LIMIT_MAP');
|
||||||
|
$bezeichnungen = $this->_ci->config->item('NOTEN_OHNE_ANTRITT_BEZEICHNUNGEN');
|
||||||
|
if (!is_array($cfgOhneAntritt)) $cfgOhneAntritt = [];
|
||||||
|
if (!is_array($cfgLimitMap)) $cfgLimitMap = [];
|
||||||
|
if (!is_array($bezeichnungen)) $bezeichnungen = [];
|
||||||
|
|
||||||
|
$resEnt = $this->_ci->NoteModel->getEntschuldigtNote();
|
||||||
|
$entschuldigt = (!isError($resEnt) && hasData($resEnt)) ? getData($resEnt)[0]->note : $cfgEntschuldigt;
|
||||||
|
|
||||||
|
// The name wins against the configured key. Do NOT merge the two sets: the same key has a
|
||||||
|
// different meaning in each installation (17 is 'entschuldigt' here, but 'nicht zugelassen'
|
||||||
|
// in the standard data).
|
||||||
|
$ohneAntritt = [];
|
||||||
|
foreach ($bezeichnungen as $bezeichnung) {
|
||||||
|
$note = $this->getNoteByBezeichnung($bezeichnung);
|
||||||
|
if ($note !== null && !in_array($note, $ohneAntritt)) $ohneAntritt[] = $note;
|
||||||
|
}
|
||||||
|
if (count($ohneAntritt) === 0) $ohneAntritt = $cfgOhneAntritt;
|
||||||
|
if ($entschuldigt !== null && !in_array($entschuldigt, $ohneAntritt)) $ohneAntritt[] = $entschuldigt;
|
||||||
|
|
||||||
|
// move the configured limit for 'entschuldigt' to the key that was found
|
||||||
|
$limitMap = [];
|
||||||
|
foreach ($cfgLimitMap as $k => $v) {
|
||||||
|
$limitMap[($k == $cfgEntschuldigt) ? $entschuldigt : $k] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_specialNotes = [
|
||||||
|
'entschuldigt' => $entschuldigt,
|
||||||
|
'ohneAntritt' => array_values($ohneAntritt),
|
||||||
|
'anrechnung' => $this->resolveNoten('NOTEN_ANRECHNUNG_BEZEICHNUNGEN', 'NOTEN_ANRECHNUNG'),
|
||||||
|
'limitMap' => $limitMap
|
||||||
|
];
|
||||||
|
return $this->_specialNotes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The occurrence limit from NOTEN_OCCURANCE_LIMIT_MAP. $excludePruefungId skips the record
|
||||||
|
* that the user edits at this moment.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function ueberschreitetNotenLimit($pruefungen, $note, $excludePruefungId = null)
|
||||||
|
{
|
||||||
|
$limitMap = $this->getSpecialNotes()['limitMap'];
|
||||||
|
|
||||||
|
$limit = null;
|
||||||
|
foreach ($limitMap as $limitNote => $limitVal) {
|
||||||
|
if ($limitNote == $note) { $limit = $limitVal; break; }
|
||||||
|
}
|
||||||
|
if ($limit === null) return false;
|
||||||
|
|
||||||
|
$count = 0;
|
||||||
|
foreach ($pruefungen as $p) {
|
||||||
|
if ($excludePruefungId !== null && $p->pruefung_id == $excludePruefungId) continue;
|
||||||
|
if ($p->note == $note) $count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($count + 1) > $limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** An exam with a later date locks the grade. You can still correct the date. @return bool */
|
||||||
|
public function hatSpaeterenTermin($verlauf, $pruefung_id)
|
||||||
|
{
|
||||||
|
$current = null;
|
||||||
|
foreach ($verlauf->pruefungen as $p) {
|
||||||
|
if ($p->pruefung_id == $pruefung_id) { $current = $p; break; }
|
||||||
|
}
|
||||||
|
if ($current === null) return false;
|
||||||
|
|
||||||
|
foreach ($verlauf->pruefungen as $p) {
|
||||||
|
if ($p->pruefung_id == $current->pruefung_id) continue;
|
||||||
|
if ($p->position > $current->position) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tbl_pruefungstyp as a map. It sorts old rows, and it limits the legacy type to the types
|
||||||
|
* that exist. A type that does not exist breaks the foreign key. Termin3 is absent from the
|
||||||
|
* standard data.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getTypen()
|
||||||
|
{
|
||||||
|
if ($this->_typen !== null) return $this->_typen;
|
||||||
|
|
||||||
|
$this->_typen = [];
|
||||||
|
$result = $this->_ci->PruefungstypModel->load();
|
||||||
|
if (!isError($result) && hasData($result)) {
|
||||||
|
foreach (getData($result) as $typ) {
|
||||||
|
$this->_typen[$typ->pruefungstyp_kurzbz] = $typ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_typen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Finds the grades by their name. The configured keys are the fallback only. @return array */
|
||||||
|
private function resolveNoten($bezeichnungKey, $pkKey)
|
||||||
|
{
|
||||||
|
$bezeichnungen = $this->_ci->config->item($bezeichnungKey);
|
||||||
|
if (!is_array($bezeichnungen)) $bezeichnungen = [];
|
||||||
|
|
||||||
|
$noten = [];
|
||||||
|
foreach ($bezeichnungen as $bezeichnung) {
|
||||||
|
$note = $this->getNoteByBezeichnung($bezeichnung);
|
||||||
|
if ($note !== null && !in_array($note, $noten)) $noten[] = $note;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($noten) === 0) {
|
||||||
|
$fallback = $this->_ci->config->item($pkKey);
|
||||||
|
if (is_array($fallback)) $noten = $fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values($noten);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return stdClass|null
|
||||||
|
*/
|
||||||
|
private function getNote($note)
|
||||||
|
{
|
||||||
|
if (array_key_exists($note, $this->_noteCache)) return $this->_noteCache[$note];
|
||||||
|
|
||||||
|
$result = $this->_ci->NoteModel->load($note);
|
||||||
|
$this->_noteCache[$note] = (!isError($result) && hasData($result)) ? getData($result)[0] : null;
|
||||||
|
return $this->_noteCache[$note];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed|null
|
||||||
|
*/
|
||||||
|
private function getNoteByBezeichnung($bezeichnung)
|
||||||
|
{
|
||||||
|
$result = $this->_ci->NoteModel->loadWhere(['bezeichnung' => $bezeichnung]);
|
||||||
|
return (!isError($result) && hasData($result)) ? getData($result)[0]->note : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@ class SearchBarLib
|
|||||||
const ERROR_NOT_AUTH = 'ERR005';
|
const ERROR_NOT_AUTH = 'ERR005';
|
||||||
|
|
||||||
// List of allowed types of search
|
// List of allowed types of search
|
||||||
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student','studentStv', 'prestudent', 'document', 'cms'];
|
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student','studentStv', 'prestudent', 'document', 'cms', 'lehreinheit', 'lehrveranstaltung'];
|
||||||
|
|
||||||
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
|
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
|
||||||
|
|
||||||
@@ -180,10 +180,14 @@ class SearchBarLib
|
|||||||
protected function buildSearchClause(DB_Model $dbModel, array $columns, $searchstr)
|
protected function buildSearchClause(DB_Model $dbModel, array $columns, $searchstr)
|
||||||
{
|
{
|
||||||
$searchstr = preg_replace('/[[:punct:]]/', ' ', $searchstr);
|
$searchstr = preg_replace('/[[:punct:]]/', ' ', $searchstr);
|
||||||
|
$words = preg_split('/\s+/', trim($searchstr), -1, PREG_SPLIT_NO_EMPTY);
|
||||||
|
|
||||||
|
if (empty($words)) return array();
|
||||||
|
|
||||||
$document = implode(' || \' \' || ', $columns);
|
$document = implode(' || \' \' || ', $columns);
|
||||||
$query = '\'' . implode(':* & ', explode(' ', trim($searchstr))) . ':*\'';
|
$query = '\'' . implode(':* & ', $words) . ':*\'';
|
||||||
$reversequery = '\'*:' . implode(' & *:', explode(' ', trim($searchstr))) . '\'';
|
$reversequery = '\'*:' . implode(' & *:', $words) . '\'';
|
||||||
$nospacequery = '\'' . implode('', explode(' ', trim($searchstr))) . ':*\'';
|
$nospacequery = '\'' . implode('', $words) . ':*\'';
|
||||||
|
|
||||||
$searchclause = <<<EOSC
|
$searchclause = <<<EOSC
|
||||||
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$query}))
|
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$query}))
|
||||||
@@ -596,5 +600,98 @@ EOSC;
|
|||||||
// Otherwise return an empty array
|
// Otherwise return an empty array
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function _lehreinheit($searchstr, $type)
|
||||||
|
{
|
||||||
|
$dbModel = new DB_Model();
|
||||||
|
|
||||||
|
$idwhere = '';
|
||||||
|
if (ctype_digit(trim($searchstr)))
|
||||||
|
{
|
||||||
|
$id = (int)trim($searchstr);
|
||||||
|
$idwhere = ' OR le.lehreinheit_id = ' . $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lehreinheit = $dbModel->execReadOnlyQuery('
|
||||||
|
SELECT
|
||||||
|
\'teachingunit\' AS renderer,
|
||||||
|
\''.$type.'\' AS type,
|
||||||
|
le.lehreinheit_id AS id,
|
||||||
|
le.studiensemester_kurzbz,
|
||||||
|
lv.bezeichnung,
|
||||||
|
\'lv_table_icon icon-\' AS foto,
|
||||||
|
UPPER(stg.typ || stg.kurzbz) AS studiengang,
|
||||||
|
le.lehrform_kurzbz,
|
||||||
|
lv.semester
|
||||||
|
FROM lehre.tbl_lehreinheit le
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung lv ON (lv.lehrveranstaltung_id = le.lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang stg ON (stg.studiengang_kz = lv.studiengang_kz)
|
||||||
|
JOIN public.tbl_studiensemester sem ON (sem.studiensemester_kurzbz = le.studiensemester_kurzbz)
|
||||||
|
WHERE (' .
|
||||||
|
$this->buildSearchClause(
|
||||||
|
$dbModel,
|
||||||
|
array(
|
||||||
|
'(stg.typ || stg.kurzbz)',
|
||||||
|
'lv.semester',
|
||||||
|
'lv.bezeichnung'
|
||||||
|
),
|
||||||
|
$searchstr
|
||||||
|
) . ')' . $idwhere . '
|
||||||
|
');
|
||||||
|
|
||||||
|
// If something has been found then return it
|
||||||
|
if (hasData($lehreinheit)) return getData($lehreinheit);
|
||||||
|
|
||||||
|
// Otherwise return an empty array
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _lehrveranstaltung($searchstr, $type)
|
||||||
|
{
|
||||||
|
$dbModel = new DB_Model();
|
||||||
|
|
||||||
|
$idwhere = '';
|
||||||
|
|
||||||
|
if (ctype_digit(trim($searchstr)))
|
||||||
|
{
|
||||||
|
$id = (int)trim($searchstr);
|
||||||
|
$idwhere = ' OR tbl_lehrveranstaltung.lehrveranstaltung_id = ' . $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lehreinheit = $dbModel->execReadOnlyQuery('
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
\'teachingunit\' AS renderer,
|
||||||
|
\''.$type.'\' AS type,
|
||||||
|
lehrveranstaltung_id as id,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung,
|
||||||
|
\'lv_table_icon icon-lv\' as foto,
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as studiengang,
|
||||||
|
semester,
|
||||||
|
lehrform_kurzbz,
|
||||||
|
tbl_organisationseinheit.bezeichnung as oe_bezeichnung
|
||||||
|
FROM lehre.tbl_lehrveranstaltung
|
||||||
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
JOIN public.tbl_organisationseinheit ON tbl_lehrveranstaltung.oe_kurzbz = tbl_organisationseinheit.oe_kurzbz
|
||||||
|
WHERE (' .
|
||||||
|
$this->buildSearchClause(
|
||||||
|
$dbModel,
|
||||||
|
array(
|
||||||
|
'(tbl_studiengang.typ || tbl_studiengang.kurzbz)',
|
||||||
|
'semester',
|
||||||
|
'tbl_lehrveranstaltung.bezeichnung'
|
||||||
|
),
|
||||||
|
$searchstr
|
||||||
|
) . ')' . $idwhere . '
|
||||||
|
');
|
||||||
|
|
||||||
|
// If something has been found then return it
|
||||||
|
if (hasData($lehreinheit)) return getData($lehreinheit);
|
||||||
|
|
||||||
|
// Otherwise return an empty array
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ class StundenplanLib
|
|||||||
return $stundenplan_data;
|
return $stundenplan_data;
|
||||||
$stundenplan_data = getData($stundenplan_data) ?? [];
|
$stundenplan_data = getData($stundenplan_data) ?? [];
|
||||||
|
|
||||||
|
$this->_ci->addMeta("stundenplanData", $stundenplan_data);
|
||||||
$function_error = $this->expandObjectInformation($stundenplan_data);
|
$function_error = $this->expandObjectInformation($stundenplan_data);
|
||||||
if ($function_error)
|
if ($function_error)
|
||||||
return $function_error;
|
return $function_error;
|
||||||
@@ -391,6 +392,39 @@ class StundenplanLib
|
|||||||
$item->gruppe = $gruppe_obj_array;
|
$item->gruppe = $gruppe_obj_array;
|
||||||
$item->lektor = $lektor_obj_array;
|
$item->lektor = $lektor_obj_array;
|
||||||
|
|
||||||
|
$this->_ci->load->library('PermissionLib');
|
||||||
|
$berechtigt_begrenzt = $this->_ci->permissionlib->isBerechtigt('lehre/reservierung:begrenzt', 'sui');
|
||||||
|
|
||||||
|
$now = time();
|
||||||
|
$res_lektor_start = $this->jump_day($now, RES_TAGE_LEKTOR_MIN - 1);
|
||||||
|
$res_lektor_ende = mktime(0, 0, 0, date('m', $now), date('d', $now) + RES_TAGE_LEKTOR_BIS, date('Y', $now));
|
||||||
|
|
||||||
|
$start_date = is_numeric($item->beginn) ? $item->beginn : strtotime($item->beginn);
|
||||||
|
if (!date('w', $start_date)) {
|
||||||
|
$start_date = $this->jump_day($start_date, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$start_date_str = date('Y-m-d', $start_date);
|
||||||
|
$res_lektor_start_str = date('Y-m-d', $res_lektor_start);
|
||||||
|
$res_lektor_ende_str = date('Y-m-d', $res_lektor_ende);
|
||||||
|
|
||||||
|
$show_delete = (
|
||||||
|
(
|
||||||
|
$berechtigt_begrenzt &&
|
||||||
|
(
|
||||||
|
(isset($item->insertvon) && $item->insertvon == getAuthUID()) ||
|
||||||
|
(isset($item->uids) && in_array(getAuthUID(), $item->uids))
|
||||||
|
)
|
||||||
|
) &&
|
||||||
|
$start_date_str >= $res_lektor_start_str &&
|
||||||
|
$start_date_str <= $res_lektor_ende_str
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($show_delete)
|
||||||
|
$item->deletable = true;
|
||||||
|
else
|
||||||
|
$item->deletable = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,6 +520,212 @@ class StundenplanLib
|
|||||||
return success($stundenplan_data);
|
return success($stundenplan_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addReservation($start, $end, $title, $beschreibung, $ort_kurzbz, $lektoren = null, $studiengang = null, $semester = null, $verband = null, $gruppe = null, $spezialgruppe = null)
|
||||||
|
{
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
$this->_ci->load->model('ressource/Stunde_model', 'StundeModel');
|
||||||
|
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||||
|
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
|
||||||
|
$this->_ci->load->model('ressource/stundenplan_model', 'StundenplanModel');
|
||||||
|
$this->_ci->load->library('PermissionLib');
|
||||||
|
|
||||||
|
$startTime = new DateTime($start);
|
||||||
|
$endTime = new DateTime($end);
|
||||||
|
|
||||||
|
$stunden = $this->_ci->StundeModel->loadWhere(array(
|
||||||
|
'beginn <' => $endTime->format('H:i:s'),
|
||||||
|
'ende >' => $startTime->format('H:i:s')
|
||||||
|
));
|
||||||
|
|
||||||
|
if (!hasData($stunden))
|
||||||
|
{
|
||||||
|
return error("Keine Stunden vorhanden");
|
||||||
|
}
|
||||||
|
|
||||||
|
$stunden = array_column(getData($stunden), 'stunde');
|
||||||
|
|
||||||
|
$this->_ci->StundenplandevModel->db->select('1');
|
||||||
|
$this->_ci->StundenplandevModel->db->where('datum', $startTime->format('Y-m-d'));
|
||||||
|
$this->_ci->StundenplandevModel->db->where('ort_kurzbz', $ort_kurzbz);
|
||||||
|
$this->_ci->StundenplandevModel->db->where_in('stunde', $stunden);
|
||||||
|
$stundenplandev_belegung = $this->_ci->StundenplandevModel->load();
|
||||||
|
|
||||||
|
$this->_ci->StundenplanModel->db->select('1');
|
||||||
|
$this->_ci->StundenplanModel->db->where('ort_kurzbz', $ort_kurzbz);
|
||||||
|
$this->_ci->StundenplanModel->db->where('datum', $startTime->format('Y-m-d'));
|
||||||
|
$this->_ci->StundenplanModel->db->where_in('stunde', $stunden);
|
||||||
|
$stundenplan_belegung = $this->_ci->StundenplanModel->load();
|
||||||
|
|
||||||
|
if ((hasData($stundenplandev_belegung) || hasData($stundenplan_belegung))
|
||||||
|
&& !$this->_ci->permissionlib->isBerechtigt('lehre/reservierungAdvanced'))
|
||||||
|
return error ('lvplan/bereitsReserviert');
|
||||||
|
|
||||||
|
$this->_ci->ReservierungModel->addSelect('stunde');
|
||||||
|
$reservation_hours = $this->_ci->ReservierungModel->loadWhere(array('datum' => $startTime->format('Y-m-d'), 'ort_kurzbz' => $ort_kurzbz));
|
||||||
|
|
||||||
|
|
||||||
|
if (isError($reservation_hours))
|
||||||
|
return $reservation_hours;
|
||||||
|
|
||||||
|
$reservation_hours = hasData($reservation_hours) ? array_column(getData($reservation_hours), 'stunde') : array();
|
||||||
|
|
||||||
|
if (!empty(array_intersect($stunden, $reservation_hours))
|
||||||
|
&& !$this->_ci->permissionlib->isBerechtigt('lehre/reservierungAdvanced'))
|
||||||
|
return error("lvplan/bereitsReserviert");
|
||||||
|
|
||||||
|
|
||||||
|
if (!empty($lektoren))
|
||||||
|
{
|
||||||
|
foreach ($lektoren as $lektor)
|
||||||
|
{
|
||||||
|
$insert = array('ort_kurzbz' => $ort_kurzbz,
|
||||||
|
'datum' => $startTime->format('Y-m-d'),
|
||||||
|
'titel' => $title,
|
||||||
|
'studiengang_kz' => is_null($studiengang) ? 0 : $studiengang,
|
||||||
|
'beschreibung' => $beschreibung,
|
||||||
|
'insertvon' => getAuthUID(),
|
||||||
|
'uid' => $lektor,
|
||||||
|
'semester' => is_null($semester) ? null : $semester,
|
||||||
|
'verband' => is_null($verband) ? null : $verband,
|
||||||
|
'gruppe' => is_null($gruppe) ? null : $gruppe,
|
||||||
|
'gruppe_kurzbz' => is_null($spezialgruppe) ? null : $spezialgruppe,
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($stunden as $stunde)
|
||||||
|
{
|
||||||
|
$insert['stunde'] = $stunde;
|
||||||
|
$check_insert = $this->_ci->ReservierungModel->insert($insert);
|
||||||
|
if (isError($check_insert))
|
||||||
|
return $check_insert;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach ($stunden as $stunde)
|
||||||
|
{
|
||||||
|
$check_insert = $this->_ci->ReservierungModel->insert(array(
|
||||||
|
'ort_kurzbz' => $ort_kurzbz,
|
||||||
|
'uid' => getAuthUID(),
|
||||||
|
'stunde' => $stunde,
|
||||||
|
'datum' => $startTime->format('Y-m-d'),
|
||||||
|
'titel' => $title,
|
||||||
|
'studiengang_kz' => is_null($studiengang) ? 0 : $studiengang,
|
||||||
|
'beschreibung' => $beschreibung,
|
||||||
|
'insertvon' => getAuthUID()
|
||||||
|
));
|
||||||
|
if (isError($check_insert))
|
||||||
|
return $check_insert;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success("Erfolgreich");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteReservation($reservierung_id)
|
||||||
|
{
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||||
|
$this->_ci->load->model('ressource/Stunde_model', 'StundeModel');
|
||||||
|
$this->_ci->load->library('PermissionLib');
|
||||||
|
|
||||||
|
|
||||||
|
$this->_ci->ReservierungModel->db->where_in('reservierung_id', $reservierung_id);
|
||||||
|
$reservation = $this->_ci->ReservierungModel->load();
|
||||||
|
if (isError($reservation))
|
||||||
|
return $reservation;
|
||||||
|
|
||||||
|
if (!hasData($reservation))
|
||||||
|
return error("Reservierungen nicht gefunden");
|
||||||
|
|
||||||
|
$reservations = getData($reservation);
|
||||||
|
|
||||||
|
$today = new DateTime();
|
||||||
|
foreach ($reservations as $reservierung)
|
||||||
|
{
|
||||||
|
if ($today->format('Y-m-d') > $reservierung->datum)
|
||||||
|
return error("Vergangene Reservierungen können nicht gelöscht werden");
|
||||||
|
|
||||||
|
if (($this->_ci->permissionlib->isBerechtigt('lehre/reservierung:begrenzt')) && ($reservierung->insertvon == getAuthUID() || $reservierung->uid === getAuthUID()))
|
||||||
|
{
|
||||||
|
$delete_result = $this->_ci->ReservierungModel->delete($reservierung->reservierung_id);
|
||||||
|
|
||||||
|
if (isError($delete_result))
|
||||||
|
return $delete_result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success("Erfolgreich");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getReservableMap($ort_kurzbz, $start_date, $end_date)
|
||||||
|
{
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
$this->_ci->load->model('ressource/Ort_model', 'OrtModel');
|
||||||
|
$this->_ci->load->library('PermissionLib');
|
||||||
|
|
||||||
|
$berechtigt_begrenzt = $this->_ci->permissionlib->isBerechtigt('lehre/reservierung:begrenzt', 'suid');
|
||||||
|
$berechtigt_erweitert = $this->_ci->permissionlib->isBerechtigt('lehre/reservierung', 'suid');
|
||||||
|
|
||||||
|
$ort_data = $this->_ci->OrtModel->load($ort_kurzbz);
|
||||||
|
if (isError($ort_data) || !hasData($ort_data))
|
||||||
|
return [];
|
||||||
|
|
||||||
|
$ort_data = getData($ort_data)[0];
|
||||||
|
|
||||||
|
if (!$ort_data->reservieren)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
if (!$berechtigt_begrenzt && !$berechtigt_erweitert)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
$start_ts = is_numeric($start_date) ? (int)$start_date : strtotime($start_date);
|
||||||
|
$end_ts = is_numeric($end_date) ? (int)$end_date : strtotime($end_date);
|
||||||
|
|
||||||
|
if (!$start_ts || !$end_ts)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
if ($end_ts < $start_ts)
|
||||||
|
{
|
||||||
|
$tmp = $start_ts;
|
||||||
|
$start_ts = $end_ts;
|
||||||
|
$end_ts = $tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
$now = time();
|
||||||
|
$tage_min = defined('RES_TAGE_LEKTOR_MIN') ? (int)RES_TAGE_LEKTOR_MIN : 0;
|
||||||
|
$tage_bis = defined('RES_TAGE_LEKTOR_BIS') ? (int)RES_TAGE_LEKTOR_BIS : 0;
|
||||||
|
|
||||||
|
$datum_res_lektor_start = $this->jump_day($now, $tage_min - 1);
|
||||||
|
$datum_res_lektor_ende = $this->jump_day($now, $tage_bis);
|
||||||
|
|
||||||
|
$start_ymd_allowed = date('Y-m-d', $datum_res_lektor_start);
|
||||||
|
$end_ymd_allowed = date('Y-m-d', $datum_res_lektor_ende);
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
$current = strtotime(date('Y-m-d', $start_ts) . ' 00:00:00');
|
||||||
|
$end_day = strtotime(date('Y-m-d', $end_ts) . ' 00:00:00');
|
||||||
|
|
||||||
|
while ($current <= $end_day)
|
||||||
|
{
|
||||||
|
$ymd = date('Y-m-d', $current);
|
||||||
|
|
||||||
|
$result[$ymd] = ($ymd >= $start_ymd_allowed && $ymd <= $end_ymd_allowed) ? true : false;
|
||||||
|
|
||||||
|
$current = $this->jump_day($current, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function jump_day($timestamp, $days)
|
||||||
|
{
|
||||||
|
$days = (int)$days;
|
||||||
|
$prefix = ($days >= 0 ? '+' : '');
|
||||||
|
return strtotime($prefix . $days . ' days', $timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
// start of the private functions ########################################################################################################
|
// start of the private functions ########################################################################################################
|
||||||
|
|
||||||
// function used to sort an array of studiensemester strings
|
// function used to sort an array of studiensemester strings
|
||||||
|
|||||||
@@ -159,8 +159,6 @@ class LvVwLib
|
|||||||
if (!$stg->mischform)
|
if (!$stg->mischform)
|
||||||
return [];
|
return [];
|
||||||
|
|
||||||
$this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
|
|
||||||
|
|
||||||
return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
|
return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,18 +31,20 @@ class Vertrag_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz)
|
public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
$person_id = (isset($person_id) && is_numeric($person_id))
|
$vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung';
|
||||||
|
|
||||||
|
$person_id = (isset($person_id) && is_numeric($person_id))
|
||||||
? $person_id
|
? $person_id
|
||||||
: show_error('peron_id must be set and numeric.');
|
: show_error('peron_id must be set and numeric.');
|
||||||
$lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id))
|
|
||||||
? $lehreinheit_id
|
|
||||||
: show_error('lehreinheit_id must be set and numeric.');
|
|
||||||
$lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id))
|
$lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id))
|
||||||
? $lehrveranstaltung_id
|
? $lehrveranstaltung_id
|
||||||
: show_error('lehrveranstaltung_id must be set and numeric.');
|
: show_error('lehrveranstaltung_id must be set and numeric.');
|
||||||
$projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id))
|
$projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id))
|
||||||
? $projektarbeit_id
|
? $projektarbeit_id
|
||||||
: null;
|
: null;
|
||||||
|
$lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id))
|
||||||
|
? $lehreinheit_id
|
||||||
|
: (($vertragstyp_kurzbz == 'Betreuung') ? null : show_error('lehreinheit_id must be set and numeric.'));
|
||||||
$vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden))
|
$vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden))
|
||||||
? $vertragsstunden
|
? $vertragsstunden
|
||||||
: 0;
|
: 0;
|
||||||
@@ -53,7 +55,7 @@ class Vertrag_model extends DB_Model
|
|||||||
? $mitarbeiter_uid
|
? $mitarbeiter_uid
|
||||||
: show_error('mitarbeiter_uid must be set and a string value.');;
|
: show_error('mitarbeiter_uid must be set and a string value.');;
|
||||||
|
|
||||||
$vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung';
|
|
||||||
|
|
||||||
// First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag
|
// First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag
|
||||||
if ($vertragstyp_kurzbz == 'Lehrauftrag')
|
if ($vertragstyp_kurzbz == 'Lehrauftrag')
|
||||||
@@ -257,7 +259,7 @@ class Vertrag_model extends DB_Model
|
|||||||
}
|
}
|
||||||
elseif ($vertragstyp_kurzbz == 'Betreuung')
|
elseif ($vertragstyp_kurzbz == 'Betreuung')
|
||||||
{
|
{
|
||||||
$this->addSelect('lehreinheit_id');
|
$this->addSelect('lehreinheit_id, lehre.tbl_projektarbeit.lehrveranstaltung_id, lehre.tbl_projektarbeit.studiensemester_kurzbz');
|
||||||
$this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id');
|
$this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id');
|
||||||
$this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id');
|
$this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id');
|
||||||
if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id)))
|
if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id)))
|
||||||
@@ -281,17 +283,22 @@ class Vertrag_model extends DB_Model
|
|||||||
{
|
{
|
||||||
if ($result = getData($this->getLehreinheitID($vertrag_id)))
|
if ($result = getData($this->getLehreinheitID($vertrag_id)))
|
||||||
{
|
{
|
||||||
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
if (!empty($result[0]->lehreinheit_id))
|
||||||
$this->LehreinheitModel->addSelect($select);
|
{
|
||||||
|
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||||
|
$this->LehreinheitModel->addSelect($select);
|
||||||
|
|
||||||
if($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id))
|
if ($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id))
|
||||||
{
|
{
|
||||||
return success($result->retval);
|
return success($result->retval);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return error('Fehler beim Laden der Lehreinheit');
|
return error('Fehler beim Laden der Lehreinheit');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return success($result);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -563,14 +570,13 @@ SELECT
|
|||||||
null::integer as pruefung_id,
|
null::integer as pruefung_id,
|
||||||
projektarbeit_id,
|
projektarbeit_id,
|
||||||
(tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
|
(tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
|
||||||
tbl_lehreinheit.studiensemester_kurzbz,
|
tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
tbl_projektbetreuer.betreuerart_kurzbz,
|
tbl_projektbetreuer.betreuerart_kurzbz,
|
||||||
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
||||||
as bezeichnung
|
as bezeichnung
|
||||||
FROM
|
FROM
|
||||||
lehre.tbl_projektbetreuer
|
lehre.tbl_projektbetreuer
|
||||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
|
||||||
WHERE
|
WHERE
|
||||||
tbl_projektbetreuer.person_id=?
|
tbl_projektbetreuer.person_id=?
|
||||||
AND vertrag_id IS NULL
|
AND vertrag_id IS NULL
|
||||||
@@ -619,14 +625,13 @@ SELECT
|
|||||||
null::integer as pruefung_id,
|
null::integer as pruefung_id,
|
||||||
projektarbeit_id,
|
projektarbeit_id,
|
||||||
(tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
|
(tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
|
||||||
tbl_lehreinheit.studiensemester_kurzbz,
|
tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
tbl_projektbetreuer.betreuerart_kurzbz,
|
tbl_projektbetreuer.betreuerart_kurzbz,
|
||||||
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
||||||
as bezeichnung, vertrag_id
|
as bezeichnung, vertrag_id
|
||||||
FROM
|
FROM
|
||||||
lehre.tbl_projektbetreuer
|
lehre.tbl_projektbetreuer
|
||||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
|
||||||
WHERE
|
WHERE
|
||||||
tbl_projektbetreuer.person_id=?
|
tbl_projektbetreuer.person_id=?
|
||||||
AND vertrag_id = ?
|
AND vertrag_id = ?
|
||||||
|
|||||||
@@ -11,4 +11,73 @@ class Mobilitaet_model extends DB_Model
|
|||||||
$this->dbTable = 'bis.tbl_mobilitaet';
|
$this->dbTable = 'bis.tbl_mobilitaet';
|
||||||
$this->pk = 'mobilitaet_id';
|
$this->pk = 'mobilitaet_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMobilityZusatzForUids($uids) {
|
||||||
|
$qry = "SELECT distinct on(nachname, vorname, public.tbl_benutzer.person_id) uid,
|
||||||
|
tbl_mitarbeiter.mitarbeiter_uid,
|
||||||
|
tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung,
|
||||||
|
tbl_mobilitaet.mobilitaetstyp_kurzbz,
|
||||||
|
(CASE WHEN bis.tbl_mobilitaet.studiensemester_kurzbz = vw_student_lehrveranstaltung.studiensemester_kurzbz THEN 1 ELSE 0 END) as doubledegree,
|
||||||
|
public.tbl_prestudent.gsstudientyp_kurzbz as ddtype,
|
||||||
|
(SELECT status_kurzbz FROM public.tbl_prestudentstatus
|
||||||
|
WHERE prestudent_id=tbl_student.prestudent_id
|
||||||
|
ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus
|
||||||
|
FROM
|
||||||
|
campus.vw_student_lehrveranstaltung
|
||||||
|
JOIN public.tbl_benutzer USING(uid)
|
||||||
|
JOIN public.tbl_person USING(person_id)
|
||||||
|
LEFT JOIN public.tbl_student ON(uid=student_uid)
|
||||||
|
LEFT JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid)
|
||||||
|
LEFT JOIN public.tbl_studentlehrverband USING(student_uid,studiensemester_kurzbz)
|
||||||
|
LEFT JOIN lehre.tbl_zeugnisnote on(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
|
||||||
|
AND tbl_zeugnisnote.student_uid=tbl_student.student_uid
|
||||||
|
AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz)
|
||||||
|
LEFT JOIN lehre.tbl_note USING (note)
|
||||||
|
LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid)
|
||||||
|
LEFT JOIN public.tbl_studiengang ON(tbl_student.studiengang_kz=tbl_studiengang.studiengang_kz)
|
||||||
|
LEFT JOIN bis.tbl_mobilitaet USING(prestudent_id)
|
||||||
|
LEFT JOIN public.tbl_prestudent USING(prestudent_id)
|
||||||
|
WHERE uid IN ?";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, [$uids]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function formatZusatz($entry, $erhalter_kz) {
|
||||||
|
$zusatz = '';
|
||||||
|
|
||||||
|
if (isset($entry->studienstatus) && $entry->studienstatus === 'Incoming') {
|
||||||
|
$zusatz = '(i)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($entry->lkt_ueberschreibbar) && $entry->lkt_ueberschreibbar === false) {
|
||||||
|
$zusatz .= ' (' . ($entry->anmerkung ?? '') . ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($entry->mitarbeiter_uid) && $entry->mitarbeiter_uid !== null) {
|
||||||
|
$zusatz .= ' (ma)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($entry->stg_kz_student) && $entry->stg_kz_student == $erhalter_kz) {
|
||||||
|
$zusatz .= ' (a.o.)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
isset($entry->mobilitaetstyp_kurzbz) && $entry->mobilitaetstyp_kurzbz &&
|
||||||
|
isset($entry->doubledegree) && $entry->doubledegree === 1
|
||||||
|
) {
|
||||||
|
$zusatz .= ' (d.d.';
|
||||||
|
|
||||||
|
$ddtype = $entry->ddtype ?? null;
|
||||||
|
|
||||||
|
if ($ddtype == 'Intern') {
|
||||||
|
$zusatz .= 'i.)';
|
||||||
|
} elseif ($ddtype == 'Extern') {
|
||||||
|
$zusatz .= 'o.)';
|
||||||
|
} else {
|
||||||
|
$zusatz .= ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $zusatz;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,14 +20,16 @@ class News_model extends DB_Model
|
|||||||
public function getAll($limit = null)
|
public function getAll($limit = null)
|
||||||
{
|
{
|
||||||
$this->addJoin("campus.tbl_content","content_id");
|
$this->addJoin("campus.tbl_content","content_id");
|
||||||
|
|
||||||
return $this->execReadOnlyQuery('
|
return $this->execReadOnlyQuery('
|
||||||
SELECT *, TO_CHAR(campus.tbl_news.datum, ?) as datumformatted
|
SELECT *, TO_CHAR(campus.tbl_news.datum, ?) as datumformatted
|
||||||
FROM campus.tbl_news
|
FROM campus.tbl_news
|
||||||
JOIN campus.tbl_content content ON content.content_id = campus.tbl_news.content_id
|
JOIN campus.tbl_content content ON content.content_id = campus.tbl_news.content_id
|
||||||
WHERE
|
WHERE
|
||||||
--text IS NOT NULL AND
|
--text IS NOT NULL AND
|
||||||
datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date)
|
datum <= NOW() AND (datum_bis >= NOW()::date OR datum_bis IS NULL) AND
|
||||||
ORDER BY datum DESC
|
(NOW()-datum) < interval \'' . MAXNEWSALTER . ' days\'
|
||||||
|
ORDER BY datum DESC, campus.tbl_news.updateamum DESC
|
||||||
LIMIT ' . $this->escape($limit)
|
LIMIT ' . $this->escape($limit)
|
||||||
, ['DD/MM/YYYY']);
|
, ['DD/MM/YYYY']);
|
||||||
}
|
}
|
||||||
@@ -48,31 +50,28 @@ class News_model extends DB_Model
|
|||||||
* @param integer | null $semester
|
* @param integer | null $semester
|
||||||
* @param string $fachbereich_kurzbz
|
* @param string $fachbereich_kurzbz
|
||||||
* @param boolean $sichtbar
|
* @param boolean $sichtbar
|
||||||
* @param integer $maxalter
|
|
||||||
* @param integer $page
|
* @param integer $page
|
||||||
* @param integer $page_size
|
* @param integer $page_size
|
||||||
* @param boolean $all
|
* @param boolean $active
|
||||||
* @param boolean $mischen
|
* @param boolean $mischen
|
||||||
*
|
*
|
||||||
* TODO(chris): this is not a good function -> the params are all over the place
|
* TODO(chris): this is not a good function -> the params are all over the place
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
protected function prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true)
|
protected function prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $page = 1, $page_size = 10, $active = true, $mischen = true, $filterForDegreePrograms = false, $allowedDegreePrograms = [])
|
||||||
{
|
{
|
||||||
|
|
||||||
|
$this->addSelect(["*", "COUNT(*) OVER() AS row_count"]);
|
||||||
$this->addOrder('datum', 'DESC');
|
$this->addOrder('datum', 'DESC');
|
||||||
|
$this->addOrder('tbl_news.updateamum', 'DESC');
|
||||||
|
|
||||||
$studiengang_kz = trim($studiengang_kz);
|
$studiengang_kz = trim($studiengang_kz);
|
||||||
$fachbereich_kurzbz = trim($fachbereich_kurzbz);
|
$fachbereich_kurzbz = trim($fachbereich_kurzbz);
|
||||||
|
|
||||||
$where = [];
|
$where = [];
|
||||||
if (trim($maxalter) != '0') {
|
|
||||||
$where[] = "(now()-datum) < interval " . $this->db->escape($maxalter) . " days";
|
if ($active) {
|
||||||
|
$where[] = "(datum <= NOW()::date AND (datum_bis >= NOW()::date OR (datum_bis IS NULL AND (NOW()-datum) < interval '" . MAXNEWSALTER . " days')))";
|
||||||
}
|
|
||||||
if (!$all) {
|
|
||||||
$where[] = "datum <= now()";
|
|
||||||
$where[] = "(datum_bis >= now()::date OR datum_bis IS NULL)";
|
|
||||||
}
|
}
|
||||||
if ($fachbereich_kurzbz != '*') {
|
if ($fachbereich_kurzbz != '*') {
|
||||||
if ($fachbereich_kurzbz == '') {
|
if ($fachbereich_kurzbz == '') {
|
||||||
@@ -82,27 +81,54 @@ class News_model extends DB_Model
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($studiengang_kz == '0') {
|
|
||||||
$where[] = "studiengang_kz = " . $this->db->escape($studiengang_kz);
|
|
||||||
|
|
||||||
if ($semester === NULL)
|
$sgAndSemesterCondition = [];
|
||||||
$where[] = "semester IS NULL";
|
|
||||||
elseif ($semester === 0)
|
|
||||||
$where[] = "semester = 0";
|
|
||||||
} elseif ($studiengang_kz != '') {
|
|
||||||
$add = $mischen === true ? " OR (studiengang_kz = 0 AND semester IS NULL)" : "";
|
|
||||||
$where[] = "((studiengang_kz = " . $this->db->escape($studiengang_kz) . " AND semester = " . $this->db->escape($semester) . ") OR (studiengang_kz = " . $this->db->escape($studiengang_kz) . " AND semester = 0) OR (studiengang_kz = 0 AND semester = " . $this->db->escape($semester) . ")" . $add . ")";
|
|
||||||
|
|
||||||
|
if ($studiengang_kz !== '') {
|
||||||
|
$sgAndSemesterCondition[] = 'studiengang_kz = ' . $this->db->escape($studiengang_kz);
|
||||||
}
|
}
|
||||||
|
if ($semester !== null && $semester !== 0) {
|
||||||
|
$sgAndSemesterCondition[] = 'semester = ' . $this->db->escape($semester);
|
||||||
|
}
|
||||||
|
|
||||||
|
$targetedSgAndSemesterCondition = [];
|
||||||
|
|
||||||
|
if (!empty($sgAndSemesterCondition)) {
|
||||||
|
$targetedSgAndSemesterCondition[] = '(' . implode(' AND ', $sgAndSemesterCondition) . ')';
|
||||||
|
}
|
||||||
|
if ($mischen === true) {
|
||||||
|
$targetedSgAndSemesterCondition[] = '(studiengang_kz = 0 AND (semester = 0 OR semester IS NULL))';
|
||||||
|
|
||||||
|
if ($semester !== null && $semester !== 0) {
|
||||||
|
$targetedSgAndSemesterCondition[] = '(studiengang_kz = 0 AND semester = ' . $this->db->escape($semester) . ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$finalSgAndSemesterCondition = implode(' OR ', $targetedSgAndSemesterCondition);
|
||||||
|
|
||||||
|
if ($finalSgAndSemesterCondition !== '') {
|
||||||
|
$where[] = "(" . $finalSgAndSemesterCondition . ")";
|
||||||
|
}
|
||||||
|
|
||||||
$this->addJoin('campus.tbl_contentsprache cs', 'content_id');
|
$this->addJoin('campus.tbl_contentsprache cs', 'content_id');
|
||||||
|
|
||||||
$where[] = "cs.sichtbar = " . ($sichtbar ? "true" : "false");
|
if (is_bool($sichtbar) || $sichtbar === 'true' || $sichtbar === 'false') {
|
||||||
|
$isSichtbar = filter_var($sichtbar, FILTER_VALIDATE_BOOLEAN);
|
||||||
|
$where[] = "cs.sichtbar = " . ($isSichtbar ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
$where[] = "cs.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END)";
|
$where[] = "cs.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END)";
|
||||||
|
|
||||||
|
|
||||||
$where[] = "cs.version = (SELECT MAX(version) FROM campus.tbl_contentsprache cs3 WHERE cs3.content_id=" . $this->dbTable . ".content_id AND cs3.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END))";
|
$where[] = "cs.version = (SELECT MAX(version) FROM campus.tbl_contentsprache cs3 WHERE cs3.content_id=" . $this->dbTable . ".content_id AND cs3.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END))";
|
||||||
|
|
||||||
|
if ($filterForDegreePrograms) {
|
||||||
|
if (empty($allowedDegreePrograms)) {
|
||||||
|
$where[] = "1=0";
|
||||||
|
} else {
|
||||||
|
$where[] = "studiengang_kz IN (" . implode(',', array_map([$this->db, 'escape'], $allowedDegreePrograms)) . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$where = implode(" AND ", $where);
|
$where = implode(" AND ", $where);
|
||||||
|
|
||||||
@@ -110,25 +136,16 @@ class News_model extends DB_Model
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true)
|
public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $page = 1, $page_size = 10, $active = true, $mischen = true, $filterForDegreePrograms = false, $allowedDegreePrograms = [])
|
||||||
{
|
{
|
||||||
$this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen);
|
$this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $page, $page_size, $active, $mischen, $filterForDegreePrograms, $allowedDegreePrograms);
|
||||||
|
|
||||||
// getting the number of rows of the query and adding pagination to the query result
|
// getting the number of rows of the query and adding pagination to the query result
|
||||||
$num_rows = $this->getNumRows(true);
|
$num_rows = $this->getNumRows(true);
|
||||||
$this->addPagination($page, $page_size, $num_rows);
|
$this->addPagination($page, $page_size, $num_rows);
|
||||||
|
|
||||||
// preparing the query again because every call to get_compiled_select or cour_all_results will add the from clause to the query
|
// preparing the query again because every call to get_compiled_select or cour_all_results will add the from clause to the query
|
||||||
$this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen);
|
$this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $page, $page_size, $active, $mischen, $filterForDegreePrograms, $allowedDegreePrograms);
|
||||||
|
|
||||||
return $this->load();
|
return $this->load();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function countNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true)
|
|
||||||
{
|
|
||||||
$this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen);
|
|
||||||
return $this->getNumRows();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,30 @@ class Prestudent_model extends DB_Model
|
|||||||
return $this->execQuery($query, $parametersArray);
|
return $this->execQuery($query, $parametersArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the Studiengang and current Ausbildungssemester for every
|
||||||
|
* Prestudent belonging to the same person as the student.
|
||||||
|
*
|
||||||
|
* @param string $student_uid
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function getStudiengaengAndAusbildungssemesterByStudentUid($student_uid)
|
||||||
|
{
|
||||||
|
$query = 'SELECT p.studiengang_kz,
|
||||||
|
(
|
||||||
|
SELECT ps.ausbildungssemester
|
||||||
|
FROM public.tbl_prestudentstatus ps
|
||||||
|
WHERE ps.prestudent_id = p.prestudent_id
|
||||||
|
ORDER BY ps.datum DESC, ps.insertamum DESC, ps.ext_id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) AS ausbildungssemester
|
||||||
|
FROM public.tbl_student s
|
||||||
|
JOIN public.tbl_prestudent p USING (prestudent_id)
|
||||||
|
WHERE s.student_uid = ?';
|
||||||
|
|
||||||
|
return $this->execQuery($query, array($student_uid));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* updateAufnahmegruppe
|
* updateAufnahmegruppe
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ class Prestudentstatus_model extends DB_Model
|
|||||||
* @param prestudent_id ID of the Prestudent.
|
* @param prestudent_id ID of the Prestudent.
|
||||||
* @param $status_kurzbz kurzbz of the status.
|
* @param $status_kurzbz kurzbz of the status.
|
||||||
* @param $ausbildungssemester ausbildungssemester of the status.
|
* @param $ausbildungssemester ausbildungssemester of the status.
|
||||||
* @param $studiensemester_kurzbz studiensemster of the status.
|
* @param $studiensemester_kurzbz studiensemester of the status.
|
||||||
*
|
*
|
||||||
* @return result object with all the status entries
|
* @return result object with all the status entries
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -100,12 +100,14 @@ class Abschlusspruefung_model extends DB_Model
|
|||||||
|
|
||||||
if (isError($abschlussarbeit))
|
if (isError($abschlussarbeit))
|
||||||
return $abschlussarbeit;
|
return $abschlussarbeit;
|
||||||
|
|
||||||
if (hasData($abschlussarbeit))
|
if (hasData($abschlussarbeit))
|
||||||
{
|
{
|
||||||
$abschlussarbeit = getData($abschlussarbeit)[0];
|
$abschlussarbeit = getData($abschlussarbeit)[0];
|
||||||
$abschlusspruefungdata->projektarbeit_studiengangstyp_name = $abschlussarbeit->projekttyp_kurzbz;
|
$abschlusspruefungdata->projektarbeit_studiengangstyp_name = $abschlussarbeit->projekttyp_kurzbz;
|
||||||
$abschlusspruefungdata->abschlussarbeit_titel = $abschlussarbeit->titel;
|
$abschlusspruefungdata->abschlussarbeit_titel = $abschlussarbeit->titel;
|
||||||
$abschlusspruefungdata->abschlussarbeit_note = $abschlussarbeit->note;
|
$abschlusspruefungdata->abschlussarbeit_note = $abschlussarbeit->note;
|
||||||
|
$abschlusspruefungdata->abschlussarbeit_sprache = $abschlussarbeit->sprache_bezeichnung;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,4 +52,53 @@ class LePruefung_model extends DB_Model
|
|||||||
'student_uid' => $student_uid
|
'student_uid' => $student_uid
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPruefungenByLvStudiensemester($lv_id, $sem_kurzbz) {
|
||||||
|
$qry = "SELECT lehre.tbl_pruefung.*, tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, tbl_lehrveranstaltung.lehrveranstaltung_id,
|
||||||
|
tbl_note.bezeichnung as note_bezeichnung, tbl_pruefungstyp.beschreibung as typ_beschreibung, tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz
|
||||||
|
FROM lehre.tbl_pruefung, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, lehre.tbl_note, lehre.tbl_pruefungstyp
|
||||||
|
WHERE lehre.tbl_pruefung.lehreinheit_id=tbl_lehreinheit.lehreinheit_id
|
||||||
|
AND tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id
|
||||||
|
AND lehre.tbl_pruefung.note = tbl_note.note
|
||||||
|
AND lehre.tbl_pruefung.pruefungstyp_kurzbz=tbl_pruefungstyp.pruefungstyp_kurzbz
|
||||||
|
AND tbl_lehrveranstaltung.lehrveranstaltung_id = ?
|
||||||
|
AND tbl_lehreinheit.studiensemester_kurzbz = ?
|
||||||
|
ORDER BY datum DESC;";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, array($lv_id, $sem_kurzbz));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPruefungenByUidTypLvStudiensemester($uid, $typ = null, $lv_id = null, $sem_kurzbz = null) {
|
||||||
|
$params = [$uid];
|
||||||
|
$qry = "SELECT tbl_pruefung.*, tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, tbl_lehrveranstaltung.lehrveranstaltung_id,
|
||||||
|
tbl_note.bezeichnung as note_bezeichnung, tbl_pruefungstyp.beschreibung as typ_beschreibung, tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz
|
||||||
|
FROM lehre.tbl_pruefung, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, lehre.tbl_note, lehre.tbl_pruefungstyp
|
||||||
|
WHERE student_uid= ?
|
||||||
|
AND tbl_pruefung.lehreinheit_id=tbl_lehreinheit.lehreinheit_id
|
||||||
|
AND tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id
|
||||||
|
AND tbl_pruefung.note = tbl_note.note
|
||||||
|
AND tbl_pruefung.pruefungstyp_kurzbz=tbl_pruefungstyp.pruefungstyp_kurzbz";
|
||||||
|
if ($typ != null)
|
||||||
|
{
|
||||||
|
$qry .= " AND tbl_pruefungstyp.pruefungstyp_kurzbz = ?";
|
||||||
|
$params[] = $typ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($lv_id != null)
|
||||||
|
{
|
||||||
|
$qry .= " AND tbl_lehrveranstaltung.lehrveranstaltung_id = ?";
|
||||||
|
$params[] = $lv_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sem_kurzbz != null)
|
||||||
|
{
|
||||||
|
$qry .= " AND tbl_lehreinheit.studiensemester_kurzbz = ?";
|
||||||
|
$params[] = $sem_kurzbz;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$qry .= " ORDER BY datum DESC";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -340,6 +340,20 @@ EOSQL;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getByLeStudiensemester($lehreinheit_id, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$qry = "WITH lehreinheiten AS (
|
||||||
|
SELECT *
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
WHERE lehreinheit_id = ?
|
||||||
|
AND studiensemester_kurzbz = ?
|
||||||
|
)," . $this->_getLeCTE();
|
||||||
|
|
||||||
|
$params = array($lehreinheit_id, $studiensemester_kurzbz);
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
|
||||||
|
}
|
||||||
public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
|
public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
|
||||||
{
|
{
|
||||||
$qry = "WITH lehreinheiten AS (
|
$qry = "WITH lehreinheiten AS (
|
||||||
@@ -347,35 +361,7 @@ EOSQL;
|
|||||||
FROM lehre.tbl_lehreinheit
|
FROM lehre.tbl_lehreinheit
|
||||||
WHERE lehrveranstaltung_id = ?
|
WHERE lehrveranstaltung_id = ?
|
||||||
AND studiensemester_kurzbz = ?
|
AND studiensemester_kurzbz = ?
|
||||||
),
|
)," . $this->_getLeCTE();
|
||||||
". $this->_getGruppenCTE() . ",
|
|
||||||
". $this->_getLektorenCTE() . ",
|
|
||||||
". $this->_getFachbereichCTE() . ",
|
|
||||||
". $this->_getTagsCTE() . "
|
|
||||||
|
|
||||||
SELECT lehreinheiten.*,
|
|
||||||
lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
|
|
||||||
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
|
|
||||||
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
|
||||||
COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
|
|
||||||
gruppen.gruppen,
|
|
||||||
mitarbeiter.lektoren,
|
|
||||||
mitarbeiter.le_planstunden,
|
|
||||||
mitarbeiter.vorname,
|
|
||||||
mitarbeiter.nachname,
|
|
||||||
mitarbeiter.semesterstunden,
|
|
||||||
fachbereich.bezeichnung as fachbereich,
|
|
||||||
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
|
|
||||||
semester
|
|
||||||
FROM lehreinheiten
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
|
|
||||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
|
||||||
LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
|
|
||||||
LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
|
|
||||||
LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
|
|
||||||
LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
|
|
||||||
WHERE true
|
|
||||||
";
|
|
||||||
|
|
||||||
$params = array($lv_id, $studiensemester_kurzbz);
|
$params = array($lv_id, $studiensemester_kurzbz);
|
||||||
|
|
||||||
@@ -395,9 +381,83 @@ EOSQL;
|
|||||||
return $this->execReadOnlyQuery($qry, $params);
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLVTmp($stg_kz = null)
|
public function getOffeneStunden($lehreinheit_ids)
|
||||||
{
|
{
|
||||||
$qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *,
|
if (!is_array($lehreinheit_ids))
|
||||||
|
$lehreinheit_ids = [$lehreinheit_ids];
|
||||||
|
|
||||||
|
if (empty($lehreinheit_ids))
|
||||||
|
return success([]);
|
||||||
|
|
||||||
|
$db = new DB_Model();
|
||||||
|
$placeholders = implode(',', array_fill(0, count($lehreinheit_ids), '?'));
|
||||||
|
|
||||||
|
$qry = "WITH eventdauer AS (
|
||||||
|
SELECT
|
||||||
|
tbl_kalender_lehreinheit.lehreinheit_id,
|
||||||
|
tbl_kalender.von,
|
||||||
|
tbl_kalender.bis,
|
||||||
|
tbl_kalender.kalender_id
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
JOIN lehre.tbl_kalender_lehreinheit USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_kalender USING(kalender_id)
|
||||||
|
WHERE tbl_lehreinheit.lehreinheit_id IN ($placeholders)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM lehre.tbl_kalender nachfolger
|
||||||
|
WHERE nachfolger.vorgaenger_kalender_id = tbl_kalender.kalender_id)
|
||||||
|
AND tbl_kalender.status_kurzbz NOT IN ('deleted', 'todelete', 'archived')
|
||||||
|
GROUP BY tbl_kalender_lehreinheit.lehreinheit_id, tbl_kalender.von, tbl_kalender.bis, tbl_kalender.kalender_id
|
||||||
|
),
|
||||||
|
raster AS (
|
||||||
|
SELECT
|
||||||
|
eventdauer.lehreinheit_id,
|
||||||
|
eventdauer.kalender_id,
|
||||||
|
eventdauer.von,
|
||||||
|
eventdauer.bis,
|
||||||
|
vonstunde.stunde AS vonstunde_nr,
|
||||||
|
bisstunde.stunde AS bisstunde_nr
|
||||||
|
FROM eventdauer
|
||||||
|
LEFT JOIN lehre.tbl_stunde vonstunde ON eventdauer.von::time = vonstunde.beginn
|
||||||
|
LEFT JOIN lehre.tbl_stunde bisstunde ON eventdauer.bis::time = bisstunde.ende
|
||||||
|
),
|
||||||
|
unterrichtsdauer AS (
|
||||||
|
SELECT
|
||||||
|
raster.lehreinheit_id,
|
||||||
|
raster.kalender_id,
|
||||||
|
sum(EXTRACT(EPOCH FROM (LEAST(stunde.ende, raster.bis::time) - GREATEST(stunde.beginn, raster.von::time))) / 60) AS minuten
|
||||||
|
FROM raster JOIN lehre.tbl_stunde stunde ON stunde.beginn < raster.bis::time AND stunde.ende > raster.von::time
|
||||||
|
WHERE raster.vonstunde_nr IS NULL OR raster.bisstunde_nr IS NULL
|
||||||
|
GROUP BY raster.lehreinheit_id, raster.kalender_id
|
||||||
|
),
|
||||||
|
verplantestunden AS (
|
||||||
|
SELECT raster.lehreinheit_id, raster.kalender_id,
|
||||||
|
CASE
|
||||||
|
WHEN raster.vonstunde_nr IS NOT NULL AND raster.bisstunde_nr IS NOT NULL
|
||||||
|
THEN (raster.bisstunde_nr - raster.vonstunde_nr + 1)
|
||||||
|
ELSE coalesce(unterrichtsdauer.minuten, 0) / 45
|
||||||
|
END AS verplantestunde
|
||||||
|
FROM raster LEFT JOIN unterrichtsdauer ON unterrichtsdauer.lehreinheit_id = raster.lehreinheit_id AND unterrichtsdauer.kalender_id = raster.kalender_id
|
||||||
|
),
|
||||||
|
verplant_gesamt AS (
|
||||||
|
SELECT lehreinheit_id, SUM(verplantestunde) AS verplant
|
||||||
|
FROM verplantestunden
|
||||||
|
GROUP BY lehreinheit_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
lema.lehreinheit_id,
|
||||||
|
lema.mitarbeiter_uid,
|
||||||
|
lema.planstunden,
|
||||||
|
ROUND(coalesce(verplant_gesamt.verplant, 0), 2) AS verplant,
|
||||||
|
ROUND((lema.planstunden - coalesce(verplant_gesamt.verplant, 0)), 2) AS offenestunden
|
||||||
|
FROM lehre.tbl_lehreinheitmitarbeiter lema
|
||||||
|
LEFT JOIN verplant_gesamt ON verplant_gesamt.lehreinheit_id = lema.lehreinheit_id
|
||||||
|
WHERE lema.lehreinheit_id IN ($placeholders)";
|
||||||
|
|
||||||
|
return $db->execReadOnlyQuery($qry, array_merge($lehreinheit_ids, $lehreinheit_ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getLVTmp()
|
||||||
|
{
|
||||||
|
return "SELECT DISTINCT ON(lehrveranstaltung_id) *,
|
||||||
'' as stundenblockung,
|
'' as stundenblockung,
|
||||||
'' as lehreinheit_id,
|
'' as lehreinheit_id,
|
||||||
'' as wochenrythmus,
|
'' as wochenrythmus,
|
||||||
@@ -408,24 +468,33 @@ EOSQL;
|
|||||||
'' as studienplan_beeichnung,
|
'' as studienplan_beeichnung,
|
||||||
UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
|
UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
|
||||||
FROM campus.vw_lehreinheit
|
FROM campus.vw_lehreinheit
|
||||||
WHERE mitarbeiter_uid = ?
|
WHERE studiensemester_kurzbz = ? ";
|
||||||
AND studiensemester_kurzbz = ?";
|
|
||||||
|
|
||||||
if (!is_null($stg_kz)) {
|
|
||||||
$qry .= " AND lv_studiengang_kz = ?";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $qry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
|
public function getLvsById($lehrveranstaltung_id, $studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
$qry = "WITH lvs AS (" . $this->getLVTmp($stg_kz) . ")
|
$where = ' AND lehrveranstaltung_id = ?';
|
||||||
|
$qry = "WITH lvs AS (" . $this->getLVTmp() . $where .")
|
||||||
SELECT lvs.*
|
SELECT lvs.*
|
||||||
FROM lvs
|
FROM lvs
|
||||||
";
|
";
|
||||||
|
|
||||||
|
$params = array($studiensemester_kurzbz, $lehrveranstaltung_id);
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
}
|
||||||
|
public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
|
||||||
|
{
|
||||||
|
$where = ' AND mitarbeiter_uid = ?';
|
||||||
|
|
||||||
|
if ($stg_kz != null)
|
||||||
|
$where .= " AND lv_studiengang_kz = ?";
|
||||||
|
|
||||||
|
$qry = "WITH lvs AS (" . $this->getLVTmp() . $where .")
|
||||||
|
SELECT lvs.*
|
||||||
|
FROM lvs";
|
||||||
|
|
||||||
|
$params = array($studiensemester_kurzbz, $mitarbeiter_uid);
|
||||||
|
|
||||||
$params = array($mitarbeiter_uid, $studiensemester_kurzbz);
|
|
||||||
if (!is_null($stg_kz))
|
if (!is_null($stg_kz))
|
||||||
{
|
{
|
||||||
$params[] = $stg_kz;
|
$params[] = $stg_kz;
|
||||||
@@ -632,6 +701,36 @@ EOSQL;
|
|||||||
return success('Contract successfully updated.');
|
return success('Contract successfully updated.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function _getLeCTE()
|
||||||
|
{
|
||||||
|
return $this->_getGruppenCTE() . ",
|
||||||
|
". $this->_getLektorenCTE() . ",
|
||||||
|
". $this->_getFachbereichCTE() . ",
|
||||||
|
". $this->_getTagsCTE() . "
|
||||||
|
|
||||||
|
SELECT lehreinheiten.*,
|
||||||
|
lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
|
||||||
|
gruppen.gruppen,
|
||||||
|
mitarbeiter.lektoren,
|
||||||
|
mitarbeiter.le_planstunden,
|
||||||
|
mitarbeiter.vorname,
|
||||||
|
mitarbeiter.nachname,
|
||||||
|
mitarbeiter.semesterstunden,
|
||||||
|
fachbereich.bezeichnung as fachbereich,
|
||||||
|
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
|
||||||
|
semester
|
||||||
|
FROM lehreinheiten
|
||||||
|
LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
|
||||||
|
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
|
||||||
|
LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
|
||||||
|
LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
|
||||||
|
LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
|
||||||
|
WHERE true";
|
||||||
|
}
|
||||||
private function _getGruppenCTE()
|
private function _getGruppenCTE()
|
||||||
{
|
{
|
||||||
return "gruppen AS (
|
return "gruppen AS (
|
||||||
@@ -741,4 +840,69 @@ EOSQL;
|
|||||||
)";
|
)";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getAllLehreinheitenForLvaAndMaUid($lva_id, $ma_uid, $sem_kurzbz)
|
||||||
|
{
|
||||||
|
$query = "SELECT DISTINCT tbl_lehreinheitmitarbeiter.lehreinheit_id, tbl_lehreinheit.lehrveranstaltung_id, tbl_lehreinheit.lehrform_kurzbz,
|
||||||
|
tbl_lehreinheitmitarbeiter.mitarbeiter_uid,
|
||||||
|
tbl_lehreinheitgruppe.semester,
|
||||||
|
tbl_lehreinheitgruppe.verband,
|
||||||
|
tbl_lehreinheitgruppe.gruppe,
|
||||||
|
tbl_lehreinheitgruppe.gruppe_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.kurzbz,
|
||||||
|
tbl_studiengang.kurzbzlang,
|
||||||
|
(SELECT COUNT(DISTINCT datum) FROM campus.vw_stundenplan WHERE lehreinheit_id = lehre.tbl_lehreinheit.lehreinheit_id) as termincount,
|
||||||
|
(SELECT COUNT(*) FROM campus.vw_student_lehrveranstaltung WHERE lehreinheit_id = lehre.tbl_lehreinheit.lehreinheit_id) as studentcount
|
||||||
|
FROM lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehreinheitgruppe USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang ON (tbl_lehreinheitgruppe.studiengang_kz = tbl_studiengang.studiengang_kz)
|
||||||
|
WHERE lehrveranstaltung_id = ? AND studiensemester_kurzbz = ? AND mitarbeiter_uid = ?
|
||||||
|
ORDER BY tbl_lehreinheitgruppe.gruppe_kurzbz";
|
||||||
|
|
||||||
|
return $this->execQuery($query, [$lva_id, $sem_kurzbz, $ma_uid]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLehrenheitenBySemester($uid, $semester)
|
||||||
|
{
|
||||||
|
$query = "SELECT
|
||||||
|
tbl_lehreinheit.lehreinheit_id,
|
||||||
|
lehrfach.kurzbz as lehrfach,
|
||||||
|
tbl_lehreinheit.lehrform_kurzbz as lehrform,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
(SELECT kurzbz FROM public.tbl_mitarbeiter
|
||||||
|
WHERE mitarbeiter_uid=tbl_lehreinheitmitarbeiter.mitarbeiter_uid) as lektor,
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as stg_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.semester as lv_semester,
|
||||||
|
tbl_lehreinheit.raumtyp,
|
||||||
|
tbl_lehreinheit.raumtypalternativ,
|
||||||
|
tbl_lehreinheit.stundenblockung,
|
||||||
|
tbl_lehreinheit.wochenrythmus,
|
||||||
|
tbl_lehreinheitmitarbeiter.semesterstunden as semesterstunden,
|
||||||
|
tbl_lehreinheit.start_kw,
|
||||||
|
lvangebot.anmeldefenster_start,
|
||||||
|
lvangebot.anmeldefenster_ende,
|
||||||
|
tbl_lehrveranstaltung.lehrveranstaltung_id
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id)
|
||||||
|
LEFT JOIN lehre.tbl_lvangebot as lvangebot ON(tbl_lehrveranstaltung.lehrveranstaltung_id=lvangebot.lehrveranstaltung_id)
|
||||||
|
WHERE
|
||||||
|
tbl_lehreinheit.studiensemester_kurzbz = '$semester'
|
||||||
|
AND mitarbeiter_uid = '$uid'
|
||||||
|
ORDER BY stg_kurzbz,lv_semester,lv_bezeichnung";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getGroupsByLehreinheit($lehreinheitId)
|
||||||
|
{
|
||||||
|
$query = "SELECT *
|
||||||
|
FROM lehre.tbl_lehreinheitgruppe
|
||||||
|
WHERE lehreinheit_id='$lehreinheitId'";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($query);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,9 +85,18 @@ class Lehreinheitmitarbeiter_model extends DB_Model
|
|||||||
|
|
||||||
public function getLektorenByLe($lehreinheit_id)
|
public function getLektorenByLe($lehreinheit_id)
|
||||||
{
|
{
|
||||||
$this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant');
|
$this->addSelect('tbl_person.vorname, tbl_person.nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant,
|
||||||
|
COALESCE(insertvonperson.vorname || \' \' || insertvonperson.nachname, tbl_lehreinheitmitarbeiter.insertvon) as insertvon,
|
||||||
|
COALESCE(updatevonperson.vorname || \' \' || updatevonperson.nachname, tbl_lehreinheitmitarbeiter.updatevon) as updatevon');
|
||||||
$this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid');
|
$this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid');
|
||||||
$this->addJoin('tbl_person', 'person_id');
|
$this->addJoin('tbl_person', 'person_id');
|
||||||
|
$this->addJoin('tbl_benutzer insertvonbenutzer', 'insertvonbenutzer.uid = tbl_lehreinheitmitarbeiter.insertvon', 'LEFT');
|
||||||
|
$this->addJoin('tbl_person insertvonperson', 'insertvonperson.person_id = insertvonbenutzer.person_id', 'LEFT');
|
||||||
|
|
||||||
|
$this->addJoin('tbl_benutzer updatevonbenutzer', 'updatevonbenutzer.uid = tbl_lehreinheitmitarbeiter.updatevon', 'LEFT');
|
||||||
|
$this->addJoin('tbl_person updatevonperson', 'updatevonperson.person_id = updatevonbenutzer.person_id', 'LEFT');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$this->addJoin('(
|
$this->addJoin('(
|
||||||
SELECT 1 as verplant, lehreinheit_id, mitarbeiter_uid
|
SELECT 1 as verplant, lehreinheit_id, mitarbeiter_uid
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ class Lehrveranstaltung_model extends DB_Model
|
|||||||
tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student,
|
tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student,
|
||||||
tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid,
|
tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid,
|
||||||
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung,
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung,
|
||||||
tbl_student.prestudent_id
|
tbl_student.prestudent_id, campus.vw_student_lehrveranstaltung.lehreinheit_id
|
||||||
FROM
|
FROM
|
||||||
campus.vw_student_lehrveranstaltung
|
campus.vw_student_lehrveranstaltung
|
||||||
JOIN public.tbl_benutzer USING(uid)
|
JOIN public.tbl_benutzer USING(uid)
|
||||||
@@ -1263,6 +1263,39 @@ class Lehrveranstaltung_model extends DB_Model
|
|||||||
";
|
";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets lehrveranstaltungen of Studienplan of a certain lva_id set
|
||||||
|
* used if a bigger set of lva id is already available and it needs to be checked against a certain studienplan aswell
|
||||||
|
* @param $studienplan_id ID des Studienplans
|
||||||
|
* @param $lva_ids LVA_ID welche abgegleicht werden sollen
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
public function getLvsByStudienplanByLvaIDs($studienplan_id, $lva_ids)
|
||||||
|
{
|
||||||
|
$params = array($studienplan_id, $lva_ids);
|
||||||
|
|
||||||
|
$qry = "SELECT tbl_lehrveranstaltung.*,
|
||||||
|
tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id,
|
||||||
|
tbl_studienplan_lehrveranstaltung.semester as stpllv_semester,
|
||||||
|
tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht,
|
||||||
|
tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator,
|
||||||
|
tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent,
|
||||||
|
tbl_studienplan_lehrveranstaltung.sort stpllv_sort,
|
||||||
|
tbl_studienplan_lehrveranstaltung.curriculum,
|
||||||
|
tbl_studienplan_lehrveranstaltung.export,
|
||||||
|
tbl_studienplan_lehrveranstaltung.genehmigung
|
||||||
|
FROM lehre.tbl_lehrveranstaltung
|
||||||
|
JOIN lehre.tbl_studienplan_lehrveranstaltung
|
||||||
|
USING(lehrveranstaltung_id)
|
||||||
|
WHERE tbl_studienplan_lehrveranstaltung.studienplan_id = ?
|
||||||
|
AND tbl_studienplan_lehrveranstaltung.lehrveranstaltung_id IN ?
|
||||||
|
";
|
||||||
|
|
||||||
|
$qry .= " ORDER BY stpllv_sort, semester, sort";
|
||||||
|
|
||||||
|
return $this->execQuery($qry, $params);
|
||||||
|
}
|
||||||
|
|
||||||
public function getAllOe($lv_id)
|
public function getAllOe($lv_id)
|
||||||
{
|
{
|
||||||
$qry = "SELECT DISTINCT oe_kurzbz
|
$qry = "SELECT DISTINCT oe_kurzbz
|
||||||
@@ -1346,4 +1379,114 @@ class Lehrveranstaltung_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execQuery($qry, $params);
|
return $this->execQuery($qry, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLvForLektorInSemester($sem_kurzbz, $uid) {
|
||||||
|
$qry = "SELECT DISTINCT (tbl_lehrveranstaltung.lehrveranstaltung_id),
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as stg_kurzbz,
|
||||||
|
tbl_studiengang.studiengang_kz,
|
||||||
|
tbl_lehrveranstaltung.semester as lv_semester,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
(SELECT kurzbz FROM public.tbl_mitarbeiter
|
||||||
|
WHERE mitarbeiter_uid=tbl_lehreinheitmitarbeiter.mitarbeiter_uid) as lektor,
|
||||||
|
lehre.tbl_lehrveranstaltung.orgform_kurzbz as orgform
|
||||||
|
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id)
|
||||||
|
WHERE
|
||||||
|
tbl_lehreinheit.studiensemester_kurzbz = ?
|
||||||
|
AND mitarbeiter_uid = ?
|
||||||
|
ORDER BY stg_kurzbz,lv_semester,lv_bezeichnung";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, array($sem_kurzbz, $uid));
|
||||||
|
}
|
||||||
|
|
||||||
|
// used for cis4 mylv mitarbeiter
|
||||||
|
public function getLvsByMitarbeiterInSemester($mitarbeiter_uid, $sem_kurzbz) {
|
||||||
|
$qry = "SELECT * FROM (
|
||||||
|
SELECT DISTINCT ON (lehre.tbl_lehrveranstaltung.lehrveranstaltung_id)
|
||||||
|
public.tbl_studiengang.studiengang_kz,
|
||||||
|
lehre.tbl_lehrveranstaltung.semester,
|
||||||
|
public.tbl_studiengang.bezeichnung as sg_bezeichnung,
|
||||||
|
public.tbl_studiengang.english as sg_bezeichnung_eng,
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as studiengang_kuerzel,
|
||||||
|
lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,
|
||||||
|
lehre.tbl_lehrveranstaltung.bezeichnung,
|
||||||
|
lehre.tbl_lehrveranstaltung.bezeichnung_english as bezeichnung_eng,
|
||||||
|
lehre.tbl_lehrveranstaltung.farbe,
|
||||||
|
lehre.tbl_lehrveranstaltung.lvinfo,
|
||||||
|
lehre.tbl_lehrveranstaltung.benotung,
|
||||||
|
lehre.tbl_lehrveranstaltung.orgform_kurzbz,
|
||||||
|
lehre.tbl_lehrveranstaltung.sprache,
|
||||||
|
lehre.tbl_lehrveranstaltung.ects,
|
||||||
|
lehre.tbl_lehrveranstaltung.incoming
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id)
|
||||||
|
WHERE
|
||||||
|
tbl_lehreinheit.studiensemester_kurzbz = ?
|
||||||
|
AND mitarbeiter_uid = ?) as distincted_by_lva_id
|
||||||
|
JOIN (
|
||||||
|
SELECT lehrveranstaltung_id, TRUNC(SUM(lehre.tbl_lehreinheitmitarbeiter.semesterstunden)) as semesterstunden
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
WHERE tbl_lehreinheit.studiensemester_kurzbz = ?
|
||||||
|
AND mitarbeiter_uid = ?
|
||||||
|
GROUP BY lehrveranstaltung_id
|
||||||
|
) semesterstundenAggregatedSubquery USING(lehrveranstaltung_id)
|
||||||
|
ORDER BY studiengang_kuerzel, semester, bezeichnung";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, [$sem_kurzbz, $mitarbeiter_uid, $sem_kurzbz, $mitarbeiter_uid]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All Lehrveranstaltungen of a Studiengang offered in a Studiensemester.
|
||||||
|
*/
|
||||||
|
public function getLvForStudiengangInSemester($sem_kurzbz, $studiengang_kz) {
|
||||||
|
$qry = "SELECT DISTINCT (tbl_lehrveranstaltung.lehrveranstaltung_id),
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as stg_kurzbz,
|
||||||
|
tbl_studiengang.studiengang_kz,
|
||||||
|
tbl_lehrveranstaltung.semester as lv_semester,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
tbl_lehrveranstaltung.orgform_kurzbz as orgform
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
WHERE
|
||||||
|
tbl_lehrveranstaltung.studiengang_kz = ?
|
||||||
|
AND tbl_lehrveranstaltung.aktiv = TRUE
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1 FROM lehre.tbl_lehreinheit le
|
||||||
|
WHERE le.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id
|
||||||
|
AND le.studiensemester_kurzbz = ?
|
||||||
|
)
|
||||||
|
ORDER BY stg_kurzbz,lv_semester,lv_bezeichnung";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, array($studiengang_kz, $sem_kurzbz));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of Lehreinheit assignments the given mitarbeiter has for a Lehrveranstaltung (i.e. whether
|
||||||
|
* they teach it), optionally restricted to a Studiensemester. Returns a single row with a `teaches`
|
||||||
|
* count - check `teaches > 0`. Used to scope teacher access in the Benotungstool to their own LVs.
|
||||||
|
*/
|
||||||
|
public function getLektorIsTeachingLva($lva_id, $ma_uid, $studiensemester_kurzbz = null)
|
||||||
|
{
|
||||||
|
$params = array($lva_id, $ma_uid);
|
||||||
|
$query = "SELECT COUNT(*) AS teaches
|
||||||
|
FROM lehre.tbl_lehreinheitmitarbeiter
|
||||||
|
JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||||
|
WHERE lehrveranstaltung_id = ? AND mitarbeiter_uid = ?";
|
||||||
|
if ($studiensemester_kurzbz !== null && $studiensemester_kurzbz !== '') {
|
||||||
|
$query .= " AND tbl_lehreinheit.studiensemester_kurzbz = ?";
|
||||||
|
$params[] = $studiensemester_kurzbz;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($query, $params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class Lvgesamtnote_model extends DB_Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laedt die Noten
|
* Laedt die Noten - lvgesamtnote (Vorschlag) JOIN tbl.note (zeugnisnote)
|
||||||
*
|
*
|
||||||
* @param integer $lehrveranstaltung_id
|
* @param integer $lehrveranstaltung_id
|
||||||
* @param string $student_uid
|
* @param string $student_uid
|
||||||
@@ -50,4 +50,19 @@ class Lvgesamtnote_model extends DB_Model
|
|||||||
|
|
||||||
return $this->loadWhere($where);
|
return $this->loadWhere($where);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLvGesamtNoteVorschlag($lehrveranstaltung_id, $student_uid, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$qry = "SELECT * FROM campus.tbl_lvgesamtnote
|
||||||
|
WHERE campus.tbl_lvgesamtnote.student_uid = ?
|
||||||
|
AND campus.tbl_lvgesamtnote.studiensemester_kurzbz = ?";
|
||||||
|
$params = [$student_uid, $studiensemester_kurzbz];
|
||||||
|
|
||||||
|
if ($lehrveranstaltung_id) {
|
||||||
|
$qry .= " AND campus.tbl_lvgesamtnote.lehrveranstaltung_id = ?";
|
||||||
|
$params[] = $lehrveranstaltung_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,33 @@ class Note_model extends DB_Model
|
|||||||
$this->dbTable = 'lehre.tbl_note';
|
$this->dbTable = 'lehre.tbl_note';
|
||||||
$this->pk = 'note';
|
$this->pk = 'note';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAllActive() {
|
public function getAllActive() {
|
||||||
$qry ="SELECT *
|
$qry ="SELECT *
|
||||||
FROM lehre.tbl_note
|
FROM lehre.tbl_note
|
||||||
WHERE aktiv = true";
|
WHERE aktiv = true";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry);
|
||||||
|
}
|
||||||
|
|
||||||
|
// used to determine the primary key of note "entschuldigt" to avoid hardcoded magic numbers
|
||||||
|
// that might differ in a different installation of fhcomplete
|
||||||
|
public function getEntschuldigtNote() {
|
||||||
|
$qry ="SELECT *
|
||||||
|
FROM lehre.tbl_note
|
||||||
|
WHERE bezeichnung = 'entschuldigt'";
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($qry);
|
return $this->execReadOnlyQuery($qry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// used to determine the primary key of note "noch nicht eingetragen" to avoid hardcoded magic numbers
|
||||||
|
// that might differ in a different installation of fhcomplete
|
||||||
|
public function getNochNichtEingetragenNote() {
|
||||||
|
$qry ="SELECT *
|
||||||
|
FROM lehre.tbl_note
|
||||||
|
WHERE bezeichnung = 'Noch nicht eingetragen'";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,7 @@ class Notenschluesselaufteilung_model extends DB_Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Liefert die Note zu Punkten einer Lehrveranstaltung
|
* Gives the grade for the points of a course.
|
||||||
*
|
*
|
||||||
* @param number $points
|
* @param number $points
|
||||||
* @param integer $lehrveranstaltung_id
|
* @param integer $lehrveranstaltung_id
|
||||||
@@ -23,9 +23,18 @@ class Notenschluesselaufteilung_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function getNote($points, $lehrveranstaltung_id, $studiensemester_kurzbz)
|
public function getNote($points, $lehrveranstaltung_id, $studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
|
// Without a valid points value you cannot derive a grade. Without this guard the query
|
||||||
|
// builder makes a bad statement from "punkte <=" => null ('punkte' < 'IS' 'NULL'). The
|
||||||
|
// request then fails with HTTP 500 instead of an answer that says "no grade".
|
||||||
|
if (!is_numeric($points))
|
||||||
|
return success(null);
|
||||||
|
|
||||||
$this->load->model('education/Notenschluesselzuordnung_model', 'NotenschluesselzuordnungModel');
|
$this->load->model('education/Notenschluesselzuordnung_model', 'NotenschluesselzuordnungModel');
|
||||||
$notenschluessel_kurzbz = $this->NotenschluesselzuordnungModel->getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz);
|
$notenschluessel_kurzbz = $this->NotenschluesselzuordnungModel->getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz);
|
||||||
|
|
||||||
|
if($notenschluessel_kurzbz == null)
|
||||||
|
return success(null);
|
||||||
|
|
||||||
$this->addSelect("note");
|
$this->addSelect("note");
|
||||||
$this->addOrder("punkte", "DESC");
|
$this->addOrder("punkte", "DESC");
|
||||||
$this->addLimit(1);
|
$this->addLimit(1);
|
||||||
|
|||||||
@@ -50,8 +50,7 @@ class Paabgabe_model extends DB_Model
|
|||||||
JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id)
|
JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id)
|
||||||
JOIN public.tbl_benutzer bn_student ON(tbl_projektarbeit.student_uid=bn_student.uid)
|
JOIN public.tbl_benutzer bn_student ON(tbl_projektarbeit.student_uid=bn_student.uid)
|
||||||
JOIN public.tbl_person person_student ON(bn_student.person_id=person_student.person_id)
|
JOIN public.tbl_person person_student ON(bn_student.person_id=person_student.person_id)
|
||||||
JOIN lehre.tbl_lehreinheit ON(tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
JOIN lehre.tbl_lehrveranstaltung ON(tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id)
|
|
||||||
JOIN public.tbl_studiengang ON(tbl_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz)
|
JOIN public.tbl_studiengang ON(tbl_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz)
|
||||||
JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
|
JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
|
||||||
WHERE
|
WHERE
|
||||||
@@ -61,6 +60,172 @@ class Paabgabe_model extends DB_Model
|
|||||||
return $this->execReadOnlyQuery($qry, array($person_id));
|
return $this->execReadOnlyQuery($qry, array($person_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets project submissions for search criteria.
|
||||||
|
* @param array $projekttyp_kurzbz_arr contains all relevant project types (e.g. Bachelor)
|
||||||
|
* @param int $studiengang_kz study program
|
||||||
|
* @param string $abgabetyp_kurzbz project submission type (e.g. end upload, intermediate submission)
|
||||||
|
* @param string $abgabedatum due date for hand-in
|
||||||
|
* @param string $personSearchString for searching by person, i.e. name, uid, person/prestudent id
|
||||||
|
* @param int $limit limiting max number of results if search criteria is not precise enough
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function getPaAbgaben(
|
||||||
|
$projekttyp_kurzbz_arr,
|
||||||
|
$studiengang_kz = null,
|
||||||
|
$abgabetyp_kurzbz = null,
|
||||||
|
$abgabedatum = null,
|
||||||
|
$personSearchString = null,
|
||||||
|
$limit = 1000
|
||||||
|
) {
|
||||||
|
$params = [];
|
||||||
|
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
stg.bezeichnung AS stgbez, paabg.datum AS termin,
|
||||||
|
paabg.paabgabe_id, paabg.projektarbeit_id, paabg.paabgabetyp_kurzbz, paabg.abgabedatum,
|
||||||
|
abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel,
|
||||||
|
UPPER(stg.typ || stg.kurzbz) AS studiengang_kuerzel,
|
||||||
|
(
|
||||||
|
/* show all relevant Studiengänge of person and wether it is an employee*/
|
||||||
|
SELECT
|
||||||
|
STRING_AGG(studiengang || ' ' || last_status, ' | ')
|
||||||
|
|| (CASE WHEN EXISTS (
|
||||||
|
SELECT 1 FROM public.tbl_mitarbeiter ma
|
||||||
|
JOIN public.tbl_benutzer ben ON ma.mitarbeiter_uid = ben.uid
|
||||||
|
WHERE person_id = prestudents.person_id
|
||||||
|
AND ben.aktiv
|
||||||
|
) THEN ' | Mitarbeiter' ELSE '' END)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
DISTINCT person_id, prestudent_id, UPPER(stg.typ || stg.kurzbz) AS studiengang,
|
||||||
|
get_rolle_prestudent(ps.prestudent_id, null) AS last_status
|
||||||
|
FROM
|
||||||
|
public.tbl_prestudent ps
|
||||||
|
JOIN public.tbl_studiengang stg USING (studiengang_kz)
|
||||||
|
WHERE
|
||||||
|
person_id = pers.person_id
|
||||||
|
ORDER BY
|
||||||
|
prestudent_id DESC
|
||||||
|
) prestudents
|
||||||
|
WHERE
|
||||||
|
last_status IN ('Abgewiesener','Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent')
|
||||||
|
GROUP BY
|
||||||
|
person_id
|
||||||
|
LIMIT 1;
|
||||||
|
) AS status
|
||||||
|
FROM
|
||||||
|
lehre.tbl_projektarbeit pa
|
||||||
|
JOIN campus.tbl_paabgabe paabg USING(projektarbeit_id)
|
||||||
|
JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz)
|
||||||
|
LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid)
|
||||||
|
LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id)
|
||||||
|
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
LEFT JOIN public.tbl_studiengang stg USING(studiengang_kz)
|
||||||
|
WHERE
|
||||||
|
TRUE";
|
||||||
|
|
||||||
|
if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr))
|
||||||
|
{
|
||||||
|
$qry .= " AND projekttyp_kurzbz IN ?";
|
||||||
|
$params[] = $projekttyp_kurzbz_arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($studiengang_kz) && is_numeric($studiengang_kz))
|
||||||
|
{
|
||||||
|
$qry .= " AND stg.studiengang_kz=?";
|
||||||
|
$params[] = $studiengang_kz;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($abgabetyp_kurzbz))
|
||||||
|
{
|
||||||
|
$qry .= " AND paabg.paabgabetyp_kurzbz=?";
|
||||||
|
$params[] = $abgabetyp_kurzbz;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($abgabedatum))
|
||||||
|
{
|
||||||
|
$qry .= " AND paabg.datum=?";
|
||||||
|
$params[] = $abgabedatum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_numeric($personSearchString))
|
||||||
|
{
|
||||||
|
$personSearchString = (int) $personSearchString;
|
||||||
|
$params = array_merge($params, [$personSearchString, $personSearchString]);
|
||||||
|
$qry .= " AND (
|
||||||
|
pers.person_id = ?
|
||||||
|
OR EXISTS (SELECT 1 FROM public.tbl_prestudent WHERE person_id = pers.person_id AND prestudent_id = ?)
|
||||||
|
)";
|
||||||
|
}
|
||||||
|
elseif (is_string($personSearchString))
|
||||||
|
{
|
||||||
|
// remove empty spaces and lowercase
|
||||||
|
$personSearchString = strtolower(str_replace(' ', '', $personSearchString));
|
||||||
|
$qry .= " AND (
|
||||||
|
LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$personSearchString.'%')."
|
||||||
|
OR ben.uid LIKE ".$this->db->escape('%'.$personSearchString.'%')."
|
||||||
|
)";
|
||||||
|
}
|
||||||
|
|
||||||
|
$qry .= " ORDER BY nachname";
|
||||||
|
|
||||||
|
if (isset($limit) && is_numeric($limit) && (!isset($studiengang_kz) || !is_numeric($studiengang_kz)) && !isset($abgabedatum))
|
||||||
|
{
|
||||||
|
$qry .= " LIMIT ?";
|
||||||
|
$params[] = $limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets due dates for projekt submission search criteria.
|
||||||
|
* @param array $projekttyp_kurzbz_arr contains all relevant project types (e.g. Bachelor)
|
||||||
|
* @param int $studiengang_kz study program
|
||||||
|
* @param string $abgabetyp_kurzbz project submission type (e.g. end upload, intermediate submission)
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function getTermine($projekttyp_kurzbz_arr, $studiengang_kz, $abgabetyp_kurzbz)
|
||||||
|
{
|
||||||
|
$params = [];
|
||||||
|
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
DISTINCT tbl_paabgabe.datum as termin, to_char(tbl_paabgabe.datum, 'DD.MM.YYYY') as termin_anzeige
|
||||||
|
FROM
|
||||||
|
lehre.tbl_projektarbeit
|
||||||
|
JOIN campus.tbl_paabgabe USING(projektarbeit_id)
|
||||||
|
LEFT JOIN public.tbl_benutzer ON(uid=student_uid)
|
||||||
|
LEFT JOIN public.tbl_person ON(tbl_benutzer.person_id=tbl_person.person_id)
|
||||||
|
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
WHERE
|
||||||
|
TRUE";
|
||||||
|
|
||||||
|
if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr))
|
||||||
|
{
|
||||||
|
$qry .= " AND projekttyp_kurzbz IN ?";
|
||||||
|
$params[] = $projekttyp_kurzbz_arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($studiengang_kz) && is_numeric($studiengang_kz))
|
||||||
|
{
|
||||||
|
$qry .= " AND public.tbl_studiengang.studiengang_kz=?";
|
||||||
|
$params[] = $studiengang_kz;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($abgabetyp_kurzbz))
|
||||||
|
{
|
||||||
|
$qry .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz=?";
|
||||||
|
$params[] = $abgabetyp_kurzbz;
|
||||||
|
}
|
||||||
|
|
||||||
|
$qry .= " ORDER BY termin DESC";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
}
|
||||||
|
|
||||||
public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes)
|
public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -68,14 +233,13 @@ class Paabgabe_model extends DB_Model
|
|||||||
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
||||||
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
||||||
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
||||||
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
|
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
||||||
FROM campus.tbl_paabgabe
|
FROM campus.tbl_paabgabe
|
||||||
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
||||||
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
|
JOIN public.tbl_studiengang ON(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
||||||
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
|
||||||
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
||||||
JOIN public.tbl_person USING (person_id)
|
JOIN public.tbl_person USING (person_id)
|
||||||
|
|
||||||
@@ -93,7 +257,7 @@ class Paabgabe_model extends DB_Model
|
|||||||
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
||||||
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
||||||
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
||||||
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
|
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id,
|
lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id,
|
||||||
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
||||||
|
|
||||||
@@ -101,8 +265,7 @@ class Paabgabe_model extends DB_Model
|
|||||||
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
||||||
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
||||||
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
|
|
||||||
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
||||||
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
||||||
JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
||||||
|
|||||||
@@ -23,9 +23,11 @@ class Projektarbeit_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null)
|
public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null)
|
||||||
{
|
{
|
||||||
|
$sprache_index = "COALESCE((SELECT index FROM public.tbl_sprache WHERE sprache=" . $this->escape(getUserLanguage()) . " LIMIT 1), 1)";
|
||||||
$qry = "SELECT
|
$qry = "SELECT
|
||||||
pa.*, tbl_projekttyp.bezeichnung,
|
pa.*, tbl_projekttyp.bezeichnung, tbl_lehrveranstaltung.lehrveranstaltung_id,
|
||||||
tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id,
|
tbl_sprache.bezeichnung[".$sprache_index."] AS sprache_bezeichnung,
|
||||||
|
pa.studiensemester_kurzbz, pa.lehrveranstaltung_id,
|
||||||
tbl_firma.name AS firma_name,
|
tbl_firma.name AS firma_name,
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
@@ -41,9 +43,9 @@ class Projektarbeit_model extends DB_Model
|
|||||||
FROM
|
FROM
|
||||||
lehre.tbl_projektarbeit pa
|
lehre.tbl_projektarbeit pa
|
||||||
JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||||
JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
|
||||||
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||||
LEFT JOIN public.tbl_firma USING (firma_id)
|
LEFT JOIN public.tbl_firma USING (firma_id)
|
||||||
|
LEFT JOIN public.tbl_sprache ON pa.sprache = tbl_sprache.sprache
|
||||||
WHERE
|
WHERE
|
||||||
pa.student_uid = ?";
|
pa.student_uid = ?";
|
||||||
|
|
||||||
@@ -57,7 +59,7 @@ class Projektarbeit_model extends DB_Model
|
|||||||
|
|
||||||
if (isset($studiensemester_kurzbz))
|
if (isset($studiensemester_kurzbz))
|
||||||
{
|
{
|
||||||
$qry .= ' AND tbl_lehreinheit.studiensemester_kurzbz=?';
|
$qry .= ' AND tbl_projektarbeit.studiensemester_kurzbz=?';
|
||||||
$params[] = $studiensemester_kurzbz;
|
$params[] = $studiensemester_kurzbz;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,7 +136,7 @@ class Projektarbeit_model extends DB_Model
|
|||||||
projektarbeit_id,
|
projektarbeit_id,
|
||||||
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
|
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
|
||||||
lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz,
|
lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz,
|
||||||
lehre.tbl_lehreinheit.studiensemester_kurzbz,
|
lehre.tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
lehre.tbl_lehrveranstaltung.studiengang_kz,
|
lehre.tbl_lehrveranstaltung.studiengang_kz,
|
||||||
public.tbl_studiengang.kurzbzlang,
|
public.tbl_studiengang.kurzbzlang,
|
||||||
lehre.tbl_projektarbeit.note as note,
|
lehre.tbl_projektarbeit.note as note,
|
||||||
@@ -157,7 +159,6 @@ class Projektarbeit_model extends DB_Model
|
|||||||
LEFT JOIN public.tbl_benutzer USING(person_id)
|
LEFT JOIN public.tbl_benutzer USING(person_id)
|
||||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||||
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
||||||
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
|
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
|
||||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
@@ -366,7 +367,7 @@ class Projektarbeit_model extends DB_Model
|
|||||||
tbl_studiengang.typ, tbl_studiengang.kurzbz,
|
tbl_studiengang.typ, tbl_studiengang.kurzbz,
|
||||||
tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung,
|
tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung,
|
||||||
tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
|
tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
|
||||||
student_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid,
|
student_benutzer.uid, tbl_student.matrikelnr, tbl_projektarbeit.studiensemester_kurzbz, public.tbl_student.student_uid,
|
||||||
|
|
||||||
lehre.tbl_projektarbeit.sprache,
|
lehre.tbl_projektarbeit.sprache,
|
||||||
lehre.tbl_projektarbeit.seitenanzahl,
|
lehre.tbl_projektarbeit.seitenanzahl,
|
||||||
@@ -430,7 +431,6 @@ class Projektarbeit_model extends DB_Model
|
|||||||
LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
|
LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
|
||||||
LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
|
LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
|
||||||
LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
|
LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
|
||||||
LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||||
LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
|
LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
|
||||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||||
@@ -503,7 +503,7 @@ class Projektarbeit_model extends DB_Model
|
|||||||
student_person.vorname AS student_vorname,
|
student_person.vorname AS student_vorname,
|
||||||
student_person.nachname AS student_nachname,
|
student_person.nachname AS student_nachname,
|
||||||
public.tbl_student.matrikelnr,
|
public.tbl_student.matrikelnr,
|
||||||
tbl_lehreinheit.studiensemester_kurzbz,
|
tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
betreuer_benutzer.uid AS betreuer_benutzer_uid,
|
betreuer_benutzer.uid AS betreuer_benutzer_uid,
|
||||||
betreuer_person.titelpre AS betreuer_titelpre,
|
betreuer_person.titelpre AS betreuer_titelpre,
|
||||||
betreuer_person.vorname AS betreuer_vorname,
|
betreuer_person.vorname AS betreuer_vorname,
|
||||||
@@ -565,7 +565,6 @@ class Projektarbeit_model extends DB_Model
|
|||||||
LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
|
LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
|
||||||
LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
|
LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
|
||||||
LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
|
LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
|
||||||
LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||||
LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
|
LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
|
||||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||||
@@ -633,7 +632,7 @@ class Projektarbeit_model extends DB_Model
|
|||||||
student_person.vorname AS student_vorname,
|
student_person.vorname AS student_vorname,
|
||||||
student_person.nachname AS student_nachname,
|
student_person.nachname AS student_nachname,
|
||||||
public.tbl_student.matrikelnr,
|
public.tbl_student.matrikelnr,
|
||||||
tbl_lehreinheit.studiensemester_kurzbz,
|
tbl_projektarbeit.studiensemester_kurzbz,
|
||||||
betreuer_benutzer.uid AS betreuer_benutzer_uid,
|
betreuer_benutzer.uid AS betreuer_benutzer_uid,
|
||||||
betreuer_person.titelpre AS betreuer_titelpre,
|
betreuer_person.titelpre AS betreuer_titelpre,
|
||||||
betreuer_person.vorname AS betreuer_vorname,
|
betreuer_person.vorname AS betreuer_vorname,
|
||||||
@@ -695,7 +694,6 @@ class Projektarbeit_model extends DB_Model
|
|||||||
LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
|
LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
|
||||||
LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
|
LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
|
||||||
LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
|
LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
|
||||||
LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||||
LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
|
LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
|
||||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||||
|
|||||||
@@ -306,4 +306,5 @@ class Pruefung_model extends DB_Model
|
|||||||
|
|
||||||
return $this->loadWhereCommitteeExamsFailed();
|
return $this->loadWhereCommitteeExamsFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -515,4 +515,75 @@ class Studierendenantrag_model extends DB_Model
|
|||||||
|
|
||||||
return hasData($this->load());
|
return hasData($this->load());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads all todos for a certain studiengangsleiter
|
||||||
|
*
|
||||||
|
* @param integer $stg_kz
|
||||||
|
*
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function getOpenAntraegeForStgl($stg_kz)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
studierendenantrag_id,
|
||||||
|
prestudent_id,
|
||||||
|
typ,
|
||||||
|
person.nachname,
|
||||||
|
person.vorname,
|
||||||
|
ps.studiengang_kz
|
||||||
|
FROM campus.tbl_studierendenantrag a
|
||||||
|
JOIN public.tbl_prestudent ps USING (prestudent_id)
|
||||||
|
JOIN public.tbl_person person USING (person_id)
|
||||||
|
WHERE studiengang_kz in ?
|
||||||
|
AND (
|
||||||
|
(typ IN ('Abmeldung', 'AbmeldungStgl', 'Unterbrechung')
|
||||||
|
AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Erstellt')
|
||||||
|
OR
|
||||||
|
(typ = 'Wiederholung'
|
||||||
|
AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Lvszugewiesen')
|
||||||
|
)
|
||||||
|
ORDER BY typ;
|
||||||
|
";
|
||||||
|
|
||||||
|
$params = array($stg_kz);
|
||||||
|
return $this->execQuery($qry, $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lists all open antraege for a certain stg
|
||||||
|
*
|
||||||
|
* @param Array $stg_kz
|
||||||
|
*
|
||||||
|
* @return stdClass
|
||||||
|
*/
|
||||||
|
public function getOpenAntraegeForAss($stg_kz)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
UPPER(stg.typ) || UPPER(stg.kurzbz) || ' ' || stg.bezeichnung AS studiengang,
|
||||||
|
COUNT(*) AS anzahl
|
||||||
|
FROM campus.tbl_studierendenantrag
|
||||||
|
JOIN public.tbl_prestudent p USING (prestudent_id)
|
||||||
|
JOIN public.tbl_studiengang stg ON p.studiengang_kz=stg.studiengang_kz
|
||||||
|
JOIN campus.tbl_studierendenantrag_status as s ON campus.get_status_id_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = studierendenantrag_status_id
|
||||||
|
JOIN campus.tbl_studierendenantrag_statustyp as st USING (studierendenantrag_statustyp_kurzbz)
|
||||||
|
WHERE (
|
||||||
|
s.studierendenantrag_statustyp_kurzbz NOT IN('Zurueckgezogen', 'Genehmigt', 'Abgelehnt', 'EinspruchAbgelehnt', 'Abgemeldet', 'Pause', 'EmailVersandt')
|
||||||
|
OR (
|
||||||
|
s.studierendenantrag_statustyp_kurzbz = 'Genehmigt'
|
||||||
|
AND tbl_studierendenantrag.typ = 'AbmeldungStgl'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
AND p.studiengang_kz IN ?
|
||||||
|
GROUP BY studiengang
|
||||||
|
ORDER BY studiengang
|
||||||
|
"
|
||||||
|
;
|
||||||
|
|
||||||
|
$params = array($stg_kz);
|
||||||
|
return $this->execQuery($qry, $params);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -653,31 +653,42 @@ class Studiengang_model extends DB_Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Gets the Studiengang information. Without parameters it uses the Studiengang
|
||||||
|
* of the logged in Student.
|
||||||
|
*
|
||||||
|
* @param int|null $studiengang_kz
|
||||||
|
* @param int|null $semester used for the Jahrgangsvertretung
|
||||||
* @return stdClass
|
* @return stdClass
|
||||||
*/
|
*/
|
||||||
public function getStudiengangInfoForNews()
|
public function getStudiengangInfoForNews($studiengang_kz = null, $semester = null)
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||||
$this->load->model('person/Person_model', 'PersonModel');
|
$this->load->model('person/Person_model', 'PersonModel');
|
||||||
$this->load->model('crm/Student_model', 'StudentModel');
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
|
||||||
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
|
if (is_null($studiengang_kz))
|
||||||
if (isError($student))
|
{
|
||||||
return error($student);
|
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
|
||||||
if (getData($student)) {
|
if (isError($student))
|
||||||
$student = current(getData($student));
|
return error($student);
|
||||||
$studiengang_kz = $student->studiengang_kz;
|
if (getData($student)) {
|
||||||
$semester = $student->semester;
|
$student = current(getData($student));
|
||||||
|
$studiengang_kz = $student->studiengang_kz;
|
||||||
|
$semester = $student->semester;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// users without a Student record get no information instead of an error
|
||||||
|
if (is_null($studiengang_kz))
|
||||||
|
return success(null);
|
||||||
|
|
||||||
$stg_obj = $this->load($studiengang_kz);
|
$stg_obj = $this->load($studiengang_kz);
|
||||||
if(isError($stg_obj))
|
if(isError($stg_obj))
|
||||||
return error($stg_obj);
|
return error($stg_obj);
|
||||||
if(getData($stg_obj))
|
if(!hasData($stg_obj))
|
||||||
{
|
return error('Studiengang nicht gefunden');
|
||||||
$stg_obj = current(getData($stg_obj));
|
$stg_obj = current(getData($stg_obj));
|
||||||
}
|
|
||||||
|
|
||||||
$stg_ltg = $this->getLeitungDetailed($stg_obj->studiengang_kz);
|
$stg_ltg = $this->getLeitungDetailed($stg_obj->studiengang_kz);
|
||||||
if (isError($stg_ltg))
|
if (isError($stg_ltg))
|
||||||
@@ -886,6 +897,14 @@ class Studiengang_model extends DB_Model
|
|||||||
return success($ass);
|
return success($ass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getDegreePrograms() {
|
||||||
|
$query = "SELECT *
|
||||||
|
FROM public.tbl_studiengang
|
||||||
|
ORDER BY public.tbl_studiengang.kurzbzlang";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($query);
|
||||||
|
}
|
||||||
|
|
||||||
private function addEmailProperty(&$benutzerfunktionen) {
|
private function addEmailProperty(&$benutzerfunktionen) {
|
||||||
if(count($benutzerfunktionen) && defined('DOMAIN'))
|
if(count($benutzerfunktionen) && defined('DOMAIN'))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -59,6 +59,37 @@ class Studienplan_model extends DB_Model
|
|||||||
'tbl_studienplan_lehrveranstaltung.semester' => $semester
|
'tbl_studienplan_lehrveranstaltung.semester' => $semester
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getStudienplanByLvaSemKurzbz($lehrveranstaltung_id, $studiensemester_kurzbz) {
|
||||||
|
$qry= "
|
||||||
|
SELECT
|
||||||
|
DISTINCT tbl_studienplan.*
|
||||||
|
FROM
|
||||||
|
lehre.tbl_studienplan
|
||||||
|
JOIN lehre.tbl_studienplan_lehrveranstaltung
|
||||||
|
USING(studienplan_id)
|
||||||
|
WHERE
|
||||||
|
tbl_studienplan_lehrveranstaltung.lehrveranstaltung_id IN (
|
||||||
|
SELECT
|
||||||
|
lv.lehrveranstaltung_id
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehrveranstaltung AS lv
|
||||||
|
LEFT JOIN lehre.tbl_lehrveranstaltung AS t ON t.lehrveranstaltung_id=lv.lehrveranstaltung_template_id
|
||||||
|
WHERE
|
||||||
|
lv.lehrtyp_kurzbz<>'tpl'
|
||||||
|
AND (lv.lehrveranstaltung_id= ? OR (lv.lehrveranstaltung_template_id= ? AND t.lehrtyp_kurzbz='tpl'))
|
||||||
|
)
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM
|
||||||
|
lehre.tbl_studienplan_semester
|
||||||
|
WHERE studienplan_id=tbl_studienplan.studienplan_id
|
||||||
|
AND studiensemester_kurzbz= ?
|
||||||
|
AND semester = tbl_studienplan_lehrveranstaltung.semester)
|
||||||
|
ORDER BY bezeichnung";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, array($lehrveranstaltung_id, $lehrveranstaltung_id, $studiensemester_kurzbz));
|
||||||
|
}
|
||||||
|
|
||||||
public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id)
|
public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ class Studiensemester_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function getByDate($date)
|
public function getByDate($date)
|
||||||
{
|
{
|
||||||
// gets the studiensemster of a date or the next closest previous studiensemester if a date is not within a studiensemester
|
// gets the studiensemester of a date or the next closest previous studiensemester if a date is not within a studiensemester
|
||||||
$query = "
|
$query = "
|
||||||
SELECT studiensemester_kurzbz, start, ende
|
SELECT studiensemester_kurzbz, start, ende
|
||||||
FROM public.tbl_studiensemester
|
FROM public.tbl_studiensemester
|
||||||
@@ -292,13 +292,29 @@ class Studiensemester_model extends DB_Model
|
|||||||
COALESCE(
|
COALESCE(
|
||||||
(SELECT studiensemester_kurzbz FROM semester_interval_startdate),
|
(SELECT studiensemester_kurzbz FROM semester_interval_startdate),
|
||||||
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
|
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
|
||||||
) AS studiensemester_kurzbz
|
) AS studiensemester_kurzbz,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT start FROM semester_interval_startdate),
|
||||||
|
(SELECT start FROM nearest_semester_interval_startdate)
|
||||||
|
) as start,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT ende FROM semester_interval_startdate),
|
||||||
|
(SELECT ende FROM nearest_semester_interval_startdate)
|
||||||
|
) as ende
|
||||||
UNION
|
UNION
|
||||||
SELECT
|
SELECT
|
||||||
COALESCE(
|
COALESCE(
|
||||||
(SELECT studiensemester_kurzbz FROM semester_interval_enddate),
|
(SELECT studiensemester_kurzbz FROM semester_interval_enddate),
|
||||||
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
|
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
|
||||||
) AS studiensemester_kurzbz
|
) AS studiensemester_kurzbz,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT start FROM semester_interval_enddate),
|
||||||
|
(SELECT start FROM nearest_semester_interval_enddate)
|
||||||
|
) as start,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT ende FROM semester_interval_enddate),
|
||||||
|
(SELECT ende FROM nearest_semester_interval_enddate)
|
||||||
|
) as ende
|
||||||
|
|
||||||
EOSQL;
|
EOSQL;
|
||||||
|
|
||||||
@@ -359,6 +375,30 @@ EOSQL;
|
|||||||
return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]);
|
return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getWhereMitarbeiterHasLvs($uid) {
|
||||||
|
// first order by year with last 2 letter from right,
|
||||||
|
// then order by WS/SS inside the years
|
||||||
|
// query it asc so the ordering magic in cis4 turns it around again
|
||||||
|
$qry = "WITH unique_semesters AS (
|
||||||
|
SELECT DISTINCT ON (studiensemester_kurzbz)
|
||||||
|
studiensemester_kurzbz,
|
||||||
|
start,
|
||||||
|
ende,
|
||||||
|
bezeichnung,
|
||||||
|
studienjahr_kurzbz
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
|
||||||
|
WHERE mitarbeiter_uid = ?
|
||||||
|
)
|
||||||
|
SELECT * FROM unique_semesters
|
||||||
|
ORDER BY
|
||||||
|
RIGHT(studiensemester_kurzbz, 2) ASC,
|
||||||
|
LEFT(studiensemester_kurzbz, 2) ASC;";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, [$uid]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getAktAndFutureSemester()
|
public function getAktAndFutureSemester()
|
||||||
{
|
{
|
||||||
$query = 'SELECT studiensemester_kurzbz
|
$query = 'SELECT studiensemester_kurzbz
|
||||||
|
|||||||
@@ -319,6 +319,40 @@ class Benutzerfunktion_model extends DB_Model
|
|||||||
return $record;
|
return $record;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get active Assistenz(en) of the user by UID.
|
||||||
|
* @param $uid
|
||||||
|
*/
|
||||||
|
public function getSTGAssByUID($uid)
|
||||||
|
{
|
||||||
|
$query = '
|
||||||
|
SELECT
|
||||||
|
uid,
|
||||||
|
oe_kurzbz,
|
||||||
|
studiengang_kz,
|
||||||
|
typ,
|
||||||
|
tbl_studiengang.bezeichnung
|
||||||
|
FROM
|
||||||
|
public.tbl_benutzerfunktion
|
||||||
|
JOIN public.tbl_studiengang USING (oe_kurzbz)
|
||||||
|
WHERE
|
||||||
|
funktion_kurzbz = \'ass\'
|
||||||
|
AND (datum_von IS NULL OR datum_von <= now())
|
||||||
|
AND (datum_bis IS NULL OR datum_bis >= now())
|
||||||
|
AND uid = ?
|
||||||
|
ORDER BY
|
||||||
|
oe_kurzbz
|
||||||
|
';
|
||||||
|
|
||||||
|
$parameters_array = array();
|
||||||
|
if (is_string($uid))
|
||||||
|
{
|
||||||
|
$parameters_array[] = $uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->execQuery($query, $parameters_array);
|
||||||
|
}
|
||||||
|
|
||||||
function updateBenutzerfunktion($funktionJson)
|
function updateBenutzerfunktion($funktionJson)
|
||||||
{
|
{
|
||||||
$funktionJson['updatevon'] = getAuthUID();
|
$funktionJson['updatevon'] = getAuthUID();
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class Notiz_model extends DB_Model
|
|||||||
/**
|
/**
|
||||||
* Add a Notiz for a given person
|
* Add a Notiz for a given person
|
||||||
*/
|
*/
|
||||||
public function addNotizForPerson($person_id, $titel, $text, $erledigt, $verfasser_uid)
|
public function addNotizForPerson($person_id, $titel, $text, $erledigt, $verfasser_uid, $insertvon = null)
|
||||||
{
|
{
|
||||||
// Loads model Notizzuordnung_model
|
// Loads model Notizzuordnung_model
|
||||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||||
@@ -106,8 +106,15 @@ class Notiz_model extends DB_Model
|
|||||||
// Start DB transaction
|
// Start DB transaction
|
||||||
$this->db->trans_start(false);
|
$this->db->trans_start(false);
|
||||||
|
|
||||||
$result = $this->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid,
|
$result = $this->insert(
|
||||||
"insertvon" => $verfasser_uid));
|
array(
|
||||||
|
'titel' => $titel,
|
||||||
|
'text' => $text,
|
||||||
|
'erledigt' => $erledigt,
|
||||||
|
'verfasser_uid' => $verfasser_uid,
|
||||||
|
'insertvon' => $insertvon ?? $verfasser_uid
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
if (isSuccess($result))
|
if (isSuccess($result))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,12 @@ class Ort_model extends DB_Model
|
|||||||
$this->pk = "ort_kurzbz";
|
$this->pk = "ort_kurzbz";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRoomInfo($ortKurzbz)
|
||||||
|
{
|
||||||
|
$this->addSelect("ort_kurzbz, ausstattung");
|
||||||
|
return $this->OrtModel->loadWhere(array("ort_kurzbz" => $ortKurzbz));
|
||||||
|
}
|
||||||
|
|
||||||
public function getAll($raumtyp_kurzbz)
|
public function getAll($raumtyp_kurzbz)
|
||||||
{
|
{
|
||||||
$this->addOrder("ort_kurzbz");
|
$this->addOrder("ort_kurzbz");
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class Reservierung_model extends DB_Model
|
|||||||
$lvplan_reservierungen_query = "SELECT r.* , stund.beginn, stund.ende,
|
$lvplan_reservierungen_query = "SELECT r.* , stund.beginn, stund.ende,
|
||||||
CASE
|
CASE
|
||||||
WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz
|
WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz
|
||||||
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/'))
|
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/'),COALESCE(CAST(r.gruppe AS varchar),'/'))
|
||||||
END as gruppen_kuerzel
|
END as gruppen_kuerzel
|
||||||
FROM campus.vw_reservierung r
|
FROM campus.vw_reservierung r
|
||||||
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=r.studiengang_kz
|
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=r.studiengang_kz
|
||||||
@@ -39,7 +39,7 @@ class Reservierung_model extends DB_Model
|
|||||||
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
||||||
CASE
|
CASE
|
||||||
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
||||||
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
|
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'),COALESCE(CAST(res.gruppe AS varchar),'/'))
|
||||||
END as gruppen_kuerzel
|
END as gruppen_kuerzel
|
||||||
FROM campus.vw_reservierung res
|
FROM campus.vw_reservierung res
|
||||||
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
||||||
@@ -50,11 +50,12 @@ class Reservierung_model extends DB_Model
|
|||||||
|
|
||||||
$query_result = $this->execReadOnlyQuery("
|
$query_result = $this->execReadOnlyQuery("
|
||||||
SELECT
|
SELECT
|
||||||
'reservierung' as type, beginn, ende, datum,
|
DISTINCT(insertvon),
|
||||||
|
'reservierung' as type, beginn, ende, datum, array_agg(DISTINCT reservierung_id) AS reservierung_id,
|
||||||
COALESCE(titel, beschreibung) as topic,
|
COALESCE(titel, beschreibung) as topic,
|
||||||
array_agg(DISTINCT mitarbeiter_kurzbz) as lektor,
|
array_agg(DISTINCT mitarbeiter_kurzbz) as lektor,
|
||||||
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
||||||
|
array_agg(DISTINCT(uid)) as uids,
|
||||||
ort_kurzbz, 'FFFFFF' as farbe
|
ort_kurzbz, 'FFFFFF' as farbe
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
@@ -62,7 +63,7 @@ class Reservierung_model extends DB_Model
|
|||||||
" . $subquery . "
|
" . $subquery . "
|
||||||
) AS subquery
|
) AS subquery
|
||||||
|
|
||||||
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung, insertvon
|
||||||
|
|
||||||
ORDER BY datum, beginn
|
ORDER BY datum, beginn
|
||||||
", is_null($ort_kurzbz) ? [$uid ?? getAuthUID(), $uid ?? getAuthUID(), $start_date, $end_date] : [$ort_kurzbz, $start_date, $end_date]);
|
", is_null($ort_kurzbz) ? [$uid ?? getAuthUID(), $uid ?? getAuthUID(), $start_date, $end_date] : [$ort_kurzbz, $start_date, $end_date]);
|
||||||
@@ -82,7 +83,7 @@ class Reservierung_model extends DB_Model
|
|||||||
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
||||||
CASE
|
CASE
|
||||||
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
||||||
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
|
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'),COALESCE(CAST(res.gruppe AS varchar),'/'))
|
||||||
END as gruppen_kuerzel
|
END as gruppen_kuerzel
|
||||||
FROM campus.vw_reservierung res
|
FROM campus.vw_reservierung res
|
||||||
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
||||||
@@ -94,11 +95,12 @@ class Reservierung_model extends DB_Model
|
|||||||
|
|
||||||
$query_result = $this->execReadOnlyQuery("
|
$query_result = $this->execReadOnlyQuery("
|
||||||
SELECT
|
SELECT
|
||||||
'reservierung' as type, beginn, ende, datum,
|
DISTINCT(insertvon),
|
||||||
|
'reservierung' as type, beginn, ende, datum, array_agg(DISTINCT reservierung_id) AS reservierung_id,
|
||||||
COALESCE(titel, beschreibung) as topic,
|
COALESCE(titel, beschreibung) as topic,
|
||||||
array_agg(DISTINCT mitarbeiter_kurzbz) as lektor,
|
array_agg(DISTINCT mitarbeiter_kurzbz) as lektor,
|
||||||
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
||||||
|
array_agg(DISTINCT(uid)) as uids,
|
||||||
ort_kurzbz, 'FFFFFF' as farbe
|
ort_kurzbz, 'FFFFFF' as farbe
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
@@ -106,7 +108,7 @@ class Reservierung_model extends DB_Model
|
|||||||
" . $subquery . "
|
" . $subquery . "
|
||||||
) AS subquery
|
) AS subquery
|
||||||
|
|
||||||
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung, insertvon
|
||||||
|
|
||||||
ORDER BY datum, beginn
|
ORDER BY datum, beginn
|
||||||
", [$uid ?? getAuthUID(), $start_date, $end_date]);
|
", [$uid ?? getAuthUID(), $start_date, $end_date]);
|
||||||
@@ -146,4 +148,40 @@ class Reservierung_model extends DB_Model
|
|||||||
return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]);
|
return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function deleteReservation($reservierung_id) {
|
||||||
|
$uid = getAuthUID();
|
||||||
|
|
||||||
|
$result = $this->load($reservierung_id);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
if (!hasData($result))
|
||||||
|
return error('Reservierung nicht gefunden');
|
||||||
|
|
||||||
|
$row = $result->retval[0];
|
||||||
|
|
||||||
|
if ($row->uid !== $uid && $row->insertvon !== $uid)
|
||||||
|
return error('Keine Berechtigung');
|
||||||
|
|
||||||
|
return $this->delete($reservierung_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMyReservation() {
|
||||||
|
$uid = getAuthUID();
|
||||||
|
$date = date("Y-m-d",time());
|
||||||
|
|
||||||
|
$qry = "SELECT vw_reservierung.*,
|
||||||
|
trim(COALESCE(vw_mitarbeiter.titelpre,'')||' '||COALESCE(vw_mitarbeiter.vorname,'')||' '||COALESCE(vw_mitarbeiter.nachname,'')||' '||COALESCE(vw_mitarbeiter.titelpost,'')) as reserviert_fuer,
|
||||||
|
trim(COALESCE(reserviert_von.titelpre,'')||' '||COALESCE(reserviert_von.vorname,'')||' '||COALESCE(reserviert_von.nachname,'')||' '||COALESCE(reserviert_von.titelpost,'')) as reserviert_von
|
||||||
|
FROM campus.vw_reservierung
|
||||||
|
JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid
|
||||||
|
LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid
|
||||||
|
WHERE datum >= ?
|
||||||
|
AND (vw_reservierung.uid= ? OR vw_reservierung.insertvon= ? )
|
||||||
|
ORDER BY datum, titel, ort_kurzbz, stunde";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, [$date, $uid, $uid]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ class Zeitsperre_model extends DB_Model
|
|||||||
$this->pk = 'zeitsperre_id';
|
$this->pk = 'zeitsperre_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const BLOCKIERENDE_ZEITSPERREN = ['Krank','Urlaub','ZA','DienstV','PflegeU','DienstF','CovidSB','CovidKS'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save or update Zeitsperre.
|
* Save or update Zeitsperre.
|
||||||
*
|
*
|
||||||
@@ -62,6 +64,270 @@ class Zeitsperre_model extends DB_Model
|
|||||||
return $this->execQuery($qry);
|
return $this->execQuery($qry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get Zeitsperren of a user
|
||||||
|
*
|
||||||
|
* @param $uid mitarbeiteruid
|
||||||
|
* @param $bisgrenze @true show only entries of actual business year (1.9.- 31.8.)
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getZeitsperrenUser($uid, $bisgrenze = true)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
tbl_zeitsperre.*, tbl_zeitsperretyp.*, tbl_erreichbarkeit.farbe AS erreichbarkeit_farbe,
|
||||||
|
tbl_erreichbarkeit.beschreibung AS erreichbarkeit_beschreibung,
|
||||||
|
CONCAT (ps.vorname, ' ', ps.nachname) as vertretung
|
||||||
|
FROM (campus.tbl_zeitsperre JOIN campus.tbl_zeitsperretyp USING (zeitsperretyp_kurzbz))
|
||||||
|
LEFT JOIN campus.tbl_erreichbarkeit USING (erreichbarkeit_kurzbz)
|
||||||
|
LEFT JOIN public.tbl_benutzer ON campus.tbl_zeitsperre.vertretung_uid = public.tbl_benutzer.uid
|
||||||
|
LEFT JOIN public.tbl_person ps USING (person_id)
|
||||||
|
WHERE mitarbeiter_uid= ?
|
||||||
|
";
|
||||||
|
|
||||||
|
if($bisgrenze)
|
||||||
|
{
|
||||||
|
$qry.="
|
||||||
|
AND (
|
||||||
|
(date_part('month',vondatum)>=9 AND date_part('year', vondatum)>='".(date('Y')-1)."')
|
||||||
|
OR
|
||||||
|
(date_part('month',vondatum)<9 AND date_part('year', vondatum)>='".(date('Y'))."')
|
||||||
|
)";
|
||||||
|
}
|
||||||
|
|
||||||
|
$qry.= " ORDER BY vondatum DESC";
|
||||||
|
|
||||||
|
return $this->execQuery($qry, array('mitarbeiter_uid' => $uid));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check a date for existing zeitsperre
|
||||||
|
*
|
||||||
|
* @param $uid mitarbeiteruid
|
||||||
|
* @param $datum datum to check
|
||||||
|
* @param $stunde stunde (default = null)
|
||||||
|
* @param bool $nurblockierend if only hr relevante zeitsperren have to be checked
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getSperreByDate($uid, $datum, $stunde = null, $nurblockierend = false)
|
||||||
|
{
|
||||||
|
$parametersArray = [$datum, $datum];
|
||||||
|
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
*
|
||||||
|
FROM
|
||||||
|
campus.tbl_zeitsperre
|
||||||
|
WHERE
|
||||||
|
vondatum <= ?
|
||||||
|
AND bisdatum>= ?";
|
||||||
|
|
||||||
|
if($nurblockierend)
|
||||||
|
{
|
||||||
|
$qry .= " AND zeitsperretyp_kurzbz IN ('"
|
||||||
|
. implode("','", self::BLOCKIERENDE_ZEITSPERREN)
|
||||||
|
. "')";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!is_null($stunde))
|
||||||
|
{
|
||||||
|
$parametersArray = array_merge(
|
||||||
|
$parametersArray,
|
||||||
|
[$datum, $stunde, $datum, $datum, $stunde, $datum]
|
||||||
|
);
|
||||||
|
|
||||||
|
$qry.=" AND
|
||||||
|
((vondatum= ? AND vonstunde<= ? OR vonstunde is null OR vondatum<> ?) AND
|
||||||
|
(bisdatum= ? AND bisstunde>= ? OR bisstunde is null OR bisdatum<> ?))";
|
||||||
|
}
|
||||||
|
|
||||||
|
array_push($parametersArray, $uid);
|
||||||
|
|
||||||
|
$qry .= "AND mitarbeiter_uid= ? ";
|
||||||
|
|
||||||
|
return $this->execQuery($qry, $parametersArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check a date for existing zeitsperre
|
||||||
|
*
|
||||||
|
* @param $uid mitarbeiteruid
|
||||||
|
* @param $vondatum datum in Format IS0
|
||||||
|
* @param $bisdatum datum in Format ISO
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function existsZeitaufzeichnung($uid, $vonDay, $bisDay)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$from = new DateTime($vonDay);
|
||||||
|
$to = new DateTime($bisDay);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new Exception("Invalid date format");
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove hour stamps
|
||||||
|
$from->setTime(0, 0, 0);
|
||||||
|
$to->setTime(0, 0, 0)->modify('+1 day');
|
||||||
|
|
||||||
|
$fromSql = $from->format('Y-m-d');
|
||||||
|
$toSql = $to->format('Y-m-d');
|
||||||
|
$params = [$uid, $fromSql, $toSql];
|
||||||
|
|
||||||
|
$qry = "
|
||||||
|
SELECT *
|
||||||
|
FROM campus.tbl_zeitaufzeichnung
|
||||||
|
WHERE uid = ?
|
||||||
|
AND start >= ?
|
||||||
|
AND ende < ? ";
|
||||||
|
|
||||||
|
$result = $this->execQuery($qry, $params);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getZeitsperren of Mitarbeiter for the next days
|
||||||
|
* @ days: count of the intervall of the next days
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getZeitsperrenForNextDays($days, $uid=null)
|
||||||
|
{
|
||||||
|
$von = date('Y-m-d');
|
||||||
|
$bis = date('Y-m-d', strtotime("+{$days} days"));
|
||||||
|
|
||||||
|
$paramsArray = [$von, $bis, $bis, $von];
|
||||||
|
|
||||||
|
if($uid)
|
||||||
|
$paramsArray[] = $uid;
|
||||||
|
|
||||||
|
$qry = "select
|
||||||
|
nachname,
|
||||||
|
vorname,
|
||||||
|
uid,
|
||||||
|
vondatum,
|
||||||
|
bisdatum,
|
||||||
|
vertretung_uid,
|
||||||
|
erreichbarkeit_kurzbz,
|
||||||
|
mv.kurzbz
|
||||||
|
from
|
||||||
|
campus.vw_mitarbeiter
|
||||||
|
join campus.tbl_zeitsperre on
|
||||||
|
(uid = mitarbeiter_uid)
|
||||||
|
left join public.tbl_mitarbeiter mv on campus.tbl_zeitsperre.vertretung_uid = mv.mitarbeiter_uid
|
||||||
|
where
|
||||||
|
((? <= bisdatum
|
||||||
|
and ? >= bisdatum)
|
||||||
|
or (?>= vondatum
|
||||||
|
and ? <= vondatum))";
|
||||||
|
|
||||||
|
if($uid)
|
||||||
|
$qry .= " and uid = ? ";
|
||||||
|
|
||||||
|
$qry .= "
|
||||||
|
order by nachname
|
||||||
|
";
|
||||||
|
|
||||||
|
$result = $this->execQuery($qry, $paramsArray);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMitarbeiterWithZeitsperren($von, $bis, $fix=false, $lector=false, $oe=null, $ass=false, $stg=false)
|
||||||
|
{
|
||||||
|
$paramsArray = [$von, $bis, $bis, $von];
|
||||||
|
|
||||||
|
if($oe)
|
||||||
|
{
|
||||||
|
$paramsArray[] = $oe;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($stg)
|
||||||
|
{
|
||||||
|
$paramsArray[] = $stg;
|
||||||
|
}
|
||||||
|
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
m.nachname,
|
||||||
|
m.vorname,
|
||||||
|
m.uid,
|
||||||
|
z.vondatum,
|
||||||
|
z.bisdatum,
|
||||||
|
z.vertretung_uid,
|
||||||
|
z.erreichbarkeit_kurzbz,
|
||||||
|
m.lektor,
|
||||||
|
m.fixangestellt,
|
||||||
|
mv.kurzbz
|
||||||
|
FROM campus.vw_mitarbeiter m
|
||||||
|
join public.tbl_benutzer bn on bn.uid = m.uid";
|
||||||
|
|
||||||
|
if($oe || $ass || $stg)
|
||||||
|
{
|
||||||
|
$qry .= " JOIN public.tbl_benutzerfunktion bf on bf.uid = bn.uid";
|
||||||
|
}
|
||||||
|
|
||||||
|
if($stg)
|
||||||
|
{
|
||||||
|
$qry .= " JOIN public.tbl_studiengang stg using (oe_kurzbz)";
|
||||||
|
}
|
||||||
|
|
||||||
|
$qry.= "
|
||||||
|
LEFT JOIN campus.tbl_zeitsperre z
|
||||||
|
ON m.uid = z.mitarbeiter_uid
|
||||||
|
AND (
|
||||||
|
(? <= z.bisdatum AND ? >= z.bisdatum)
|
||||||
|
OR
|
||||||
|
(? >= z.vondatum AND ? <= z.vondatum)
|
||||||
|
)
|
||||||
|
left join public.tbl_mitarbeiter mv on z.vertretung_uid = mv.mitarbeiter_uid
|
||||||
|
where bn.aktiv = true
|
||||||
|
";
|
||||||
|
|
||||||
|
|
||||||
|
if($fix) {
|
||||||
|
$qry.= " AND m.fixangestellt = true";
|
||||||
|
}
|
||||||
|
if($lector) {
|
||||||
|
$qry.= " AND m.lektor = true";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($oe)
|
||||||
|
{
|
||||||
|
$qry.= "
|
||||||
|
AND bf.funktion_kurzbz ='oezuordnung'
|
||||||
|
AND bf.oe_kurzbz= ?
|
||||||
|
AND (bf.datum_von is null or bf.datum_von <=now())
|
||||||
|
AND (bf.datum_bis is null or bf.datum_bis >= now())
|
||||||
|
";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ass)
|
||||||
|
{
|
||||||
|
$qry.= "
|
||||||
|
AND bf.funktion_kurzbz ='ass'
|
||||||
|
AND (bf.datum_von is null or bf.datum_von <=now())
|
||||||
|
AND (bf.datum_bis is null or bf.datum_bis >= now())
|
||||||
|
";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($stg)
|
||||||
|
{
|
||||||
|
$qry.= "
|
||||||
|
AND stg.studiengang_kz = ?
|
||||||
|
";
|
||||||
|
}
|
||||||
|
|
||||||
|
$qry .= " order by nachname, vorname, uid";
|
||||||
|
|
||||||
|
|
||||||
|
$result = $this->execQuery($qry, $paramsArray);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
public function checkIfZeitsperreExists($uid, $datum, $stunde)
|
public function checkIfZeitsperreExists($uid, $datum, $stunde)
|
||||||
{
|
{
|
||||||
$this->db->select("*");
|
$this->db->select("*");
|
||||||
@@ -71,30 +337,29 @@ class Zeitsperre_model extends DB_Model
|
|||||||
|
|
||||||
$this->db->group_start();
|
$this->db->group_start();
|
||||||
|
|
||||||
$this->db->where('vondatum <', $datum);
|
$this->db->where('vondatum <', $datum);
|
||||||
$this->db->or_group_start();
|
$this->db->or_group_start();
|
||||||
$this->db->where('vondatum', $datum);
|
$this->db->where('vondatum', $datum);
|
||||||
$this->db->group_start();
|
$this->db->group_start();
|
||||||
$this->db->where('vonstunde <=', $stunde);
|
$this->db->where('vonstunde <=', $stunde);
|
||||||
$this->db->or_where('vonstunde IS NULL', null, false);
|
$this->db->or_where('vonstunde IS NULL', null, false);
|
||||||
$this->db->group_end();
|
$this->db->group_end();
|
||||||
$this->db->group_end();
|
$this->db->group_end();
|
||||||
$this->db->group_end();
|
$this->db->group_end();
|
||||||
|
|
||||||
|
|
||||||
$this->db->group_start();
|
$this->db->group_start();
|
||||||
$this->db->where('bisdatum >', $datum);
|
$this->db->where('bisdatum >', $datum);
|
||||||
$this->db->or_group_start();
|
$this->db->or_group_start();
|
||||||
$this->db->where('bisdatum', $datum);
|
$this->db->where('bisdatum', $datum);
|
||||||
$this->db->group_start();
|
$this->db->group_start();
|
||||||
$this->db->where('bisstunde >=', $stunde);
|
$this->db->where('bisstunde >=', $stunde);
|
||||||
$this->db->or_where('bisstunde IS NULL', null, false);
|
$this->db->or_where('bisstunde IS NULL', null, false);
|
||||||
$this->db->group_end();
|
$this->db->group_end();
|
||||||
|
|
||||||
$this->db->group_end();
|
$this->db->group_end();
|
||||||
$this->db->group_end();
|
$this->db->group_end();
|
||||||
|
|
||||||
return $this->load();
|
return $this->load();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,20 @@ class Zeitsperretyp_model extends DB_Model
|
|||||||
$this->dbTable = 'campus.tbl_zeitsperretyp';
|
$this->dbTable = 'campus.tbl_zeitsperretyp';
|
||||||
$this->pk = 'zeitsperretyp_kurzbz';
|
$this->pk = 'zeitsperretyp_kurzbz';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTypenZeitsperren($excludedTypes = [])
|
||||||
|
{
|
||||||
|
$whereNotClause = "";
|
||||||
|
if (count($excludedTypes)) {
|
||||||
|
$excludedTypes = array_map(
|
||||||
|
function ($type) {
|
||||||
|
return "'$type'";
|
||||||
|
},
|
||||||
|
$excludedTypes
|
||||||
|
);
|
||||||
|
$excludedTypes = implode(", ", $excludedTypes);
|
||||||
|
$whereNotClause = "WHERE NOT zeitsperretyp_kurzbz IN ($excludedTypes)";
|
||||||
|
}
|
||||||
|
return $this->execQuery("SELECT * FROM $this->dbTable $whereNotClause ORDER BY beschreibung ASC");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ $includesArray = array(
|
|||||||
'primevue3' => true,
|
'primevue3' => true,
|
||||||
'skipID' => '#fhccontent',
|
'skipID' => '#fhccontent',
|
||||||
'vuedatepicker11' => true,
|
'vuedatepicker11' => true,
|
||||||
|
'tinymce5' => true,
|
||||||
'customCSSs' => array(
|
'customCSSs' => array(
|
||||||
'public/css/components/verticalsplit.css',
|
'public/css/components/verticalsplit.css',
|
||||||
'public/css/components/searchbar/searchbar.css',
|
'public/css/components/searchbar/searchbar.css',
|
||||||
@@ -23,7 +24,11 @@ $includesArray = array(
|
|||||||
'public/css/components/FormUnderline.css',
|
'public/css/components/FormUnderline.css',
|
||||||
'public/css/components/abgabetool/abgabe.css',
|
'public/css/components/abgabetool/abgabe.css',
|
||||||
'public/css/Cis4/Cms.css',
|
'public/css/Cis4/Cms.css',
|
||||||
'public/css/Cis4/Studium.css'
|
'public/css/Cis4/Studium.css',
|
||||||
|
'public/css/components/vue-datepicker.css',
|
||||||
|
'public/css/Cis4/Benotungstool.css',
|
||||||
|
'public/css/components/Zeitsperrenma.css', //70747
|
||||||
|
'public/css/Cis4/Zeitsperren.css', //77941
|
||||||
),
|
),
|
||||||
'customJSs' => array(
|
'customJSs' => array(
|
||||||
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
||||||
@@ -37,11 +42,15 @@ $includesArray = array(
|
|||||||
'vendor/npm-asset/primevue/timeline/timeline.min.js',
|
'vendor/npm-asset/primevue/timeline/timeline.min.js',
|
||||||
'vendor/npm-asset/primevue/inplace/inplace.min.js',
|
'vendor/npm-asset/primevue/inplace/inplace.min.js',
|
||||||
'vendor/npm-asset/primevue/message/message.min.js',
|
'vendor/npm-asset/primevue/message/message.min.js',
|
||||||
|
'vendor/npm-asset/primevue/divider/divider.min.js',
|
||||||
|
'vendor/npm-asset/primevue/password/password.js',
|
||||||
|
'vendor/npm-asset/primevue/multiselect/multiselect.js',
|
||||||
'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
|
'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
|
||||||
'vendor/moment/luxonjs/luxon.min.js'
|
'vendor/moment/luxonjs/luxon.min.js'
|
||||||
),
|
),
|
||||||
'customJSModules' => array(
|
'customJSModules' => array(
|
||||||
'public/js/apps/Cis/Cis.js',
|
'public/js/apps/Cis/Cis.js',
|
||||||
|
'vendor/olifolkerd/tabulator5/src/js/modules/ColumnCalcs/ColumnCalcs.js'
|
||||||
),
|
),
|
||||||
|
|
||||||
);
|
);
|
||||||
@@ -49,6 +58,8 @@ $includesArray = array(
|
|||||||
$this->load->view('templates/CISVUE-Header', $includesArray);
|
$this->load->view('templates/CISVUE-Header', $includesArray);
|
||||||
?>
|
?>
|
||||||
<div id="fhccontent" class="h-100" route=<?php echo $route ?>>
|
<div id="fhccontent" class="h-100" route=<?php echo $route ?>>
|
||||||
<router-view></router-view>
|
<router-view
|
||||||
|
:permissions="<?= htmlspecialchars(json_encode($permissions ?? [])); ?>"
|
||||||
|
></router-view>
|
||||||
</div>
|
</div>
|
||||||
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
|
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ $includesArray = array(
|
|||||||
'tinymce5' => true,
|
'tinymce5' => true,
|
||||||
'phrases' => array(
|
'phrases' => array(
|
||||||
'global',
|
'global',
|
||||||
'ui',
|
'ui'
|
||||||
),
|
),
|
||||||
'customCSSs' => [
|
'customCSSs' => [
|
||||||
'public/css/components/vue-datepicker.css',
|
'public/css/components/vue-datepicker.css',
|
||||||
'public/css/components/primevue.css',
|
'public/css/components/primevue.css',
|
||||||
'public/css/Vertragsverwaltung.css',
|
'public/css/Vertragsverwaltung.css',
|
||||||
'public/css/components/Detailheader.css'
|
'public/css/components/Detailheader.css',
|
||||||
],
|
],
|
||||||
'customJSs' => [
|
'customJSs' => [
|
||||||
#'vendor/npm-asset/primevue/tree/tree.min.js',
|
#'vendor/npm-asset/primevue/tree/tree.min.js',
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
$this->load->view(
|
$includesArray = array(
|
||||||
'templates/FHC-Header',
|
|
||||||
array(
|
|
||||||
'title' => 'Lehrauftrag bestellen',
|
'title' => 'Lehrauftrag bestellen',
|
||||||
'jquery3' => true,
|
'jquery3' => true,
|
||||||
'jqueryui1' => true,
|
'jqueryui1' => true,
|
||||||
@@ -12,8 +10,15 @@ $this->load->view(
|
|||||||
'dialoglib' => true,
|
'dialoglib' => true,
|
||||||
'navigationwidget' => true,
|
'navigationwidget' => true,
|
||||||
'addons' => true,
|
'addons' => true,
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Header',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
|
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
|
||||||
@@ -33,4 +38,12 @@ $this->load->view(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
$this->load->view(
|
|
||||||
'templates/FHC-Header',
|
$includesArray = array(
|
||||||
array(
|
|
||||||
'title' => 'Lehrauftrag bestellen',
|
'title' => 'Lehrauftrag bestellen',
|
||||||
'jquery3' => true,
|
'jquery3' => true,
|
||||||
'bootstrap3' => true,
|
'bootstrap3' => true,
|
||||||
@@ -9,8 +8,13 @@ $this->load->view(
|
|||||||
'sbadmintemplate3' => true,
|
'sbadmintemplate3' => true,
|
||||||
'ajaxlib' => true,
|
'ajaxlib' => true,
|
||||||
'navigationwidget' => true,
|
'navigationwidget' => true,
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Header',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
|
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
|
||||||
@@ -34,4 +38,11 @@ $this->load->view(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
<?php
|
||||||
|
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
|
|||||||
@@ -1,89 +1,101 @@
|
|||||||
<?php
|
<?php
|
||||||
$this->load->view(
|
|
||||||
'templates/FHC-Header',
|
$includesArray = array(
|
||||||
array(
|
'title' => 'Lehrauftrag annehmen',
|
||||||
'title' => 'Lehrauftrag annehmen',
|
'jquery3' => true,
|
||||||
'jquery3' => true,
|
'jqueryui1' => true,
|
||||||
'jqueryui1' => true,
|
'jquerycheckboxes1' => true,
|
||||||
'jquerycheckboxes1' => true,
|
'bootstrap5' => true,
|
||||||
'bootstrap5' => true,
|
'fontawesome6' => true,
|
||||||
'fontawesome6' => true,
|
'sbadmintemplate' => false,
|
||||||
'sbadmintemplate' => false,
|
'tabulator5' => true,
|
||||||
'tabulator5' => true,
|
'tabulator5JQuery' => true,
|
||||||
'tabulator5JQuery' => true,
|
'cis'=>true,
|
||||||
'cis'=>true,
|
'momentjs2' => true,
|
||||||
'momentjs2' => true,
|
'ajaxlib' => true,
|
||||||
'ajaxlib' => true,
|
'dialoglib' => true,
|
||||||
'dialoglib' => true,
|
'tablewidget' => true,
|
||||||
'tablewidget' => true,
|
'phrases' => array(
|
||||||
'phrases' => array(
|
'global' => array(
|
||||||
'global' => array(
|
'lehrauftraegeAnnehmen',
|
||||||
'lehrauftraegeAnnehmen',
|
'dokumentePDF',
|
||||||
'dokumentePDF',
|
'PDFLehrauftraegeFH',
|
||||||
'PDFLehrauftraegeFH',
|
'PDFLehrauftraegeLehrgaenge'
|
||||||
'PDFLehrauftraegeLehrgaenge'
|
|
||||||
),
|
|
||||||
'ui' => array(
|
|
||||||
'anzeigen',
|
|
||||||
'alleAnzeigen',
|
|
||||||
'nurBestellteAnzeigen',
|
|
||||||
'nurErteilteAnzeigen',
|
|
||||||
'nurAngenommeneAnzeigen',
|
|
||||||
'nurStornierteAnzeigen',
|
|
||||||
'hilfeZuDieserSeite',
|
|
||||||
'alleAuswaehlen',
|
|
||||||
'alleAbwaehlen',
|
|
||||||
'ausgewaehlteZeilen',
|
|
||||||
'hilfe',
|
|
||||||
'tabelleneinstellungen',
|
|
||||||
'keineDatenVorhanden',
|
|
||||||
'spaltenEinstellen',
|
|
||||||
'bestelltVon',
|
|
||||||
'erteiltVon',
|
|
||||||
'angenommenVon',
|
|
||||||
'storniertVon',
|
|
||||||
'lehrauftragInBearbeitung',
|
|
||||||
'wartetAufErteilung',
|
|
||||||
'wartetAufErneuteErteilung',
|
|
||||||
'letzterStatusBestellt',
|
|
||||||
'letzterStatusErteilt',
|
|
||||||
'letzterStatusAngenommen',
|
|
||||||
'vertragWurdeStorniert',
|
|
||||||
),
|
|
||||||
'password' => array('password'),
|
|
||||||
'dms' => array('informationsblattExterneLehrende'),
|
|
||||||
'table' => array(
|
|
||||||
'spaltenEinAusblenden',
|
|
||||||
'spaltenEinAusblendenMitKlickOeffnen',
|
|
||||||
'spaltenEinAusblendenAufEinstellungenKlicken',
|
|
||||||
'spaltenEinAusblendenMitKlickAktivieren',
|
|
||||||
'spaltenEinAusblendenMitKlickSchliessen',
|
|
||||||
'spaltenbreiteVeraendern',
|
|
||||||
'spaltenbreiteVeraendernText',
|
|
||||||
'spaltenbreiteVeraendernInfotext',
|
|
||||||
'zeilenAuswaehlen',
|
|
||||||
'zeilenAuswaehlenEinzeln',
|
|
||||||
'zeilenAuswaehlenBereich',
|
|
||||||
'zeilenAuswaehlenAlle'
|
|
||||||
),
|
|
||||||
'lehre' => array(
|
|
||||||
'lehrauftraegeAnnehmen',
|
|
||||||
'lehrauftraegeAnnehmenText',
|
|
||||||
'lehrauftraegeAnnehmenKlickStatusicon',
|
|
||||||
'lehrauftraegeAnnehmenLehrauftraegeWaehlen',
|
|
||||||
'lehrauftraegeAnnehmenMitKlickAnnehmen',
|
|
||||||
'lehrauftraegeNichtAuswaehlbar',
|
|
||||||
'lehrauftraegeNichtAuswaehlbarTextBeiAnnahme',
|
|
||||||
'filterAlleBeiAnnahme',
|
|
||||||
'filterErteiltBeiAnnahme',
|
|
||||||
'filterAngenommen'
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
'customJSs' => array(
|
'ui' => array(
|
||||||
'public/js/bootstrapper.js',
|
'anzeigen',
|
||||||
'public/js/lehre/lehrauftrag/acceptLehrauftrag.js')
|
'alleAnzeigen',
|
||||||
|
'nurBestellteAnzeigen',
|
||||||
|
'nurErteilteAnzeigen',
|
||||||
|
'nurAngenommeneAnzeigen',
|
||||||
|
'nurStornierteAnzeigen',
|
||||||
|
'hilfeZuDieserSeite',
|
||||||
|
'alleAuswaehlen',
|
||||||
|
'alleAbwaehlen',
|
||||||
|
'ausgewaehlteZeilen',
|
||||||
|
'hilfe',
|
||||||
|
'tabelleneinstellungen',
|
||||||
|
'keineDatenVorhanden',
|
||||||
|
'spaltenEinstellen',
|
||||||
|
'bestelltVon',
|
||||||
|
'erteiltVon',
|
||||||
|
'angenommenVon',
|
||||||
|
'storniertVon',
|
||||||
|
'lehrauftragInBearbeitung',
|
||||||
|
'wartetAufErteilung',
|
||||||
|
'wartetAufErneuteErteilung',
|
||||||
|
'letzterStatusBestellt',
|
||||||
|
'letzterStatusErteilt',
|
||||||
|
'letzterStatusAngenommen',
|
||||||
|
'vertragWurdeStorniert',
|
||||||
|
),
|
||||||
|
'password' => array('password'),
|
||||||
|
'dms' => array('informationsblattExterneLehrende'),
|
||||||
|
'table' => array(
|
||||||
|
'spaltenEinAusblenden',
|
||||||
|
'spaltenEinAusblendenMitKlickOeffnen',
|
||||||
|
'spaltenEinAusblendenAufEinstellungenKlicken',
|
||||||
|
'spaltenEinAusblendenMitKlickAktivieren',
|
||||||
|
'spaltenEinAusblendenMitKlickSchliessen',
|
||||||
|
'spaltenbreiteVeraendern',
|
||||||
|
'spaltenbreiteVeraendernText',
|
||||||
|
'spaltenbreiteVeraendernInfotext',
|
||||||
|
'zeilenAuswaehlen',
|
||||||
|
'zeilenAuswaehlenEinzeln',
|
||||||
|
'zeilenAuswaehlenBereich',
|
||||||
|
'zeilenAuswaehlenAlle'
|
||||||
|
),
|
||||||
|
'lehre' => array(
|
||||||
|
'lehrauftraegeAnnehmen',
|
||||||
|
'lehrauftraegeAnnehmenText',
|
||||||
|
'lehrauftraegeAnnehmenKlickStatusicon',
|
||||||
|
'lehrauftraegeAnnehmenLehrauftraegeWaehlen',
|
||||||
|
'lehrauftraegeAnnehmenMitKlickAnnehmen',
|
||||||
|
'lehrauftraegeNichtAuswaehlbar',
|
||||||
|
'lehrauftraegeNichtAuswaehlbarTextBeiAnnahme',
|
||||||
|
'filterAlleBeiAnnahme',
|
||||||
|
'filterErteiltBeiAnnahme',
|
||||||
|
'filterAngenommen'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'customJSs' => array(
|
||||||
|
'public/js/bootstrapper.js',
|
||||||
|
'public/js/lehre/lehrauftrag/acceptLehrauftrag.js'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (defined("CIS4")) {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/CISVUE-Header',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Header',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|
||||||
@@ -230,5 +242,17 @@ $this->load->view(
|
|||||||
</div><!-- end page-wrapper -->
|
</div><!-- end page-wrapper -->
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
<?php
|
||||||
|
if (defined("CIS4")) {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/CISVUE-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
|||||||
@@ -232,8 +232,8 @@ FROM
|
|||||||
SELECT
|
SELECT
|
||||||
pa.lehreinheit_id,
|
pa.lehreinheit_id,
|
||||||
lv.lehrveranstaltung_id,
|
lv.lehrveranstaltung_id,
|
||||||
pa.projektarbeit_id::text AS "projektarbeit_id",
|
pa.projektarbeit_id::text AS "projektarbeit_id",
|
||||||
le.studiensemester_kurzbz,
|
pa.studiensemester_kurzbz,
|
||||||
stg.studiengang_kz,
|
stg.studiengang_kz,
|
||||||
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
|
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
|
||||||
lv.orgform_kurzbz,
|
lv.orgform_kurzbz,
|
||||||
@@ -268,8 +268,7 @@ FROM
|
|||||||
FROM
|
FROM
|
||||||
lehre.tbl_projektbetreuer pb
|
lehre.tbl_projektbetreuer pb
|
||||||
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung lv ON (pa.lehrveranstaltung_id = lv.lehrveranstaltung_id)
|
||||||
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
|
||||||
JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz)
|
JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz)
|
||||||
JOIN PUBLIC.tbl_person person USING (person_id)
|
JOIN PUBLIC.tbl_person person USING (person_id)
|
||||||
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
|
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
|
||||||
@@ -280,7 +279,7 @@ FROM
|
|||||||
/* filter projektbetreuuer */
|
/* filter projektbetreuuer */
|
||||||
pb.person_id = \'' . $PERSON_ID . '\'
|
pb.person_id = \'' . $PERSON_ID . '\'
|
||||||
/* filter studiensemester */
|
/* filter studiensemester */
|
||||||
AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
|
AND pa.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
|
||||||
/* filter active lehrveranstaltungen */
|
/* filter active lehrveranstaltungen */
|
||||||
AND lv.aktiv = TRUE
|
AND lv.aktiv = TRUE
|
||||||
/* filter active organisationseinheiten */
|
/* filter active organisationseinheiten */
|
||||||
|
|||||||
@@ -1,98 +1,101 @@
|
|||||||
<?php
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'title' => 'Lehrauftrag erteilen',
|
||||||
|
'jquery3' => true,
|
||||||
|
'jqueryui1' => true,
|
||||||
|
'jquerycheckboxes1' => true,
|
||||||
|
'bootstrap3' => true,
|
||||||
|
'fontawesome6' => true,
|
||||||
|
'sbadmintemplate3' => true,
|
||||||
|
'tabulator5' => true,
|
||||||
|
'tabulator5JQuery' => true,
|
||||||
|
'momentjs2' => true,
|
||||||
|
'ajaxlib' => true,
|
||||||
|
'dialoglib' => true,
|
||||||
|
'tablewidget' => true,
|
||||||
|
'navigationwidget' => true,
|
||||||
|
'phrases' => array(
|
||||||
|
'global' => array(
|
||||||
|
'lehrauftraegeErteilen',
|
||||||
|
'mehrHilfe',
|
||||||
|
'weitereInformationenUnter'
|
||||||
|
),
|
||||||
|
'ui' => array(
|
||||||
|
'anzeigen',
|
||||||
|
'alleAnzeigen',
|
||||||
|
'nurNeueAnzeigen',
|
||||||
|
'nurBestellteAnzeigen',
|
||||||
|
'nurErteilteAnzeigen',
|
||||||
|
'nurAngenommeneAnzeigen',
|
||||||
|
'nurGeaenderteAnzeigen',
|
||||||
|
'nurDummiesAnzeigen',
|
||||||
|
'hilfeZuDieserSeite',
|
||||||
|
'alleAuswaehlen',
|
||||||
|
'alleAbwaehlen',
|
||||||
|
'ausgewaehlteZeilen',
|
||||||
|
'hilfe',
|
||||||
|
'tabelleneinstellungen',
|
||||||
|
'keineDatenVorhanden',
|
||||||
|
'spaltenEinstellen',
|
||||||
|
'bestelltVon',
|
||||||
|
'erteiltVon',
|
||||||
|
'angenommenVon',
|
||||||
|
'stundenStundensatzGeaendert',
|
||||||
|
'neuerLehrauftragOhneLektorVerplant',
|
||||||
|
'wartetAufBestellung',
|
||||||
|
'wartetAufErneuteBestellung',
|
||||||
|
'neuerLehrauftragWartetAufBestellung',
|
||||||
|
'letzterStatusBestellt',
|
||||||
|
'letzterStatusErteilt',
|
||||||
|
'letzterStatusAngenommen',
|
||||||
|
),
|
||||||
|
'table' => array(
|
||||||
|
'spaltenEinAusblenden',
|
||||||
|
'spaltenEinAusblendenMitKlickOeffnen',
|
||||||
|
'spaltenEinAusblendenAufEinstellungenKlicken',
|
||||||
|
'spaltenEinAusblendenMitKlickAktivieren',
|
||||||
|
'spaltenEinAusblendenMitKlickSchliessen',
|
||||||
|
'spaltenbreiteVeraendern',
|
||||||
|
'spaltenbreiteVeraendernText',
|
||||||
|
'spaltenbreiteVeraendernInfotext',
|
||||||
|
'zeilenAuswaehlen',
|
||||||
|
'zeilenAuswaehlenEinzeln',
|
||||||
|
'zeilenAuswaehlenBereich',
|
||||||
|
'zeilenAuswaehlenAlle'
|
||||||
|
),
|
||||||
|
'lehre' => array(
|
||||||
|
'lehrauftragStandardBestellprozess',
|
||||||
|
'lehrauftragStandardBestellprozessBestellen',
|
||||||
|
'lehrauftragStandardBestellprozessErteilen',
|
||||||
|
'lehrauftragStandardBestellprozessAnnehmen',
|
||||||
|
'lehrauftraegeErteilen',
|
||||||
|
'lehrauftraegeErteilenText',
|
||||||
|
'lehrauftraegeErteilenKlickStatusicon',
|
||||||
|
'lehrauftraegeErteilenLehrauftraegeWaehlen',
|
||||||
|
'lehrauftraegeErteilenMitKlickErteilen',
|
||||||
|
'geaenderteLehrauftraege',
|
||||||
|
'geaenderteLehrauftraegeTextBeiErteilung',
|
||||||
|
'lehrauftraegeNichtAuswaehlbar',
|
||||||
|
'lehrauftraegeNichtAuswaehlbarTextBeiErteilung',
|
||||||
|
'filterAlle',
|
||||||
|
'filterNeu',
|
||||||
|
'filterBestellt',
|
||||||
|
'filterErteilt',
|
||||||
|
'filterAngenommen',
|
||||||
|
'filterGeaendert',
|
||||||
|
'filterDummies'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'customJSs' => array(
|
||||||
|
'public/js/bootstrapper.js',
|
||||||
|
'public/js/lehre/lehrauftrag/approveLehrauftrag.js'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
$this->load->view(
|
$this->load->view(
|
||||||
'templates/FHC-Header',
|
'templates/FHC-Header',
|
||||||
array(
|
$includesArray
|
||||||
'title' => 'Lehrauftrag erteilen',
|
|
||||||
'jquery3' => true,
|
|
||||||
'jqueryui1' => true,
|
|
||||||
'jquerycheckboxes1' => true,
|
|
||||||
'bootstrap3' => true,
|
|
||||||
'fontawesome6' => true,
|
|
||||||
'sbadmintemplate3' => true,
|
|
||||||
'tabulator5' => true,
|
|
||||||
'tabulator5JQuery' => true,
|
|
||||||
'momentjs2' => true,
|
|
||||||
'ajaxlib' => true,
|
|
||||||
'dialoglib' => true,
|
|
||||||
'tablewidget' => true,
|
|
||||||
'navigationwidget' => true,
|
|
||||||
'phrases' => array(
|
|
||||||
'global' => array(
|
|
||||||
'lehrauftraegeErteilen',
|
|
||||||
'mehrHilfe',
|
|
||||||
'weitereInformationenUnter'
|
|
||||||
),
|
|
||||||
'ui' => array(
|
|
||||||
'anzeigen',
|
|
||||||
'alleAnzeigen',
|
|
||||||
'nurNeueAnzeigen',
|
|
||||||
'nurBestellteAnzeigen',
|
|
||||||
'nurErteilteAnzeigen',
|
|
||||||
'nurAngenommeneAnzeigen',
|
|
||||||
'nurGeaenderteAnzeigen',
|
|
||||||
'nurDummiesAnzeigen',
|
|
||||||
'hilfeZuDieserSeite',
|
|
||||||
'alleAuswaehlen',
|
|
||||||
'alleAbwaehlen',
|
|
||||||
'ausgewaehlteZeilen',
|
|
||||||
'hilfe',
|
|
||||||
'tabelleneinstellungen',
|
|
||||||
'keineDatenVorhanden',
|
|
||||||
'spaltenEinstellen',
|
|
||||||
'bestelltVon',
|
|
||||||
'erteiltVon',
|
|
||||||
'angenommenVon',
|
|
||||||
'stundenStundensatzGeaendert',
|
|
||||||
'neuerLehrauftragOhneLektorVerplant',
|
|
||||||
'wartetAufBestellung',
|
|
||||||
'wartetAufErneuteBestellung',
|
|
||||||
'neuerLehrauftragWartetAufBestellung',
|
|
||||||
'letzterStatusBestellt',
|
|
||||||
'letzterStatusErteilt',
|
|
||||||
'letzterStatusAngenommen',
|
|
||||||
),
|
|
||||||
'table' => array(
|
|
||||||
'spaltenEinAusblenden',
|
|
||||||
'spaltenEinAusblendenMitKlickOeffnen',
|
|
||||||
'spaltenEinAusblendenAufEinstellungenKlicken',
|
|
||||||
'spaltenEinAusblendenMitKlickAktivieren',
|
|
||||||
'spaltenEinAusblendenMitKlickSchliessen',
|
|
||||||
'spaltenbreiteVeraendern',
|
|
||||||
'spaltenbreiteVeraendernText',
|
|
||||||
'spaltenbreiteVeraendernInfotext',
|
|
||||||
'zeilenAuswaehlen',
|
|
||||||
'zeilenAuswaehlenEinzeln',
|
|
||||||
'zeilenAuswaehlenBereich',
|
|
||||||
'zeilenAuswaehlenAlle'
|
|
||||||
),
|
|
||||||
'lehre' => array(
|
|
||||||
'lehrauftragStandardBestellprozess',
|
|
||||||
'lehrauftragStandardBestellprozessBestellen',
|
|
||||||
'lehrauftragStandardBestellprozessErteilen',
|
|
||||||
'lehrauftragStandardBestellprozessAnnehmen',
|
|
||||||
'lehrauftraegeErteilen',
|
|
||||||
'lehrauftraegeErteilenText',
|
|
||||||
'lehrauftraegeErteilenKlickStatusicon',
|
|
||||||
'lehrauftraegeErteilenLehrauftraegeWaehlen',
|
|
||||||
'lehrauftraegeErteilenMitKlickErteilen',
|
|
||||||
'geaenderteLehrauftraege',
|
|
||||||
'geaenderteLehrauftraegeTextBeiErteilung',
|
|
||||||
'lehrauftraegeNichtAuswaehlbar',
|
|
||||||
'lehrauftraegeNichtAuswaehlbarTextBeiErteilung',
|
|
||||||
'filterAlle',
|
|
||||||
'filterNeu',
|
|
||||||
'filterBestellt',
|
|
||||||
'filterErteilt',
|
|
||||||
'filterAngenommen',
|
|
||||||
'filterGeaendert',
|
|
||||||
'filterDummies'
|
|
||||||
)
|
|
||||||
),
|
|
||||||
'customJSs' => array(
|
|
||||||
'public/js/bootstrapper.js',
|
|
||||||
'public/js/lehre/lehrauftrag/approveLehrauftrag.js'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@@ -208,5 +211,13 @@ $this->load->view(
|
|||||||
</div><!-- end page-wrapper -->
|
</div><!-- end page-wrapper -->
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
|||||||
@@ -242,8 +242,8 @@ FROM
|
|||||||
pa.lehreinheit_id,
|
pa.lehreinheit_id,
|
||||||
lv.lehrveranstaltung_id,
|
lv.lehrveranstaltung_id,
|
||||||
lv.bezeichnung AS "lv_bezeichnung",
|
lv.bezeichnung AS "lv_bezeichnung",
|
||||||
(pa.projektarbeit_id::text) AS "projektarbeit_id",
|
(pa.projektarbeit_id::text) AS "projektarbeit_id",
|
||||||
le.studiensemester_kurzbz,
|
pa.studiensemester_kurzbz,
|
||||||
stg.studiengang_kz,
|
stg.studiengang_kz,
|
||||||
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
|
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
|
||||||
lv.orgform_kurzbz,
|
lv.orgform_kurzbz,
|
||||||
@@ -270,7 +270,7 @@ FROM
|
|||||||
ELSE (oe.organisationseinheittyp_kurzbz ||
|
ELSE (oe.organisationseinheittyp_kurzbz ||
|
||||||
\' \' || oe.bezeichnung)
|
\' \' || oe.bezeichnung)
|
||||||
END AS "lv_oe_kurzbz",
|
END AS "lv_oe_kurzbz",
|
||||||
(nachname || \' \' || vorname) AS "lektor",
|
(nachname || \' \' || vorname) AS "lektor",
|
||||||
TRUNC(pb.stunden, 1) AS "stunden",
|
TRUNC(pb.stunden, 1) AS "stunden",
|
||||||
pb.stundensatz,
|
pb.stundensatz,
|
||||||
TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag",
|
TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag",
|
||||||
@@ -280,8 +280,7 @@ FROM
|
|||||||
FROM
|
FROM
|
||||||
lehre.tbl_projektbetreuer pb
|
lehre.tbl_projektbetreuer pb
|
||||||
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung lv ON (pa.lehrveranstaltung_id = lv.lehrveranstaltung_id)
|
||||||
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
|
||||||
JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz)
|
JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz)
|
||||||
JOIN PUBLIC.tbl_person person USING (person_id)
|
JOIN PUBLIC.tbl_person person USING (person_id)
|
||||||
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
|
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
|
||||||
@@ -291,7 +290,7 @@ FROM
|
|||||||
/* filter organisationseinheit */
|
/* filter organisationseinheit */
|
||||||
lv.oe_kurzbz IN (\'' . implode('\',\'', $ORGANISATIONSEINHEIT) . '\')
|
lv.oe_kurzbz IN (\'' . implode('\',\'', $ORGANISATIONSEINHEIT) . '\')
|
||||||
/* filter studiensemester */
|
/* filter studiensemester */
|
||||||
AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
|
AND pa.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
|
||||||
/* filter active lehrveranstaltungen */
|
/* filter active lehrveranstaltungen */
|
||||||
AND lv.aktiv = TRUE
|
AND lv.aktiv = TRUE
|
||||||
/* filter active organisationseinheiten */
|
/* filter active organisationseinheiten */
|
||||||
|
|||||||
@@ -1,98 +1,101 @@
|
|||||||
<?php
|
<?php
|
||||||
|
$includesArray = array(
|
||||||
|
'title' => 'Lehrauftrag bestellen',
|
||||||
|
'jquery3' => true,
|
||||||
|
'jqueryui1' => true,
|
||||||
|
'jquerycheckboxes1' => true,
|
||||||
|
'bootstrap3' => true,
|
||||||
|
'fontawesome6' => true,
|
||||||
|
'sbadmintemplate3' => true,
|
||||||
|
'tabulator5' => true,
|
||||||
|
'tabulator5JQuery' => true,
|
||||||
|
'momentjs2' => true,
|
||||||
|
'ajaxlib' => true,
|
||||||
|
'dialoglib' => true,
|
||||||
|
'tablewidget' => true,
|
||||||
|
'navigationwidget' => true,
|
||||||
|
'phrases' => array(
|
||||||
|
'global' => array(
|
||||||
|
'lehrauftraegeBestellen',
|
||||||
|
'mehrHilfe',
|
||||||
|
'weitereInformationenUnter'
|
||||||
|
),
|
||||||
|
'ui' => array(
|
||||||
|
'anzeigen',
|
||||||
|
'alleAnzeigen',
|
||||||
|
'nurNeueAnzeigen',
|
||||||
|
'nurBestellteAnzeigen',
|
||||||
|
'nurErteilteAnzeigen',
|
||||||
|
'nurAngenommeneAnzeigen',
|
||||||
|
'nurGeaenderteAnzeigen',
|
||||||
|
'nurDummiesAnzeigen',
|
||||||
|
'hilfeZuDieserSeite',
|
||||||
|
'alleAuswaehlen',
|
||||||
|
'alleAbwaehlen',
|
||||||
|
'ausgewaehlteZeilen',
|
||||||
|
'hilfe',
|
||||||
|
'tabelleneinstellungen',
|
||||||
|
'keineDatenVorhanden',
|
||||||
|
'spaltenEinstellen',
|
||||||
|
'bestelltVon',
|
||||||
|
'erteiltVon',
|
||||||
|
'angenommenVon',
|
||||||
|
'neuerLehrauftragOhneLektorVerplant',
|
||||||
|
'neuerLehrauftragWartetAufBestellung',
|
||||||
|
'letzterStatusBestellt',
|
||||||
|
'letzterStatusErteilt',
|
||||||
|
'letzterStatusAngenommen',
|
||||||
|
'nachAenderungStundensatzStunden',
|
||||||
|
'vorAenderungStundensatzStunden'
|
||||||
|
),
|
||||||
|
'table' => array(
|
||||||
|
'spaltenEinAusblenden',
|
||||||
|
'spaltenEinAusblendenMitKlickOeffnen',
|
||||||
|
'spaltenEinAusblendenAufEinstellungenKlicken',
|
||||||
|
'spaltenEinAusblendenMitKlickAktivieren',
|
||||||
|
'spaltenEinAusblendenMitKlickSchliessen',
|
||||||
|
'spaltenbreiteVeraendern',
|
||||||
|
'spaltenbreiteVeraendernText',
|
||||||
|
'spaltenbreiteVeraendernInfotext',
|
||||||
|
'zeilenAuswaehlen',
|
||||||
|
'zeilenAuswaehlenEinzeln',
|
||||||
|
'zeilenAuswaehlenBereich',
|
||||||
|
'zeilenAuswaehlenAlle'
|
||||||
|
),
|
||||||
|
'lehre' => array(
|
||||||
|
'lehrauftragStandardBestellprozess',
|
||||||
|
'lehrauftragStandardBestellprozessBestellen',
|
||||||
|
'lehrauftragStandardBestellprozessErteilen',
|
||||||
|
'lehrauftragStandardBestellprozessAnnehmen',
|
||||||
|
'lehrauftraegeBestellen',
|
||||||
|
'lehrauftraegeBestellenText',
|
||||||
|
'lehrauftraegeBestellenKlickStatusicon',
|
||||||
|
'lehrauftraegeBestellenLehrauftraegeWaehlen',
|
||||||
|
'lehrauftraegeBestellenMitKlickBestellen',
|
||||||
|
'lehrauftraegeBestellenVertragWirdAngelegt',
|
||||||
|
'geaenderteLehrauftraege',
|
||||||
|
'geaenderteLehrauftraegeText',
|
||||||
|
'lehrauftraegeNichtAuswaehlbar',
|
||||||
|
'lehrauftraegeNichtAuswaehlbarText',
|
||||||
|
'filterAlle',
|
||||||
|
'filterNeu',
|
||||||
|
'filterBestellt',
|
||||||
|
'filterErteilt',
|
||||||
|
'filterAngenommen',
|
||||||
|
'filterGeaendert',
|
||||||
|
'filterDummies'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'customJSs' => array(
|
||||||
|
'public/js/bootstrapper.js',
|
||||||
|
'public/js/lehre/lehrauftrag/orderLehrauftrag.js'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
$this->load->view(
|
$this->load->view(
|
||||||
'templates/FHC-Header',
|
'templates/FHC-Header',
|
||||||
array(
|
$includesArray
|
||||||
'title' => 'Lehrauftrag bestellen',
|
|
||||||
'jquery3' => true,
|
|
||||||
'jqueryui1' => true,
|
|
||||||
'jquerycheckboxes1' => true,
|
|
||||||
'bootstrap3' => true,
|
|
||||||
'fontawesome6' => true,
|
|
||||||
'sbadmintemplate3' => true,
|
|
||||||
'tabulator5' => true,
|
|
||||||
'tabulator5JQuery' => true,
|
|
||||||
'momentjs2' => true,
|
|
||||||
'ajaxlib' => true,
|
|
||||||
'dialoglib' => true,
|
|
||||||
'tablewidget' => true,
|
|
||||||
'navigationwidget' => true,
|
|
||||||
'phrases' => array(
|
|
||||||
'global' => array(
|
|
||||||
'lehrauftraegeBestellen',
|
|
||||||
'mehrHilfe',
|
|
||||||
'weitereInformationenUnter'
|
|
||||||
),
|
|
||||||
'ui' => array(
|
|
||||||
'anzeigen',
|
|
||||||
'alleAnzeigen',
|
|
||||||
'nurNeueAnzeigen',
|
|
||||||
'nurBestellteAnzeigen',
|
|
||||||
'nurErteilteAnzeigen',
|
|
||||||
'nurAngenommeneAnzeigen',
|
|
||||||
'nurGeaenderteAnzeigen',
|
|
||||||
'nurDummiesAnzeigen',
|
|
||||||
'hilfeZuDieserSeite',
|
|
||||||
'alleAuswaehlen',
|
|
||||||
'alleAbwaehlen',
|
|
||||||
'ausgewaehlteZeilen',
|
|
||||||
'hilfe',
|
|
||||||
'tabelleneinstellungen',
|
|
||||||
'keineDatenVorhanden',
|
|
||||||
'spaltenEinstellen',
|
|
||||||
'bestelltVon',
|
|
||||||
'erteiltVon',
|
|
||||||
'angenommenVon',
|
|
||||||
'neuerLehrauftragOhneLektorVerplant',
|
|
||||||
'neuerLehrauftragWartetAufBestellung',
|
|
||||||
'letzterStatusBestellt',
|
|
||||||
'letzterStatusErteilt',
|
|
||||||
'letzterStatusAngenommen',
|
|
||||||
'nachAenderungStundensatzStunden',
|
|
||||||
'vorAenderungStundensatzStunden'
|
|
||||||
),
|
|
||||||
'table' => array(
|
|
||||||
'spaltenEinAusblenden',
|
|
||||||
'spaltenEinAusblendenMitKlickOeffnen',
|
|
||||||
'spaltenEinAusblendenAufEinstellungenKlicken',
|
|
||||||
'spaltenEinAusblendenMitKlickAktivieren',
|
|
||||||
'spaltenEinAusblendenMitKlickSchliessen',
|
|
||||||
'spaltenbreiteVeraendern',
|
|
||||||
'spaltenbreiteVeraendernText',
|
|
||||||
'spaltenbreiteVeraendernInfotext',
|
|
||||||
'zeilenAuswaehlen',
|
|
||||||
'zeilenAuswaehlenEinzeln',
|
|
||||||
'zeilenAuswaehlenBereich',
|
|
||||||
'zeilenAuswaehlenAlle'
|
|
||||||
),
|
|
||||||
'lehre' => array(
|
|
||||||
'lehrauftragStandardBestellprozess',
|
|
||||||
'lehrauftragStandardBestellprozessBestellen',
|
|
||||||
'lehrauftragStandardBestellprozessErteilen',
|
|
||||||
'lehrauftragStandardBestellprozessAnnehmen',
|
|
||||||
'lehrauftraegeBestellen',
|
|
||||||
'lehrauftraegeBestellenText',
|
|
||||||
'lehrauftraegeBestellenKlickStatusicon',
|
|
||||||
'lehrauftraegeBestellenLehrauftraegeWaehlen',
|
|
||||||
'lehrauftraegeBestellenMitKlickBestellen',
|
|
||||||
'lehrauftraegeBestellenVertragWirdAngelegt',
|
|
||||||
'geaenderteLehrauftraege',
|
|
||||||
'geaenderteLehrauftraegeText',
|
|
||||||
'lehrauftraegeNichtAuswaehlbar',
|
|
||||||
'lehrauftraegeNichtAuswaehlbarText',
|
|
||||||
'filterAlle',
|
|
||||||
'filterNeu',
|
|
||||||
'filterBestellt',
|
|
||||||
'filterErteilt',
|
|
||||||
'filterAngenommen',
|
|
||||||
'filterGeaendert',
|
|
||||||
'filterDummies'
|
|
||||||
)
|
|
||||||
),
|
|
||||||
'customJSs' => array(
|
|
||||||
'public/js/bootstrapper.js',
|
|
||||||
'public/js/lehre/lehrauftrag/orderLehrauftrag.js'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@@ -209,5 +212,11 @@ $this->load->view(
|
|||||||
</div><!-- end page-wrapper -->
|
</div><!-- end page-wrapper -->
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
<?php
|
||||||
|
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
|
||||||
|
|||||||
@@ -272,8 +272,8 @@ FROM
|
|||||||
pa.lehreinheit_id,
|
pa.lehreinheit_id,
|
||||||
lv.lehrveranstaltung_id,
|
lv.lehrveranstaltung_id,
|
||||||
lv.bezeichnung AS "lv_bezeichnung",
|
lv.bezeichnung AS "lv_bezeichnung",
|
||||||
pa.projektarbeit_id::text AS "projektarbeit_id",
|
pa.projektarbeit_id::text AS "projektarbeit_id",
|
||||||
le.studiensemester_kurzbz,
|
pa.studiensemester_kurzbz,
|
||||||
stg.studiengang_kz,
|
stg.studiengang_kz,
|
||||||
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
|
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
|
||||||
lv.orgform_kurzbz,
|
lv.orgform_kurzbz,
|
||||||
@@ -310,8 +310,7 @@ FROM
|
|||||||
FROM
|
FROM
|
||||||
lehre.tbl_projektbetreuer pb
|
lehre.tbl_projektbetreuer pb
|
||||||
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
|
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
|
||||||
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung lv ON (pa.lehrveranstaltung_id = lv.lehrveranstaltung_id)
|
||||||
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
|
||||||
JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz)
|
JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz)
|
||||||
JOIN PUBLIC.tbl_person person USING (person_id)
|
JOIN PUBLIC.tbl_person person USING (person_id)
|
||||||
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
|
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
|
||||||
@@ -321,7 +320,7 @@ FROM
|
|||||||
/* filter studiengang */
|
/* filter studiengang */
|
||||||
lv.studiengang_kz IN ('. implode(',', $STUDIENGANG) . ')
|
lv.studiengang_kz IN ('. implode(',', $STUDIENGANG) . ')
|
||||||
/* filter studiensemester */
|
/* filter studiensemester */
|
||||||
AND le.studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\'
|
AND pa.studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\'
|
||||||
/* filter active lehrveranstaltungen */
|
/* filter active lehrveranstaltungen */
|
||||||
AND lv.aktiv = TRUE
|
AND lv.aktiv = TRUE
|
||||||
/* filter ausbildungssemester */
|
/* filter ausbildungssemester */
|
||||||
|
|||||||
@@ -9,22 +9,8 @@ $sitesettings = array(
|
|||||||
'ajaxlib' => true,
|
'ajaxlib' => true,
|
||||||
'sbadmintemplate3' => true,
|
'sbadmintemplate3' => true,
|
||||||
'phrases' => array(
|
'phrases' => array(
|
||||||
'abschlusspruefung' => array(
|
'abschlusspruefung',
|
||||||
'freigegebenAm',
|
'ui'
|
||||||
'pruefungGespeichert',
|
|
||||||
'pruefungSpeichernFehler',
|
|
||||||
'abschlussbeurteilungLeer',
|
|
||||||
'beginnzeitLeer',
|
|
||||||
'beginnzeitFormatError',
|
|
||||||
'endezeitLeer',
|
|
||||||
'endezeitFormatError',
|
|
||||||
'endezeitBeforeError',
|
|
||||||
'verfNotice'
|
|
||||||
),
|
|
||||||
'ui' => array(
|
|
||||||
'stunde',
|
|
||||||
'minute'
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
'customCSSs' => array(
|
'customCSSs' => array(
|
||||||
'public/css/sbadmin2/admintemplate_contentonly.css',
|
'public/css/sbadmin2/admintemplate_contentonly.css',
|
||||||
@@ -37,10 +23,18 @@ $sitesettings = array(
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->load->view(
|
if(defined('CIS4')){
|
||||||
'templates/FHC-Header',
|
$this->load->view(
|
||||||
$sitesettings
|
'templates/CISVUE-Header',
|
||||||
);
|
$sitesettings
|
||||||
|
);
|
||||||
|
}else{
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Header',
|
||||||
|
$sitesettings
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<div id="wrapper">
|
<div id="wrapper">
|
||||||
<div id="page-wrapper">
|
<div id="page-wrapper">
|
||||||
@@ -161,6 +155,14 @@ $this->load->view(
|
|||||||
<?php echo ($abschlusspruefung->studiengangstyp == 'Bachelor' ? $this->p->t('abschlusspruefung', 'pruefungsgegenstandBachelor') : $this->p->t('abschlusspruefung', 'pruefungsgegenstandMaster')) ?>
|
<?php echo ($abschlusspruefung->studiengangstyp == 'Bachelor' ? $this->p->t('abschlusspruefung', 'pruefungsgegenstandBachelor') : $this->p->t('abschlusspruefung', 'pruefungsgegenstandMaster')) ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<?php echo $this->p->t('abschlusspruefung', 'spracheDerArbeit') ?> <?php echo $arbeit_name ?>
|
||||||
|
</td>
|
||||||
|
<td colspan="5">
|
||||||
|
<?php echo $abschlusspruefung->abschlussarbeit_sprache ?? '' ?>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="6">
|
<td colspan="6">
|
||||||
<?php echo ucfirst($this->p->t('global', 'notizen')); ?>
|
<?php echo ucfirst($this->p->t('global', 'notizen')); ?>
|
||||||
@@ -201,7 +203,9 @@ $this->load->view(
|
|||||||
<div class="col-lg-12 text-right">
|
<div class="col-lg-12 text-right">
|
||||||
<p>
|
<p>
|
||||||
<?php $freigegeben = isset($abschlusspruefung->freigabedatum); ?>
|
<?php $freigegeben = isset($abschlusspruefung->freigabedatum); ?>
|
||||||
<button id="saveProtocolBtn" class="btn btn-default"<?php echo $freigegeben ? " disabled" : "" ?>><?php echo $this->p->t('ui', 'speichern') ?></button>
|
<button id="saveProtocolBtn" class="btn btn-default"<?php echo $freigegeben ? ' disabled title="'.$this->p->t('abschlusspruefung', 'bereitsFreigegeben').'"' : '' ?>>
|
||||||
|
<?php echo $this->p->t('ui', 'speichern') ?>
|
||||||
|
</button>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -236,7 +240,14 @@ $this->load->view(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
$this->load->view(
|
if (defined('CIS4')) {
|
||||||
'templates/FHC-Footer',
|
$this->load->view(
|
||||||
$sitesettings
|
'templates/CISVUE-Footer',
|
||||||
);
|
$sitesettings
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$sitesettings
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,33 +1,45 @@
|
|||||||
<?php
|
<?php
|
||||||
$this->load->view(
|
$includesArray = array(
|
||||||
'templates/FHC-Header',
|
'title' => 'Prüfungsprotokoll',
|
||||||
array(
|
'jquery3' => true,
|
||||||
'title' => 'Prüfungsprotokoll',
|
'jqueryui1' => true,
|
||||||
'jquery3' => true,
|
'jquerycheckboxes1' => true,
|
||||||
'jqueryui1' => true,
|
'bootstrap3' => true,
|
||||||
'jquerycheckboxes1' => true,
|
'fontawesome4' => true,
|
||||||
'bootstrap3' => true,
|
'tablesorter2' => true,
|
||||||
'fontawesome4' => true,
|
'tabulator5' => true,
|
||||||
'tablesorter2' => true,
|
'tabulator5JQuery' => true,
|
||||||
'tabulator5' => true,
|
'cis'=>true,
|
||||||
'tabulator5JQuery' => true,
|
'ajaxlib' => true,
|
||||||
'cis'=>true,
|
'dialoglib' => true,
|
||||||
'ajaxlib' => true,
|
'tablewidget' => true,
|
||||||
'dialoglib' => true,
|
'phrases' => array(
|
||||||
'tablewidget' => true,
|
'ui' => array(
|
||||||
'phrases' => array(
|
'keineDatenVorhanden',
|
||||||
'ui' => array(
|
'heute',
|
||||||
'keineDatenVorhanden',
|
'letzteWoche',
|
||||||
'heute',
|
'alle',
|
||||||
'letzteWoche',
|
'zeitraum'
|
||||||
'alle',
|
)
|
||||||
'zeitraum'
|
),
|
||||||
)
|
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css'),
|
||||||
),
|
'customJSs' => array('public/js/bootstrapper.js')
|
||||||
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css'),
|
|
||||||
'customJSs' => array('public/js/bootstrapper.js')
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if(defined("CIS4") && CIS4)
|
||||||
|
{
|
||||||
|
$this->load->view(
|
||||||
|
'templates/CISVUE-Header',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Header',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="page-wrapper">
|
<div id="page-wrapper">
|
||||||
@@ -66,4 +78,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
<?php
|
||||||
|
if (defined("CIS4") && CIS4) {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/CISVUE-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->load->view(
|
||||||
|
'templates/FHC-Footer',
|
||||||
|
$includesArray
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
$LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\'';
|
$LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\'';
|
||||||
$REJECTED_STATUS = '\'Abgewiesener\'';
|
$REJECTED_STATUS = '\'Abgewiesener\'';
|
||||||
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
|
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
|
||||||
|
$QUALIFIKATIONSKURS = $this->config->item('infocenter_qualifikationskurs_kz');
|
||||||
$STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\'';
|
$STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\'';
|
||||||
$STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\'';
|
$STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\'';
|
||||||
$ORG_NAME = '\'InfoCenter\'';
|
$ORG_NAME = '\'InfoCenter\'';
|
||||||
@@ -277,7 +278,26 @@ $query = '
|
|||||||
WHERE konto.person_id = p.person_id
|
WHERE konto.person_id = p.person_id
|
||||||
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
|
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
|
||||||
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
|
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
|
||||||
) AS "Kaution"
|
) AS "Kaution",
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM public.tbl_prestudentstatus pss
|
||||||
|
JOIN public.tbl_prestudent ps USING(prestudent_id)
|
||||||
|
JOIN public.tbl_studiengang sg USING(studiengang_kz)
|
||||||
|
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
|
||||||
|
JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
|
||||||
|
WHERE pss.status_kurzbz = '.$INTERESSENT_STATUS.'
|
||||||
|
AND pss.bewerbung_abgeschicktamum IS NOT NULL
|
||||||
|
AND ps.person_id = p.person_id
|
||||||
|
AND sg.studiengang_kz in('.$QUALIFIKATIONSKURS.')
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM tbl_prestudentstatus spss
|
||||||
|
WHERE spss.prestudent_id = ps.prestudent_id
|
||||||
|
AND spss.status_kurzbz = '.$REJECTED_STATUS.'
|
||||||
|
)
|
||||||
|
LIMIT 1
|
||||||
|
) AS "Qualikurs"
|
||||||
FROM public.tbl_person p
|
FROM public.tbl_person p
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT tpl.person_id,
|
SELECT tpl.person_id,
|
||||||
@@ -351,7 +371,8 @@ $query = '
|
|||||||
'ZGV Nation MA',
|
'ZGV Nation MA',
|
||||||
'InfoCenter Mitarbeiter',
|
'InfoCenter Mitarbeiter',
|
||||||
'Identitätsnachweis',
|
'Identitätsnachweis',
|
||||||
ucfirst($this->p->t('infocenter', 'kaution'))
|
ucfirst($this->p->t('infocenter', 'kaution')),
|
||||||
|
'Qualikurs'
|
||||||
),
|
),
|
||||||
'formatRow' => function($datasetRaw) {
|
'formatRow' => function($datasetRaw) {
|
||||||
|
|
||||||
@@ -480,6 +501,14 @@ $query = '
|
|||||||
$datasetRaw->{'Kaution'} = 'Offen';
|
$datasetRaw->{'Kaution'} = 'Offen';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($datasetRaw->{'Qualikurs'} === null)
|
||||||
|
{
|
||||||
|
$datasetRaw->{'Qualikurs'} = 'Nein';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$datasetRaw->{'Qualikurs'} = 'Ja';
|
||||||
|
}
|
||||||
return $datasetRaw;
|
return $datasetRaw;
|
||||||
},
|
},
|
||||||
'markRow' => function($datasetRaw) {
|
'markRow' => function($datasetRaw) {
|
||||||
|
|||||||
@@ -92,6 +92,14 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 table-responsive">
|
<div class="col-lg-6 table-responsive">
|
||||||
|
<?php if ($onboarding_first_login): ?>
|
||||||
|
<div class="row" id="onboardingRow">
|
||||||
|
<?php if ($created_by_onboarding): ?>
|
||||||
|
<div class="col-xs-5"><strong><?php echo $this->p->t('infocenter','onboardingRegistriert') ?></strong></div>
|
||||||
|
<?php endif; ?>
|
||||||
|
<div class="col-xs-7<?php echo $created_by_onboarding ? ' text-right' : '' ?>"><strong><?php echo $this->p->t('infocenter','ersterOnboardingLogin').': '.date_format(date_create($onboarding_first_login), 'd.m.Y') ?></strong></div>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
<table class="table table-bordered stammdaten_form">
|
<table class="table table-bordered stammdaten_form">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -191,12 +199,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div class="col-xs-6">
|
<div class="col-xs-6">
|
||||||
<a class="editStammdaten">
|
<a class="editStammdaten" href="javascript:void(0);">
|
||||||
<i class="fa fa-edit"></i> <?php echo $this->p->t('ui','bearbeiten'); ?></a>
|
<i class="fa fa-edit"></i> <?php echo $this->p->t('ui','bearbeiten'); ?></a>
|
||||||
<div class="editActionStammdaten" style="display:none">
|
<div class="editActionStammdaten" style="display:none">
|
||||||
<a class="cancelStammdaten">
|
<a class="cancelStammdaten" href="javascript:void(0);">
|
||||||
<i class="fa fa-trash"></i> <?php echo $this->p->t('ui','abbrechen');?></a>
|
<i class="fa fa-trash"></i> <?php echo $this->p->t('ui','abbrechen');?></a>
|
||||||
<a class="saveStammdaten">
|
<a class="saveStammdaten" href="javascript:void(0);">
|
||||||
<i class="fa fa-save"></i> <?php echo $this->p->t('ui','speichern'); ?></a>
|
<i class="fa fa-save"></i> <?php echo $this->p->t('ui','speichern'); ?></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ $includesArray = array(
|
|||||||
'bootstrap5' => true,
|
'bootstrap5' => true,
|
||||||
'fontawesome6' => true,
|
'fontawesome6' => true,
|
||||||
'axios027' => true,
|
'axios027' => true,
|
||||||
|
'primevue3' => true,
|
||||||
|
'vuedatepicker11' => true,
|
||||||
|
'customJSs' => array_merge([
|
||||||
|
'vendor/moment/luxonjs/luxon.min.js'
|
||||||
|
], $customJSs ?? []),
|
||||||
'customJSModules' => array_merge([
|
'customJSModules' => array_merge([
|
||||||
'public/js/apps/Cis/Menu.js'
|
'public/js/apps/Cis/Menu.js'
|
||||||
], $customJSModules ?? []),
|
], $customJSModules ?? []),
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ $includesArray = array(
|
|||||||
'fontawesome6' => true,
|
'fontawesome6' => true,
|
||||||
'axios027' => true,
|
'axios027' => true,
|
||||||
'primevue3' => true,
|
'primevue3' => true,
|
||||||
|
'vuedatepicker11' => true,
|
||||||
|
'printCssPath' => 'public/css/Cis4/print.css',
|
||||||
|
'customJSs' => array_merge([
|
||||||
|
'vendor/moment/luxonjs/luxon.min.js'
|
||||||
|
], $customJSs ?? []),
|
||||||
'customJSModules' => array_merge([
|
'customJSModules' => array_merge([
|
||||||
'public/js/apps/Cis/Menu.js'
|
'public/js/apps/Cis/Menu.js'
|
||||||
], $customJSModules ?? []),
|
], $customJSModules ?? []),
|
||||||
@@ -21,19 +26,24 @@ $this->load->view('templates/FHC-Header', $includesArray);
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
document.body.classList.add("cis4");
|
||||||
if (window.self !== window.top)
|
if (window.self !== window.top)
|
||||||
document.body.classList.add("in-frame");
|
document.body.classList.add("in-frame");
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<header id="cis-header" class="navbar-dark">
|
<!-- used by cis4 native pages, teleported menu needs data attributes-->
|
||||||
<cis-menu
|
<header id="cis-header" class="navbar-dark"
|
||||||
root-url="<?= site_url(''); ?>"
|
data-root-url="<?= site_url(''); ?>"
|
||||||
logo-url="<?= base_url($this->config->item('theme_logo')); ?>"
|
data-logo-url="<?= base_url($this->config->item('theme_logo')); ?>"
|
||||||
avatar-url="<?= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
|
data-avatar-url="<?= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
|
||||||
|
data-logout-url="<?= site_url('Cis/Auth/logout'); ?>">
|
||||||
|
<!-- used by legacy cis pages & content pages which use component props -->
|
||||||
|
<cis-menu
|
||||||
|
root-url="<?= site_url(''); ?>"
|
||||||
|
logo-url="<?= base_url($this->config->item('theme_logo')); ?>"
|
||||||
|
avatar-url="<?= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
|
||||||
logout-url="<?= site_url('Cis/Auth/logout'); ?>"
|
logout-url="<?= site_url('Cis/Auth/logout'); ?>"
|
||||||
:searchbaroptions="searchbaroptions"
|
|
||||||
:searchfunction="searchfunction"
|
|
||||||
></cis-menu>
|
></cis-menu>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main id="cis-main" class="flex-grow-1 p-4 pt-2" style="min-width: 0;">
|
<main id="cis-main" class="flex-grow-1 p-4 pt-2" style="min-width: 0;">
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
$customJSs = isset($customJSs) ? $customJSs : null;
|
$customJSs = isset($customJSs) ? $customJSs : null;
|
||||||
$customJSModules = isset($customJSModules) ? $customJSModules : null;
|
$customJSModules = isset($customJSModules) ? $customJSModules : null;
|
||||||
$skipID = isset($skipID) ? $skipID : null;
|
$skipID = isset($skipID) ? $skipID : null;
|
||||||
|
$printCssPath = isset($printCssPath) ? $printCssPath : null;
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!-- Header start -->
|
<!-- Header start -->
|
||||||
|
|
||||||
@@ -138,6 +140,9 @@
|
|||||||
generateCSSsIncludeIfExtensionCssExists('tags.css');
|
generateCSSsIncludeIfExtensionCssExists('tags.css');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Print CSS
|
||||||
|
if ($printCssPath) generatePrintCSS($printCssPath);
|
||||||
|
|
||||||
$extapphelper = ExtendableAppsHelper::getInstance();
|
$extapphelper = ExtendableAppsHelper::getInstance();
|
||||||
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
|
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="navbar-default sidebar" role="navigation">
|
<div class="navbar-default sidebar top-0" role="navigation">
|
||||||
<div class="sidebar-nav navbar-collapse">
|
<div class="sidebar-nav navbar-collapse">
|
||||||
<ul class="nav" id="side-menu"></ul>
|
<ul class="nav" id="side-menu"></ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1824,7 +1824,7 @@ $htmlstring .= "
|
|||||||
|
|
||||||
</table>
|
</table>
|
||||||
";
|
";
|
||||||
if ($anzahlChanged > 0)
|
if (isset($anzahlChanged) && $anzahlChanged > 0)
|
||||||
echo '<div id="notenWarning" class="warning">' . $p->t('benotungstool/geaenderteNotenVorhanden') . '</div>';
|
echo '<div id="notenWarning" class="warning">' . $p->t('benotungstool/geaenderteNotenVorhanden') . '</div>';
|
||||||
|
|
||||||
echo $htmlstring;
|
echo $htmlstring;
|
||||||
|
|||||||
@@ -159,6 +159,39 @@ if (!$berechtigung->isBerechtigt('admin')
|
|||||||
// let's merge
|
// let's merge
|
||||||
$format_title->setAlign('merge');
|
$format_title->setAlign('merge');
|
||||||
|
|
||||||
|
// Importkonfiguration aus dem CI-Config (application/config/noten.php) lesen, damit nur die
|
||||||
|
// Spalten des jeweils aktiven Importtyps hervorgehoben (grau) werden.
|
||||||
|
$CIS_GESAMTNOTE_NOTENIMPORT = false;
|
||||||
|
$CIS_GESAMTNOTE_PRUEFUNGSIMPORT = true;
|
||||||
|
$notenConfigFile = __DIR__.'/../../../application/config/noten.php';
|
||||||
|
if(is_file($notenConfigFile))
|
||||||
|
{
|
||||||
|
if(!defined('BASEPATH')) define('BASEPATH', true);
|
||||||
|
$config = array();
|
||||||
|
include($notenConfigFile);
|
||||||
|
if(isset($config['CIS_GESAMTNOTE_NOTENIMPORT'])) $CIS_GESAMTNOTE_NOTENIMPORT = $config['CIS_GESAMTNOTE_NOTENIMPORT'];
|
||||||
|
if(isset($config['CIS_GESAMTNOTE_PRUEFUNGSIMPORT'])) $CIS_GESAMTNOTE_PRUEFUNGSIMPORT = $config['CIS_GESAMTNOTE_PRUEFUNGSIMPORT'];
|
||||||
|
unset($config);
|
||||||
|
}
|
||||||
|
|
||||||
|
// plain (non-highlighted) variants used when an import type is disabled
|
||||||
|
$format_plain =& $workbook->addFormat();
|
||||||
|
$format_plain->setAlign('left');
|
||||||
|
$format_plain->setNumFormat(49);
|
||||||
|
|
||||||
|
$format_plainright =& $workbook->addFormat();
|
||||||
|
$format_plainright->setAlign('right');
|
||||||
|
$format_plainright->setNumFormat(49);
|
||||||
|
|
||||||
|
// highlight only the cells belonging to an enabled import flow:
|
||||||
|
// - Notenimport -> Personenkennzeichen + Note (main block)
|
||||||
|
// - Prüfungsimport -> Personenkennzeichen + Datum + Note (Termin2/Termin3 blocks)
|
||||||
|
$fmtNoteImportPkz = $CIS_GESAMTNOTE_NOTENIMPORT ? $format_highlight : $format_plain;
|
||||||
|
$fmtNoteImportNote = $CIS_GESAMTNOTE_NOTENIMPORT ? $format_highlightright : $format_plainright;
|
||||||
|
$fmtPruefImportPkz = $CIS_GESAMTNOTE_PRUEFUNGSIMPORT ? $format_highlight : $format_plain;
|
||||||
|
$fmtPruefImportDate = $CIS_GESAMTNOTE_PRUEFUNGSIMPORT ? $format_highlightright_date : $format_plainright;
|
||||||
|
$fmtPruefImportNote = $CIS_GESAMTNOTE_PRUEFUNGSIMPORT ? $format_highlightright : $format_plainright;
|
||||||
|
|
||||||
$worksheet->write(0,0,$p->t('anwesenheitsliste/notenliste')." ".($sprache=='English'?$lvobj->bezeichnung_english:$lvobj->bezeichnung),$format_bold);
|
$worksheet->write(0,0,$p->t('anwesenheitsliste/notenliste')." ".($sprache=='English'?$lvobj->bezeichnung_english:$lvobj->bezeichnung),$format_bold);
|
||||||
|
|
||||||
$stg_obj = new studiengang($stg);
|
$stg_obj = new studiengang($stg);
|
||||||
@@ -352,13 +385,13 @@ if (!$berechtigung->isBerechtigt('admin')
|
|||||||
$worksheet->write($lines,3,$elem->vorname);
|
$worksheet->write($lines,3,$elem->vorname);
|
||||||
}
|
}
|
||||||
$worksheet->writeString($lines,4,$elem->semester.$elem->verband.$elem->gruppe);
|
$worksheet->writeString($lines,4,$elem->semester.$elem->verband.$elem->gruppe);
|
||||||
$worksheet->write($lines,5,trim($elem->matrikelnr),$format_highlight);
|
$worksheet->write($lines,5,trim($elem->matrikelnr),$fmtNoteImportPkz);
|
||||||
$worksheet->write($lines,6, $note, $format_highlightright);
|
$worksheet->write($lines,6, $note, $fmtNoteImportNote);
|
||||||
|
|
||||||
// Nachprüfung
|
// Nachprüfung
|
||||||
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2)
|
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2)
|
||||||
{
|
{
|
||||||
$worksheet->write($lines,8, trim($elem->matrikelnr), $format_highlight);
|
$worksheet->write($lines,8, trim($elem->matrikelnr), $fmtPruefImportPkz);
|
||||||
$pr = new Pruefung();
|
$pr = new Pruefung();
|
||||||
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $stsem);
|
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $stsem);
|
||||||
$output2 = $pr->result;
|
$output2 = $pr->result;
|
||||||
@@ -366,23 +399,23 @@ if (!$berechtigung->isBerechtigt('admin')
|
|||||||
if ($output2)
|
if ($output2)
|
||||||
{
|
{
|
||||||
$resultPr = $output2[0];
|
$resultPr = $output2[0];
|
||||||
$worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date);
|
$worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $fmtPruefImportDate);
|
||||||
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
||||||
$worksheet->write($lines,10, $resultPr->punkte, $format_highlightright);
|
$worksheet->write($lines,10, $resultPr->punkte, $fmtPruefImportNote);
|
||||||
else
|
else
|
||||||
$worksheet->write($lines,10, $resultPr->note, $format_highlightright);
|
$worksheet->write($lines,10, $resultPr->note, $fmtPruefImportNote);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$worksheet->write($lines,9, '', $format_highlightright_date);
|
$worksheet->write($lines,9, '', $fmtPruefImportDate);
|
||||||
$worksheet->write($lines,10, '', $format_highlightright);
|
$worksheet->write($lines,10, '', $fmtPruefImportNote);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nachprüfung
|
// Nachprüfung
|
||||||
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3)
|
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3)
|
||||||
{
|
{
|
||||||
$worksheet->write($lines,12, trim($elem->matrikelnr), $format_highlight);
|
$worksheet->write($lines,12, trim($elem->matrikelnr), $fmtPruefImportPkz);
|
||||||
$pr = new Pruefung();
|
$pr = new Pruefung();
|
||||||
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $stsem);
|
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $stsem);
|
||||||
$output3 = $pr->result;
|
$output3 = $pr->result;
|
||||||
@@ -390,16 +423,16 @@ if (!$berechtigung->isBerechtigt('admin')
|
|||||||
if ($output3)
|
if ($output3)
|
||||||
{
|
{
|
||||||
$resultPr = $output3[0];
|
$resultPr = $output3[0];
|
||||||
$worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date);
|
$worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $fmtPruefImportDate);
|
||||||
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
|
||||||
$worksheet->write($lines,14, $resultPr->punkte, $format_highlightright);
|
$worksheet->write($lines,14, $resultPr->punkte, $fmtPruefImportNote);
|
||||||
else
|
else
|
||||||
$worksheet->write($lines,14, $resultPr->note, $format_highlightright);
|
$worksheet->write($lines,14, $resultPr->note, $fmtPruefImportNote);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$worksheet->write($lines,13, '', $format_highlightright_date);
|
$worksheet->write($lines,13, '', $fmtPruefImportDate);
|
||||||
$worksheet->write($lines,14, '', $format_highlightright);
|
$worksheet->write($lines,14, '', $fmtPruefImportNote);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -345,11 +345,10 @@ $qry = "SELECT
|
|||||||
WHERE uid=student_uid) as student, tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.semester,
|
WHERE uid=student_uid) as student, tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.semester,
|
||||||
tbl_studiengang.email, tbl_betreuerart.beschreibung AS beutreuerart_beschreibung, tbl_projektbetreuer.stunden
|
tbl_studiengang.email, tbl_betreuerart.beschreibung AS beutreuerart_beschreibung, tbl_projektbetreuer.stunden
|
||||||
FROM
|
FROM
|
||||||
lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektarbeit, lehre.tbl_projektbetreuer, public.tbl_studiengang, lehre.tbl_betreuerart
|
lehre.tbl_lehrveranstaltung, lehre.tbl_projektarbeit, lehre.tbl_projektbetreuer, public.tbl_studiengang, lehre.tbl_betreuerart
|
||||||
WHERE
|
WHERE
|
||||||
tbl_lehreinheit.lehreinheit_id=tbl_projektarbeit.lehreinheit_id AND
|
tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_projektarbeit.lehrveranstaltung_id AND
|
||||||
tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND
|
tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($stdsem)." AND
|
||||||
tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($stdsem)." AND
|
|
||||||
tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND
|
tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND
|
||||||
tbl_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz AND
|
tbl_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz AND
|
||||||
tbl_projektbetreuer.betreuerart_kurzbz=tbl_betreuerart.betreuerart_kurzbz AND
|
tbl_projektbetreuer.betreuerart_kurzbz=tbl_betreuerart.betreuerart_kurzbz AND
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user